[Spring] @DataJpaTest에서 Auditing 적용 안되는 현상
들어가기 전
이번 포스팅에서는 데이터 접근 계층 테스트 코드를 작성할 때 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와 달리 @DataJpaTest는 Bean을 조회를 해올 때 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이 정상동작하도록 수정하여 오류를 해결할 수 있습니다.
'Spring Boot' 카테고리의 다른 글
[RabbitMQ] RabbitMQ 개념 및 Spring 연동 (0) | 2024.09.18 |
---|---|
[Spring] Checked Exception, Unchecked Exception의 트랜잭션 처리 방식 (2) | 2024.06.26 |
[Spring] 나태지옥에 빠지지 않기 위한 스케줄러 (1) | 2024.04.07 |
[Spring Boot] Spring Boot + Kotlin + AWS S3를 이용한 이미지 다루는 방법 (0) | 2024.03.18 |
[Spring Boot] Spring Security + Kotlin + JWT를 이용한 로그인 (0) | 2024.03.12 |
댓글
이 글 공유하기
다른 글
-
[RabbitMQ] RabbitMQ 개념 및 Spring 연동
[RabbitMQ] RabbitMQ 개념 및 Spring 연동
2024.09.18 -
[Spring] Checked Exception, Unchecked Exception의 트랜잭션 처리 방식
[Spring] Checked Exception, Unchecked Exception의 트랜잭션 처리 방식
2024.06.26 -
[Spring] 나태지옥에 빠지지 않기 위한 스케줄러
[Spring] 나태지옥에 빠지지 않기 위한 스케줄러
2024.04.07 -
[Spring Boot] Spring Boot + Kotlin + AWS S3를 이용한 이미지 다루는 방법
[Spring Boot] Spring Boot + Kotlin + AWS S3를 이용한 이미지 다루는 방법
2024.03.18