ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
    

    정상적으로 작성일이 조회되는 것을 확인할 수 있었다.

    댓글

Designed by black7375.