개발을 하다보면 DB테이블 마다 꼭 들어가는 4가지 값이 있다.
바로 등록일, 수정일, 등록자, 수정자 이다.
Spring Data JPA에는 이 4가지를 자동으로 관리해주는 기능이 있다.
알아보자!
먼저 순수한 JPA를 사용해서 등록일과 수정일을 관리해보자
@PrePersist, @PreUpdate 애너테이션을 이용해 자동으로 createdData와 udpatedDate를 관리하게 한다.
@MappedSuperclass
@Getter
public class JpaBaseEntity {
@Column(updatable = false)
private LocalDateTime createdDate; //등록일
private LocalDateTime updatedDate; //수정일
@PrePersist
public void prePersist() {
LocalDateTime now = LocalDateTime.now();
createdDate = now;
updatedDate = now;
}
@PreUpdate
public void preUpdate() {
updatedDate = LocalDateTime.now();
}
}
@PrePersist, @PreUpdate외에도 @PostPersist, @PostUpdate 애너테이션을 사용 할 수도 있다.
Member Entity에 아래와 같이 적용 할 수 있다.
이후에 Member Entity를 등록/수정 할 때마다 자동으로 createdData와 udpatedDate가 관리된다.
public class Member extends JpaBaseEntity {}
Auditing 기능을 사용하기 위한 설정 두가지가 있다.
1. @EnableJpaAuditing 애너테이션을 스프링 부터 설정 클래스에 적용해야한다.
2. @EntityListeners(AuditingEntityListener.class)를 Entity에 적용해야 한다.
Spring Data JPA는 Auditing을 위해 BaseEntity에 아래 4개의 애너테이션을 사용한다.
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
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; //수정자
}
코드가 한결 짧아졌다.
추가로 등록자, 수정자를 처리해주기 위해서는 AuditorAware를 Spring Bean으로 등록해야 한다.
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}
위 코드에서는 랜덤 값을 넣었지만 실제로는 세션 정보나 Spring Security에서 로그인 정보를 받아 넣으면 된다.
가끔 등록일, 수정일은 필요하지만 등록자, 수정자는 필요 없을 수 있다.
그럴때는 BaseEntity를 분리하고 원하는 타입만 선택해서 상속하면 된다.
public class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
public class BaseEntity extends BaseTimeEntity {
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
저장시점에서는 등록일==수정일, 등록자==수정자이다. 데이터 중복 같지만 유지보수 관점에서는 이게 더 편리하다.
만약 저장시점에 등록일, 등록자만 입력하고 싶다면 @EnableJpaAuditing(modifyOnCreate = false) 옵션을 사용하면 된다.