Entity를 생성하거나 변경할 때, 각각의 시간과 담당자를 추적할 필요가 있다.
그렇게 위해선 Entity마다 필요에 따라 등록일, 수정일, 등록자, 수정자 이 네 가지 속성을 가져야 한다.
이때 공통적인 속성
을 모두 가지는 클래스를 설계하면 간단히 해결할 수 있다.
@MappedSuperclass
@Getter
public class BaseEntity {
@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();
}
}
@Entity
@Getter
public class Member extends BaseEntity { ... }
@MappedSuperClass
updatable = false
@PrePersist
@PreUpdate
Spring Data JPA가 제공하는 기능을 이용한다면 더 편리하게 기능을 구현할 수 있다.
우선 기본 설정을 불러올 수 있게 애노테이션을 추가해 주자.
@SpringBootApplication
@EnableJpaAuditing
public class SpringApplication {
public static void main(String[] args) {
SpringApplication.run(SpringApplication.class, args);
}
}
@EntityListeners(AuditingEntityListener.class) // 이벤트가 발생할 때 호출해 줄 Listener 클래스 지정
@MappedSuperclass
@Getter
public class BaseEntity {
@CreatedDate // 등록 날짜를 나타내는 필드로 선언
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate // 수정 날짜를 나타내는 필드로 선언
private LocalDateTime lastModifiedDate;
}
@Entity
@Getter
public class Member extends Entity { ... }
대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다.
그래서 아래와 같이 Base 타입을 분리
하고, 원하는 타입
을 선택해서 상속
해 보자
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;
}
저장 시점에 등록일, 등록자는 물론이고, 수정일, 수정자도 같은 데이터가 저장된다.
데이터가 중복 저장되는 것 같지만, 변경 컬럼만 확인해도 마지막에 업데이트한 유저를 확인할 수 있으므로 유지 보수 관점에서 편리하다.
이렇게 하지 않으면 변경 컬럼이 null 일 때 등록 컬럼을 또 찾아야 한다.
@EnableJpaAuditing(modifyOnCreate = false)
옵션을 사용