Auditing란 스프링 데이터 JPA에서 시간에 대해서 자동으로 값을 넣어 주는 기능이다. Entity 클래스를 구현할 때 보통 등록일, 수정일은 필수 값으로 들어간다. 이러한 등록일, 수정일을 여러 클래스에서 따로 구현할 필요 없이 공통 클래스에서 등록일 수정일을 스프링 데이터 JPA가 자동으로 값을 넣어주는 편리한 기능이다.
@Getter
@MappedSuperclass
public class JpaBaseEntity {
@Column(updatable = false)
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
@PrePersist
public void prePersist(){
LocalDateTime now = LocalDateTime.now();
this.createdDate = now;
this.updatedDate = now;
}
@PreUpdate
public void preUpdate(){
this.updatedDate = LocalDateTime.now();
}
}
@Entity
public class Member extends JpaBaseEntity {
}
@EnableJpaAuditing // Auditing 설정
@SpringBootApplication
public class DataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(DataJpaApplication.class, args);
}
@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass
public class BaseEntity{
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
@CreatedBy
@Column(updatable = false)
private String createBy;
@LastModifiedBy
private String lastModifiedBy;
}
@EntityListeners(AuditingEntityListener.class)
를 설정해줘야 한다.@EnableJpaAuditing
@SpringBootApplication
public class DataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(DataJpaApplication.class, args);
}
@Bean
public AuditorAware<String> auditorProvider(){
return ()->Optional.of(UUID.randomUUID().toString());
}
}
등록자, 수정자를 처리해주는 AuditorAware
를 스프링 빈으로 등록해야 한다. 실무에서는 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받는다.
@Entity
public class Member extends BaseEntity {
}
참고: 실무에서 대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다. 그래서 다음과 같이 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;
}