레넌의 개발 일기

@EnableJpaAuditing을 분리해야하는 이유 본문

Spring Data

@EnableJpaAuditing을 분리해야하는 이유

brorae 2022. 7. 14. 22:33

JpaAuditing은 무엇일까?

Jpa에서는 Audit이라는 기능을 제공하고 있다. Spring Data Jpa 에서 시간에 대한 값을 자동으로 넣어주는 기능이다.

엔티티를 저장하거나 UPDATE하는 경우, 생성 날짜와 수정 날짜를 입력해주어야하는데, 이를 활용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어준다.

 

예시

1. BaseEntity 생성 후 @EntityListeners(AuditingEntityListener.class) 추가

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

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedDate;
}

@MappedSuperclass - Entity 클래스들이 해당 추상 클래스를 상속할 경우 createdAt, updatedAt을 컬럼으로 인식한다.

 

2. 엔티티 상속

@Entity
public class User extends BaseEntity {
	...
}

3. Application에 @EnableJpaAuditing 추가

@EnableJpaAuditing
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

트랜잭션 커밋 시점에 플러시가 호출될 때, 하이버네이트가 자동으로 시간 값을 채워준다.

 

문제점

하지만 위와 같이 Application에 @EnableJpaAuditing를 추가해주면 Mock 테스트 시, 문제가 발생할 수 있다.

@WebMvcTest(OOO.class)의 Controller Test를 진행할 때 문제가 될 수 있다.

왜냐하면 모든 테스트는 Application 클래스가 항상 로드되면서 실행이 되는데, Auditing 어노테이션이 등록되어 있으면 모든 테스트가 항상 JPA 관련된 빈을 필요로 하고 있는 상태가 되기 때문이다.  @WebMvcTest 어노테이션은 JPA 관련 빈들을 로드하지 않기 때문에 문제가 발생한다.

 

해결 방법

1. @Configuration 파일 분리

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {  
}

2. @MockBean 어노테이션 추가

@WebMvcTest(ArticleController.java)
@MockBean(JpaMetamodelMappingContext.class)
class ArticleControllerTest {
	...
}

 

Repository Test 시 주의점

Configuration으로 Auditing 파일을 분리했다면, Repository 테스트 시에 @DataJpaTest와 함께 @Import(JpaAuditingConfiguration.class) 어노테이션을 붙여주어야한다.

@Import(JpaAuditingConfiguration.class) 어노테이션이 없다면, JpaAuditingConfiguration 파일이 등록되지 않기 때문에, 테스트시 createdAt이나 updatedAt에 등록, 수정 시간이 아닌 null 값이 들어갈 수 있다.

 

1. Import가 있는 경우

Import(JpaAuditingConfig.class) 어노테이션이 있는 경우, 질문 저장 시, createdAt이 정상적으로 저장되는 것을 확인할 수 있다.

 

2. Import가 없는 경우

어노테이션이 없는 경우, 저장을 했음에도 createdAt이 null인 것을 확인할 수 있다.

'Spring Data' 카테고리의 다른 글

영속성 전이 - CascadeType.PERSIST와 CascadeType.REMOVE  (0) 2022.08.17