Blog

DataJpaTest에서 생성일이 null로 조회될 때

생성일만 비어 있었습니다

Question에 생성·수정 시각을 담는 AuditEntity를 포함했습니다. 빌더로 질문을 만들 때 AuditEntity도 함께 생성하도록 해 두었습니다. 아래는 당시 필요한 부분만 발췌한 코드입니다.

Java
@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();  
	
	}  
}

AuditEntity는 생성일과 수정일을 기록하는 값 객체입니다.

Java
@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;  
}

@DataJpaTest를 사용하는 저장소 테스트에서 데이터를 미리 저장한 뒤 검색 결과를 임시로 출력해 보다가 생성일이 비어 있는 걸 발견했습니다.

Java
@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);  
}
questionResponse.createdAt() = null

객체 생성과 Auditing 설정을 나눠 봤습니다

먼저 @EntityListeners(AuditingEntityListener.class)와 @Embedded를 의심했습니다. 값 객체가 생성되지 않은 것인지, 생성은 됐지만 Auditing이 적용되지 않은 것인지 확인할 필요가 있었습니다.

AuditEntity는 언제 생성될까요? 빌더에서 만들고 있다면 객체는 생겼을 테니 JPA Auditing이 적용되지 않은 문제일 수 있었습니다. 그렇다면 테스트에서는 Auditing을 어떻게 활성화해야 할까요?

설정 클래스를 테스트에 가져왔습니다

프로젝트에는 다음 설정이 있었습니다.

Java
@Configuration  
@EnableJpaAuditing  
public class JpaConfig {  
}

이 설정을 Auditing이 필요한 테스트에 명시적으로 가져왔습니다.

Java
@Import(JpaConfig.class)  
class test클래스명{
//...
}

그 뒤로는 출력에 생성일이 찍혀 나왔습니다.

questionResponse.createdAt() = 2023-11-13T17:11:40.102776

이 사례에서는 엔티티나 빌더는 그대로 두고 테스트가 사용하는 컨텍스트에 Auditing 설정만 넣어서 해결했습니다.