엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면 어떻게 해야 할까?
등록일, 수정일, 등록자, 수정자.. 등이 있다고 생각하자.
순수 JPA를 사용한 BaseEntity 구현
JpaBaseEntity 클래스 JPA의 @MappedSuperclass를 사용하여 생성일과 수정일을 추적할 수 있다.
@MappedSuperclass는 속성만을 상속하는 방법으로, 실제 상속과 구분된다.
@MappedSuperclass
@Getter
public class JpaBaseEntity {
@Column(updatable = false)
private LocalDateTime createdDate;
private LocalDateTime updateDate;
@PrePersist
public void prePersist() {
LocalDateTime now = LocalDateTime.now();
createdDate = now;
updateDate = now;
}
@PreUpdate
public void preUpdate() {
updateDate = LocalDateTime.now();
}
}
이 클래스는 @PrePersist와 @PreUpdate 어노테이션을 사용하여 엔티티가 저장되기 전과 업데이트되기 전에 자동으로 날짜를 설정한다.
2023.09.30 - [JPA/ORM 표준 JPA 기본] - 고급매핑 - 상속관계 매핑, @MappedSuperclass
위 글에서 상속과 @MappedSuperclass에 대해 자세히 작성했으니 참고하면 좋을 것 같다.
Spring Data JPA를 사용한 BaseEntity 구현
Spring Data JPA를 사용하면 생성일, 수정일, 생성자, 수정자를 보다 쉽게 추적할 수 있다.
BaseEntityConfig 클래스
ComponentScan이 되는 클래스에다가 @EnableJpaAuditing를 꼭 붙여줘야 한다.
@EnableJpaAuditing
@Configuration
public class BaseEntityConfig {
// 수정과 생성이 될때마다 해당 메서드 호출
@Bean
public AuditorAware<String> auditorProvider() {
// 지금은 UUID이지만, 실제 개발에선 spring Securitycontextholder 에서 값을 꺼낸다.
return () -> Optional.of(UUID.randomUUID().toString());
}
}
BaseEntity 클래스
@MappedSuperclass와 @EntityListeners를 사용하여 BaseEntity를 구현한다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
이렇게 하게 되면, 실제로 생성일, 수정일, 생성자, 수정자가 모두 생성된다.
BaseEntity 분리
하지만 실무에서 이 4개의 컬럼이 모두 필요한 게 아니라, 시간 컬럼만 필요하다면 어떻게 할까?
정말 간단하게 생각하면 된다. 쪼개면 된다.
보통 생성 시간과 수정 시간은 모두 사용하므로 BaseTimeEntity를 생성 후에, 이를 상속받는 BaseEntity를 두고 필요한 걸 골라쓰면 된다.
BaseEntity를 분리한다.
BaseTimeEntity 클래스
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
분리 후 작성자와 수정자를 갖는 BaseEntity 클래스
BaseTimeEntity를 상속받아 사용자 정보를 추가하는 BaseEntity를 구현합니다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity extends BaseTimeEntity{
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
이렇게 구현함으로써, 필요에 따라 BaseTimeEntity 또는 BaseEntity를 상속받아 사용할 수 있다.
이 방식을 통해 다양한 요구사항에 유연하게 대응할 수 있으며, 엔티티의 생성 및 변경 시점과 사용자를 효과적으로 추적할 수 있다.
'JPA > Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] 6. 사용자 정의 Repository. DI 활용 (0) | 2023.11.24 |
---|---|
[Spring Data JPA] 5. JPA Hint & Lock (0) | 2023.11.23 |
[Spring Data JPA] 4. @EntityGraph (0) | 2023.11.23 |
[Spring Data JPA] 3. 벌크성 수정 쿼리 (0) | 2023.11.23 |
[Spring Data JPA] 2. Spring Data JPA Paging (0) | 2023.11.23 |