-
Spring JPA Auditing 사용방법과 주의사항스프링 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를 충족한다.)'스프링' 카테고리의 다른 글
[Spring boot] AWS S3 를 이용한 파일 업로드 (2) 2023.02.16