[ 김영한 스프링 데이터 JPA #8 ] Auditing

김수호·2024년 6월 4일
0
post-thumbnail

일반적으로 DB 테이블을 설계할 때, 데이터에 대한 (등록일 / 수정일), 더 나아가 (등록자 / 수정자) 컬럼을 포함하는 경우가 많다. 해당 컬럼을 추가함으로써 서비스 운영시 데이터를 추적하거나, 문제가 발생했을 때 원인을 찾는데 이점이 있기 때문이다.

그런데 그렇게 되면, 모든 엔티티에 위 컬럼에 해당하는 정보들이 들어가고, 등록이나 수정이 발생할 때 마다, 해당 필드에 값을 넣어주는 로직이 필요할 것이다.

JPA 는 이를 위해 Auditing 이라는 편의를 제공한다.

먼저 예시를 확인해보기 전에, (등록일 / 수정일) 을 가지는 모든 엔티티에 해당 변수들을 중복해서 작성하는 것은 효율적이지 않다. 따라서 중복되는 필드를 별도의 클래스로 분리해서 각 엔티티에서 상속받고, @MappedSuperclass 를 통해 공통 매핑 정보로 사용되도록 했다.

@MappedSuperclass
public class BaseEntity {

    @Column(updatable = false)
    private LocalDateTime createdDate;
    private LocalDateTime lastModifiedDate;
}

public class Member extends BaseEntity {

    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String username;
}

 

스프링 데이터 JPA 를 통해 Auditing 을 적용하기 위해서는 다음 두 설정이 필요하다.

  • @EnableJpaAuditing : 스프링 부트 설정 클래스에 적용
    • @EnableJpaAuditing 라는 애노테이션을 적용해야 Auditing 기능이 동작한다.
    • 참고) 빈으로 등록한 AuditorAware 는 ( 등록자 / 수정자 ) 처리를 위해 필요하다.
      • 등록되거나 수정될 때 마다 @CreatedBy@LastModifiedBy 에서 해당 메서드를 호출해서 결과물을 꺼내간다. 따라서 실무에서는 위 예시처럼 UUID 가 아닌, 현재 사용자의 세션 정보 등에서 적절한 값을 반환하면 된다.
    • 참고) 저장 시점에는 저장 데이터만 입력하고 싶으면 @EnableJpaAuditing(modifyOnCreate = false) 옵션을 사용하면 된다.
  • @EntityListeners(AuditingEntityListener.class) : 엔티티에 적용
    • 참고) 용도에 따른 사용 애노테이션은 다음과 같다.
      • 등록일 ( @CreatedDate )
      • 수정일 ( @LastModifiedDate )
      • 등록자 ( @createdBy )
      • 수정자 ( @LastModifiedBy )
    • 참고) (등록일 / 수정일) 의 경우 활용도가 높아 여러 테이블에 적용될 수 있지만, (등록자 / 수정자) 까지 관리하는 경우는 빈번하지 않다. 따라서 이 둘은 클래스를 분리했다. ( 참고로 애노테이션이 중복이 있는 부분은 수정이 필요할 수 있다. 적용시 참고하여 확인해보자. )

이제 필요한 엔티티에서 이것들을 상속해서 사용하면 된다.


강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.

profile
현실에서 한 발자국

0개의 댓글