@Getter
@MappedSuperclass // 속성(컬럼)을 상속 해준다. 빠지면 테이블을 생성할 때 해당 속성이 생성되지 않는다.
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();
}
}
@PrePersit
를 적용하면 값이 저장(save)될 때 자동으로 실행된다.@PreUpdate
를 적용하면 값이 수정(update)될 때 자동으로 실행된다.
테스트 코드
@Test public void JpaEventBaseEntity() throws InterruptedException { //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.getCreatedDate = " + findMember.getCreatedDate()); System.out.println("findMember.getUpdatedDate = " + findMember.getUpdatedDate()); }
수정일과 생성일 속성이 자동으로 생성되고 값이 정상적으로 들어갔다.
Data JPA 사용시 Application 클래스에 @EnableJpaAuditing
을 꼭 써줘야 작동한다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
@Column(updatable = false) // 생성일은 수정 못하게 하기
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
@CreatedDate
가@PrePersist
밑에 구현한 기능을 자동으로 지원해준다.@LastModifiedDate
가@PreUpdate
밑에 구현한 기능을 자동으로 지원해준다.
@CreatedBy
@Column(updatable = false) // 생성자는 수정 못하게 하기
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
해당 코드를 BaseEntity 클래스에 추가하면 된다.
@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());
}
}
auditorProvider 메서드를 구현하여 그 안에서 세션이나 쿠키(jwt를 사용하면 토큰 정보)를 사용하여 값을 반환하면 된다.
보통 생성일, 수정일은 모든 테이블에서 사용하지만 생성자, 수정자는 사용하지 않을 경우가 많다. 그렇다면 어떻게 해야할까?
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
@Column(updatable = false) // 생성일은 수정 못하게 하기
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
BaseTimeEntity 클래스에 생성일, 수정일을 따로 만들어주고
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity extends BaseTimeEntity{
@CreatedBy
@Column(updatable = false) // 생성자는 수정 못하게 하기
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
BaseEntity에 생성자, 수정자를 만들어주고 BaseTimeEntity를 상속해준다.
이렇게 하면 생성일, 수정일만 필요한 엔티티는 BaseTimeEntity를 상속하면 되고 모두 필요한 엔티티는 BaseEntity를 상속하면 된다.