✅ @EnableJpaAuditing ✅ @MappedSuperclass ✅ @CreatedDate ✅ @LastModifiedDate ✅ @CreatedBy ✅ @LastModifiedBy
엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때마다 로그를 뒤지는 것은 시간적으로 비효율적이다.
따라서 강사님은 운영시 편리함을 위해 모든 엔티티에 아래 Auditing을 적용한다고 한다.
@EnableJpaAuditing // 등록일, 수정일 기능 제공
@SpringBootApplication
public class DataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(DataJpaApplication.class, args);
}
// 등록자, 수정자 처리를 위한 AuditorAware 스프링 빈 등록
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}
}
👉 실무에서는 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받음
@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;
}
public class Member extends BaseEntity{
...
}
@Test
public void JpaEventBaseEntity() throws Exception {
//given
Member member = new Member("member1");
memberRepository.save(member); //@PrePersist
Thread.sleep(100);
member.setUsername("member2");
em.flush(); //@PreUpdate
em.clear();
//when
Member findMember = memberRepository.findById(member.getId()).get();
//then
System.out.println("findMember.createdDate = " + findMember.getCreatedDate());
System.out.println("findMember.updatedDate = " + findMember.getLastModifiedDate());
System.out.println("findMember.createdBy = " + findMember.getCreatedBy());
System.out.println("findMember.lastModifiedBy = " + findMember.getLastModifiedBy());
}
실무에서 대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다.
그래서 다음과 같이 Base 타입을 분리하고, 원하는 타입을 선택해서 상속한다.
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
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;
}