스프링

Spring JPA Auditing 사용방법과 주의사항

binaryyoung 2023. 1. 28. 14:10

JPA 는 Auditing(감시)이라는 기능을 제공하는데, JPA 엔티티의 변경을 감시하여 생성, 수정과 관련된 데이터를 자동으로 넣어주기 때문에 구현 시 이와 관련된 코드 작업을 줄일 수 있어 편리하다.

1. BaseEntity

생성,수정 시간은 여러 엔티티에 공통으로 사용되는 경우가 많으므로 별도의 클래스를 선언하고, 엔티티는 이 추상클래스를 확장하여 사용한다.

import java.time.LocalDateTime;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

		@CreatedDate
		private LocalDateTime createdDate;
		@LastModifiedDate
		private LocalDateTime updatedDate;
}
  • @MappedSuperclass: Entity들의 공통된 필드를 사용할 때 사용하며, @MappedSuperclass 어노테이션이 달린 클래스는 엔티티가 아니고 클래스 내에 선언된 필드를 제공할 뿐이다.
  • @EntityListners(AuditingEntityListner.class) : Entity를 DB에 적용하기 이전과 이후에 커스텀 콜백을 요청할 수 있게 한다. 여기선 Auditing 기능을 추가하였다.
  • @CreatedDate : Entity 생성 시간을 자동으로 저장
  • @LastModifiedDate: Entity 값 수정한 시간 자동 저장
  • @CreatedBy: Entity 생성자 자동 저장
  • @LastModifiedBy: Entity 수정자 자동 저장

2. Entity

위에서 만든 클래스를 해당 필드가 필요한 엔티티에 extends 한다.

@Entity
public class Member extends BaseEntity{
    private Long id;
		private String name;
}

 

3. @EnableJpaAuditing

@EnableJpaAuditing : Jpa Auditing 기능을 사용하겠다라는 설정을 해주어야 한다.

@EnableJpaAuditing
@Configuration
public class JpaAuditingConfig {
}

@SpringBootApplication 이 붙은 스프링 부트 메인 클래스에 @EnableJpaAuditing 를 사용하면 스프링 컨테이너가 필요한 테스트를 할 때 아래와 같은 에러가 발생하므로 별도 설정파일로 분리해서 사용하자.

(추가 : 아래 오류가 발생하는 이유는 스프링 의존이 필요한 테스트를 할때 메인클래스가 로딩될 때 @EnableJpaAuditing 가 붙어 있으면 JPA 관련 빈을 불러와야 하는데 mock 테스트를 할 때 해당 빈이 없어서 호출 할 수 없기 때문이다. JpaMetamodelMappingContext를 mockbean으로 등록시켜도 오류를 해결할 수 있지만, 테스트에 필요없는 mockbean을 등록시키는 건 테스트 의도와 맞지 않을 뿐더러 Jpa 설정을 메인 클래스에서 분리시키는 게 SRP를 충족한다.)