Spring Data JPA - Auditing
소개
우리 서비스가 엔티티를 생성/변경할 때, 아래와 같은 변경한 사람과 시간을 추적하고 싶으면 어떤 방법을 이용해야 할까?
- 등록일
- 수정일
- 등록자
- 수정자
이를 애플리케이션 서비스 레이어에서 직접 저장할 수 있겠지만, 지정한 필드가 특정 시점에 값을 저장하도록 자동으로 설정하고 싶을 수 있다.
보통은 이런 로깅 작업은 도메인(비즈니스) 로직이라기 보단, 인프라를 위한 로직에 가깝다.
이때 스프링 Data JPA는 메소드를 만들어서, 특정 시점에 해당 필드에 값을 자동으로 대입하는 작업을 지원한다.
이와 같이 변경/수정 이력을 감사한 로그를 Audit Log라 하고,
이와 같은 감사 로그를 데이터를 자동으로 넣어주는 것을 Auditing이라고 한다.
Auditing 적용
그럼 이제 Spring Data JPA에서 지원하는 Auditing 기능에 대해 알아보자.
공통 사전 설정
@EnableJpaAuditing

우선, Jpa 의 감사모드를 켜야 한다.
JPA가 이 옵션을 켜지 않고도 자동으로 Auditing을 수행하려 한다면, JPA는 무거워지고 사람들이 기피할 것이다.
내가 잘 안쓰는 기능을 쓰려고 할 땐, 기본적으로 그 옵션이 기본으로 on인지 확인하자.
이를 스프링부트 config 클래스에 적용해야 한다.
@EntityListeners(AuditingEntityListener.class)

감사를 저장할 BaseEntity 클래스 위에, 엔티티가 Auditing 받는다는걸 선언한다.
이를 통해 JPA는 해당 엔티티를 감시 리스트에 추가하게 된다.
이는 감사를 받는 모든 엔티티가 가지고 있어야 하므로, 감사 데이터를 저장하는 BaseEntity에 지정한다.
감사 로그는 보통 상속을 통해 저장받기 때문에, 다음과 같이
@MappedSuperclass도 함께 지정한다.
만약 상속이 아닌 직접 저장하게 하고 싶다면,@MappedSuperclass없이 해당 엔티티에 직접@EntityListeners어노테이션을 지정해주면 된다.
간편한 Auditing 저장 어노테이션
스프링 데이터 JPA Audit은 자주 사용되는 Audit 데이터에 대한 다음 네가지 기본 형식을 어노테이션으로 지원한다.
@CreatedDate: 생성 시점@LastModifiedDate: 수정 시점@CreatedBy: 생성자@LastModifiedBy: 수정자
다음 네가지 어노테이션을 사용하는 방법을 알아보자.
@CreatedDate

생성 시점을 저장한다.
위 코드에서는 LocalDateTime을 사용하고 있지만, Instant와 같은 에포크 시 기준도 사용 가능하다.
다만 이때 DB에서 이를 어떤 타입으로 저장하는지는 따로 알아둬야 한다(2038 문제).
@LastModifiedDate

마지막 변경 시점을 저장한다.
이 또한 다양한 타입을 지원한다.
등록자, 수정자 사전 설정
이제 등록자/수정자를 저장하는 방법을 알기 전에, 먼저 등록자/수정자를 어떻게 저장하는지를 Auditing 시스템에 알려야 한다.
이는 다음과 같이 스프링 빈 auditorProvider으로 지정할 수 있다.

Spring Data JPA는 등록자, 수정자 처리용 AuditorAware 메소드 or 구현체를 빈에 등록하는 것을 지원한다.

실무에서는 다음과 같이 세션 정보나 스프링 시큐리티 로그인 정보에서 ID를 가져와서 저장하기도 한다.
@CreatedBy
위에서 생성자/수정자를 저장하는 법을 알려줬으니, 이제 어노테이션으로 그 정보를 간편하게 저장해보자.

이는 생성 시점에 해당 필드에 값을 저장한다.
즉, AuditorAware 메소드를 수행한다.
@LastModifiedBy

이 어노테이션은 업데이트 시점에 해당 필드에 값을 저장한다
이 어노테이션도 똑같이 AuditorAware 메소드를 실행한다.
Audit 사용

Audit을 사용할 땐, 해당 BaseEntity를 상속받아서 기능을 사용한다.
실무에서는 등록자, 수정자가 반드시 필요하진 않을 수 있기 때문에, BaseEntity 와 BaseTimeEntity 를 분리해서 사용한다.
엔티티가 지나치게 무거워져 잘 쓸일은 없겠지만, 만약 전체 엔티티에 Auditing 적용하고 싶다면,
- META-INF/orm.xml 에 옵션을 지정하거나
- 복사/붙여넣기 해서
쓸 수 있다.