들어가기 전

이번 포스팅에서는 데이터 접근 계층 테스트 코드를 작성할 때 Auditing이 적용 안 되는 현상에 대해 알아보고 해결하는 방법에 대해 알아보겠습니다.

 

 

필자가 작성한 코드를 먼저 보고 오류 메시지를 확인해 보겠습니다.

 

@EnableJpaAuditing
@Configuration
public class AuditingConfig {

}

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @CreatedDate
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}


@DataJpaTest
class AccountRepositoryTest {

    @Autowired
    private AccountRepository accountRepository;

    @DisplayName("전화번호와 키워드를 통해 회원을 찾을 수 있다.")
    @Test
    void findByPhoneAndKeyword() {
        //given
        String phone = "01012341234";
        String keyword = "keyword";
        LocalTime wakeUpTime = LocalTime.of(9, 0, 0);
        LocalTime sleepTime = LocalTime.of(23, 0, 0);
        Account savedAccount = accountRepository.save(
            Account.singUp(phone, keyword, wakeUpTime, sleepTime));

        //when
        Account findAccount = accountRepository.findByPhoneAndKeyword(phone, keyword).get();

        //then
        Assertions.assertThat(findAccount).isEqualTo(savedAccount);
        Assertions.assertThat(findAccount.getPhone()).isEqualTo(savedAccount.getPhone());
        Assertions.assertThat(findAccount.getKeyword()).isEqualTo(savedAccount.getKeyword());
        Assertions.assertThat(findAccount.getWakeUpTime()).isEqualTo(savedAccount.getWakeUpTime());
        Assertions.assertThat(findAccount.getSleepTime()).isEqualTo(savedAccount.getSleepTime());

    }
}

 

 

오류 메시지

org.springframework.dao.DataIntegrityViolationException:
could not execute statement [NULL not allowed for column "CREATED_AT"; SQL statement:

 

필자는 Jpa에서 제공해 주는 Auditing을 활용하여 생성시간, 수정시간을 자동으로 삽입하게 만들었습니다.

그래서 필자의 상상 속 코딩에서는 정상 동작할 줄 알았으나 created_at 컬럼이 제약조건을 위반하였다 오류 메시지를 접하게 되었습니다.

 

 

오류 원인

필자는 데이터 접근 계층에 대한 테스트 코드에서 @SpringBootTest가 아닌 @DataJpaTest를 활용하여 테스트 코드를 작성했습니다.만약 @SpringBootTest로 하였을 경우 위와 같은 오류 메시지는 발생하지 않습니다.@DataJpaTest로 하였을 때 위와 같은 오류가 발생하는 이유는 @SpringBootTest와 달리 @DataJpaTestBean을 조회를 해올 때 Repository의 Bean만 조회를 해와서 Auditing 설정한 빈을 찾아오지를 못해서 created_at 데이터가 자동 삽입이 되지 않아 제약조건 위반하였다  오류가 발생하는 것입니다. 

 

 

해결 방법

 

@DataJpaTest
@Import(value = AuditingConfig.class)
class AccountRepositoryTest {

    @Autowired
    private AccountRepository accountRepository;

    @DisplayName("전화번호와 키워드를 통해 회원을 찾을 수 있다.")
    @Test
    void findByPhoneAndKeyword() {
        //given
        String phone = "01012341234";
        String keyword = "keyword";
        LocalTime wakeUpTime = LocalTime.of(9, 0, 0);
        LocalTime sleepTime = LocalTime.of(23, 0, 0);
        Account savedAccount = accountRepository.save(
            Account.singUp(phone, keyword, wakeUpTime, sleepTime));

        //when
        Account findAccount = accountRepository.findByPhoneAndKeyword(phone, keyword).get();

        //then
        Assertions.assertThat(findAccount).isEqualTo(savedAccount);
        Assertions.assertThat(findAccount.getPhone()).isEqualTo(savedAccount.getPhone());
        Assertions.assertThat(findAccount.getKeyword()).isEqualTo(savedAccount.getKeyword());
        Assertions.assertThat(findAccount.getWakeUpTime()).isEqualTo(savedAccount.getWakeUpTime());
        Assertions.assertThat(findAccount.getSleepTime()).isEqualTo(savedAccount.getSleepTime());

    }
}

 

 

@Import를 활용하여 Auditing 설정한 빈을 강제로 조회를 하여 Auditing이 정상동작하도록 수정하여 오류를 해결할 수 있습니다.