오늘은 개인 프로젝트를 진행하다가 발생한 이슈에 대해서 정리해보고자 합니다.
개발을 하다보면 더미 데이터가 필요합니다.
Springboot에서는 Load시 main/resources안에 있는 data.sql을 읽어 설정된 DB에 Insert시킵니다.
그런데 빌드도중 갑자기 Table을 찾을 수 없다면서 Error가 발생하는 것이었습니다. 😱
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "POST" not found; SQL statement:
🧐 문제인식
처음에는 datasource에 초기 스키마가 먼저 저장되어야 하는데 initialization설정을 하지 않았나? 하고 의심해보았지만 정상적으로 설정이 되어있었습니다.
jpa:
defer-datasource-initialization: true
우선 이전에는 발생하지 않았던 이슈라 최근 변경한 코드들을 확인해 보았습니다.
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
범인은 dialect설정때문이었습니다 (잡았다 요놈..)
에러가 발생한 테스트케이스들을 살펴보니 모두 @DataJpaTest를 사용하는 클래스에서 발생한 것이었습니다. 이때까지만 해도 @DataJpaTest를 사용하는 이유는 JPA 테스트를 할때 많이들 사용하는 애노테이션이라고만 알고있었습니다. 즉 자세히 알지 못했던 것이었죠.. 그래서 이번 기회에 학습을 해보겠습니다.
DataJpaTest란?
JPA구성 요소에만 초점을 맞춘 테스트 애노테이션으로서, JPA 테스트에 필요한 것만 적용됩니다.(참고)
특징
- Transcational을 내부적으로 가지고있어 테스트 종료 시 롤백됩니다.
- 또한 내부적으로 메모리DB를 사용함에따라 별도의 DB를 사용하고 싶다면 @AutoConfigureTestDatabase를 설정해야 합니다.
- SQL쿼리를 기록하는 설정이 기본값이며 이를 비활성화할 수 있습니다.(spring.jpa.show-sql : false)
- JUnit4에서는 @RunWith(SpringRunner.class)와 함께 사용해야 합니다.
대충 눈치 채셨나요? 바로 @AutoConfigureTestDatabase 때문이었습니다.
즉 dialect를 변경함으로서 @DataJpaTest에서 사용하는 메모리 DB를 사용하지 못하게됨으로써 발생한 문제였습니다.
해결과정
원인을 알게되었으니 그럼 해결을 해보도록 하겠습니다.
일단 @DataJpaTest의 내부를 살펴보면 @AutoConfigureTestDatabase 가 설정되어있는 것을 확인할 수 있습니다.
AutoConfigureTestDatabase 내부로 들어가보면 Replace.ANY값으로 기본값이 설정되어있는 것을 확인할 수 있습니다.
@PropertyMapping(skip = SkipPropertyMapping.ON_DEFAULT_VALUE)
Replace replace() default Replace.ANY;
Any는 기본적으로 내장된 데이터베이스를 사용하는 설정임으로 NONE으로 변경하여 application.yml설정으로 동작하도록 해야합니다.
따라서 @DataJpaTest를 사용한 부분에 AutoConfigureTestDatabase 설정을 추가해보겠습니다.
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
해당 설정이 완료된 후 Build를 하면 모든 테스트 케이스가 정상적으로 동작하는 것을 확인하실 수 있습니다.
'프로젝트 > ClimbLabs' 카테고리의 다른 글
AWS EC2 서버 생성 및 설정방법 (0) | 2021.12.14 |
---|
댓글