들어가기 전

이번 포스팅에서는 데이터 접근 계층 테스트 코드를 작성할 때 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이 정상동작하도록 수정하여 오류를 해결할 수 있습니다.

댓글

댓글을 사용할 수 없습니다.