JPA Auditing으로 생성/수정 시간 자동화

rudwnd33·2021년 11월 25일
1

TIL

목록 보기
59/62
post-thumbnail

스프링 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, @LastModifiedDate 이 두 가지만 사용하면 엔티티의 값을 변경했을 때 생성 시간이 null로 변경될 수 있다. 그렇기 때문에 @Column(updatable = false) 애노테이션에 옵션을 줘서 한 번 생성되면 값이 변경되지 않게 하자

profile
열심히!!

0개의 댓글