Auditing

  • 엔티티를 생성, 변경할 때 변경한 사람이나 시간을 추적하고 싶을 때 사용한다.

  • 웬만하면 모든 엔티티에 다 적용해줘야 운영해서 편하다.

순수 JPA 사용

// 상속처럼 프로퍼티를 테이블에서 내려서 쓸 수 있는 애너테이션
// 진짜 상속과는 다르다.
@MappedSuperclass
@Getter
public class JpaBaseEntity {

    // 실수로라도 DB 값이 변경되지 않게 막는다.
    @Column(updatable = false)
    private LocalDateTime createdDate;

    private LocalDateTime updatedDate;

    // 영속화 하기 전에 발생시키는 이벤트
    @PrePersist
    public void prePersist() {
        LocalDateTime now = LocalDateTime.now();
        createdDate = now;
        // 등록과 수정을 처음부터 똑같이 맞춰둔다.
        // 값에 null이 있으면 쿼리가 지저분해질 수 있고 created와 값이 같으면 최초 값이라는 것을 알 수 있어 편하다.
        updatedDate = now;
    }

    @PreUpdate
    public void preUpdate() {
        updatedDate = LocalDateTime.now();
    }
}
  • JPA 주요 이벤트 애너테이션

    • @PrePersist

    • @PostPersist

    • @PreUpdate

    • @PostUpdate

  • JpaBaseEntity만 만들어 놓으면 여러 엔티티에 공통으로 사용할 수 있어 편리하다.

스프링 데이터 JPA 사용

  • 설정

    • 스프링 부트 설정 클래스

      • @EnableJpaAuditing

    • 엔티티

      • @EntityListeners(AuditingEntityListener.class)

  • 사용 애너테이션

    • @CreatedDate

    • @LastModifiedDate

    • @CreatedBy

    • @LastModifiedBy

등록일, 수정일

등록자, 수정자

  • 등록이나 수정할 때마다 auditorProvider 빈을 호출한 뒤 결과물을 채운다.

전체 적용

  • @EntityListeners(AuditingEntityListener.class)를 생략하고 엔티티 전체에 적용한다.

참고

  • 실무에서는 시간은 필요해도 등록자, 수정자는 필요없을 수 있다.

  • 따라서 Base 타입을 분리하고 원하는 타입을 선택해서 상속하면 된다.

Last updated

Was this helpful?