스프링 JPA를 사용해 DB에 데이터를 생성한 시간, 수정한 시간을 넣어야 할 때 편한 방법이 있다.
스프링에서 제공하는 JPA Auditing 기능이다.
@Getter
@Setter
@MappedSuperclass // 멤버 변수가 컬럼이 되게 함
@EntityListeners(AuditingEntityListener.class) // 변경 시 자동으로 기록
public abstract class Timestamped {
@CreatedDate // 최초 생성 시간
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate // 최종 수정 시간
private LocalDateTime modifiedAt;
}
최초 생성 시간과 최종 수정 시간 컬럼을 모든 엔티티에 붙이면 귀찮기 때문에 추상 클래스로 하나 만든다.
@MappedSuperclass
는 공통 매핑 정보가 필요할 때, 부모 클래스에 선언하고 속성만 상속 받아서 사용하고 싶을 때 사용한다.
@EntityListeners
는 엔티티를 DB에 적용하기 이전 또는 이후에 커스텀 콜백을 요청하려고 할 때 사용한다.
EntityListener 클래스에 적용한 이벤트는 다음 시점에 호출된다.
@PostLoad
: 해당 엔티티를 새로 불러오거나 refresh 한 이후.
@PrePersist
: 해당 엔티티를 저장하기 이전
@PostPersist
: 해당 엔티티를 저장한 이후
@PreUpdate
: 해당 엔티티를 업데이트 하기 이전
@PostUpdate
: 해당 엔티티를 업데이트 한 이후
@PreRemove
: 해당 엔티티를 삭제하기 이전
@PostRemove
: 해당 엔티티를 삭제한 이후
참고: https://erim1005.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%80%EA%B2%BD-%EC%95%8C%EB%A6%BC-EntityListeners
@CreatedDate
는 Entity가 생성되어서 저장될 때의 시간이 자동으로 저장된다.
@LastModifiedDate
는 Entity의 값을 변경할 때의 시간이 자동으로 저장된다.
@CreatedDate
만 사용하면 엔티티의 값을 변경했을 때 첫 생성 시간이 변경될 수 있다. 그렇기 때문에@Column(updatable = false)
애노테이션에 옵션을 줘서 한 번 생성되면 값이 변경되지 않게 하자