-
Spring Test 환경에서 Audit 적용이 안될 때Spring/Trouble Shooting 2023. 11. 13. 17:13
상황
도메인의 설계 구조를 보고 가자
@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @EntityListeners(AuditingEntityListener.class) public class Question { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //... @Embedded private AuditEntity auditEntity; //... @Builder public Question( //.. ) //... this.auditEntity = new AuditEntity(); } }
Question이라는 도메인에 AuditEntity를 빌더 패턴에서 자동으로 적용되도록 설계 해둔상황이였다.
@Getter @Embeddable public class AuditEntity { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @CreatedDate @Column(updatable = false) private LocalDateTime createdAt; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @LastModifiedDate private LocalDateTime updatedAt; }
적용될 AuditEntity이다.
해당 도메인이 생성된 시간 그리고 수정된 시간을 적용한다.
@Test @DisplayName("작성자 MBTI 검색을 통해 성공한다.") void success_SendMbtiCondition() { //given QuestionSearchParam param = QuestionSearchParam.builder() .sendMbti("ENTP") .build(); //when Page<QuestionResponse> questionResponses = questionRepository.searchWithCondition(pageRequest, param); // 테스트를 위해 출력해본 상황 for (QuestionResponse questionResponse : questionResponses.getContent()) { System.out.println("questionResponse.createdAt() = " + questionResponse.createdAt()); } //then assertThat(questionResponses.getContent().size()).isEqualTo(3); }
Repository를 DataJpaTest를 적용해서 테스트 실행 이전에 값을 저장해두고 해당 테스트는 검색하여 조회하는 코드이다.
테스트 중에 출력을 통해 결과를 임시로 체크하는 중이였는데questionResponse.createdAt() = null
해당 Entity의 생성일이 null로 조회되는 상황이다.
고민 과정
이번 오류는 프로젝트를 직접 처음부터 설계해온 상황이라 시간은 그리 오래 걸리지 않았다.
- @EntityListeners(AuditingEntityListener.class)
- @Embedded
단 두가지 어노테이션이 생각하는 과정에서 떠올랐고 원인을 생각해봤다.
생각의 순서대로 정리해보면
- Embedded는 값이 지정되지 않으면 null로 처리되어 생성된다.
- 그렇다면 AuditEntity는 언제 생성되는가?
- JpaAudit이 적용이 안된건가?
- 그럼 테스트 코드에서 어떻게 사용할 수 있는거지?
해결 방법
고민의 마지막 과정에서 “그럼 테스트 코드에서 어떻게 사용할 수 있는거지?” 라는 고민 중에
@EnableJpaAuditing 어노테이션을 빈으로 등록해줘야 사용이 가능하다는 점을 고려해서AuditEntity가 필요한 테스트에
@Configuration @EnableJpaAuditing public class JpaConfig { }
Configuration으로 선언되어있는 빈을 테스트 코드에 적용시켰다.
@Import(JpaConfig.class) class test클래스명{ //... }
그 결과
questionResponse.createdAt() = 2023-11-13T17:11:40.102776
정상적으로 작성일이 조회되는 것을 확인할 수 있었다.