실무에서는 엔티티를 생성일, 마지막 수정일, 생성자, 마지막 수정자를 추적하는 것이 중요합니다. 이 정보들을 추적하는 것을 Auditing이라고 합니다.
JPA에서는 엔티티에 해당 정보들을 저장할 수 있는 Column들을 생성해서 추적했으며, 재사용에 용이하도록 BaseEntity를 생성해서 했습니다.(더 자세한 내용은: https://velog.io/@k_ms1998/JPA-MappedSuperClass)
이번 포스팅에서는 JPA와 SpringData에서 Auditing 하는 방식을 보고 차이점을 보도록 하겠습니다.
@MappedSuperclass // BaseEntity의 속성들을 상속 받는 엔티티 들이 속성 값들로 가질수 있도록 해줌
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();
}
}
- 생성 날짜(createdDate)는 처음 엔티티 생성 이후에는 변경할 필요가 없으므로, updatable = false로 추후에 변경이 되는 것을 막아줍니다
- @PrePersist: persist가 이루어지기 전에 호출할 메서들을 알려줌으로써, persist가 이루어지기 전에 자동으로 해당 메서드가 호출됩니다.
- @PreUpdate: update 쿼리가 실행이 되기 전에 메서드가 호출되도록 해줍니다
@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass // BaseEntity의 속성들을 상속 받는 엔티티 들이 속성 값들로 가질수 있도록 해줌
public class DataBaseEntity extends DataBaseTimeEntity{
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass // BaseEntity의 속성들을 상속 받는 엔티티 들이 속성 값들로 가질수 있도록 해줌
public class DataBaseTimeEntity {
@CreatedDate
@Column(updatable = false) //해당 값을 한번 생성하면 변할수 없도록 해줌
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
@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());
}
}
SpringData에서 Audinting을 사용하기 위해서는 BaseEntity들에 @EntityListeners(AuditingEntityListener.class)와 Main에는 @EnableJpaAuditing 애노테이션들을 추가해 줘야 합니다.
그리고, 각 BaseEntity에서 @CreatedDate, @LastModifiedDate, @CreatedBy 그리고 @LastModifiedBy 애노테이션들로 Auditing을 구현할 수 있습니다.
결과:
(Team에는 생성일, 수정일 그리고 Member에는 생성일, 수정일, 생성자, 수정자 모두 필요하다고 가정했을때의 경우; BaseEntity와 BaseTimeEntity을 해당 예제처럼 분리해서 사용하면 엔티티에 필요에 따라 Auditing을 할 수 있습니다; 이런식으로 분리하는 것은 JPA에서도 가능)