본문 바로가기

Spring Framework/JPA

(4)
[JPA] Note2. @BaseTimeEntity Refactoring Note1. @BaseTimeEntity 대부분의 Entity에는 created_at, updated_at column이 포함되어 있다. 이러한 생성/수정일자를 관리하는 방식은 여러가지로 개인 프로젝트에서도 아래와 같이 User Entity는 JPA Auditing 기능을 사용하고 Problem Entity에는 생성자에서 생성/수정 일자를 초기화하는 등 여러 방식이 혼합되어 있었다. 하지만 이는 코드 일관성과 유지보수 측면에서 좋지 않은 코드이고 이러한 생성/수정 일자를 한 곳에서 일괄적으로 관리하기 위해 JPA는 BaseTimeEntity라는 어노테이션을 제공한다. User Entity @CreatedDate @Column(name = "created_at", updatable = fal..
[JPA] Note1 @EnableJpaAduting @EntityListeners Note1. JPA Auditing JPA (Java Persistence API)에서 제공하는 Auditing 기술로 엔터티의 생성/수정 시점을 자동으로 추적 및 기록해 준다. JPA Auditing 기능을 사용하면 getter/setter로 매번 직접 시간을 설정하지 않아도 되고 반복되지 않은 간결한 코드를 작성 가능하다는 장점이 있다. Note2. @EnableJpaAduiting- 애플리케이션 전체에서 JPA Auditing 기능을 활성화한다. - 주로 메인 클래스에 선언하며, 한 번 선언하면 Spring Framework가 자동으로 관련 빈을 등록한다. Note3. @EntityListeners(AuditingEntityListener.class)- 엔터티 레벨에서 JPA Auditing 기..
[JPA] @Transactional 트랜잭션이란?트랜잭션은 데이터베이스의 상태를 변경시키는 더 이상 쪼개질 수 없는 최소한의 작업 단위이다. 회원가입을 예시로 들어보자. 다음 예제는 총 4가지 작업으로 구성된다. 1. validateUserUniqueness - 사용자 이름과 이메일이 디비에서 중복되지 않는지 검사한다. 2. encodePassword - 패스워드를 암호화한다. 3. 유저 객체를 생성한다. 4. 유저 레포지토리에 저장한다. public User createUser(String username, String password, String email) { validateUserUniqueness(username, email); String encodedPassword = passwordEnco..
[JPA] Embedded, Embeddable annotation & Refactoring Example About Embedded TypeEmbedded란 JPA 표준에서 "객체 지향적인 방식으로 데이터베이스 구조를 설계할 수 있도록 도와주는 어노테이션이다."하나의 데이터 모델 엔터티 내부의 컬럼을 재사용 가능한 클래스 단위로 묶어 관리할 수 있게 해 준다. 별도의 테이블을 생성하지 않으며, 같은 테이블에 필드들을 포함한다. 이해를 돕기 위해 현재 진행중인 알고리즘 대회 사이트 프로젝트의 ERD를 가져와 보았다. 제출(submissions), 문제(problems), 테스트케이스(test_cases) 테이블에서 (생성일자, 수정일자) 컬럼이 반복돼서 사용되는 상황이다.따라서 createdAt, updatedAt Column을 Embeddable Class로 분리하여 재사용 가능한 구조로 변경해 보고자 한다..