난중(개발)일기/삽질기록
Flyway + test db용으로 h2를 사용할 때 Jpa가 테이블을 못찾을 때
back-end
2023. 2. 24. 01:51
728x90
문제사항 제시
나는 테스트 환경에서 h2 in-memory db를 사용하고 있었다. 통합 테스트를 하려고 했는데 에러가 몇시간 동안 발목을 잡았다.
ddl-auto: validate를 해놓은 상태이고 엔티티와 디비가 맞는지만 확인했다.
그런데 Flyway가 실제 디비에 어떻게 적용시켰는지를 알아야 엔티티를 디비에 맞추든, 디비를 엔티티에 맞추든 할 수 있었다.
(사실 엔티티를 디비에 맞추면 OCP 위반이기 때문에 엔티티를 디비에 맞추어야했다.)
그렇게 하려면 디비의 상황을 알아야 했는데 아무리 h2.console.enabled=true 로 해놓아도 http://localhost:8080/h2 가 열리지 않았다.
해결책 모색
애초에 나는 application-test.yml, application.yml을 나눠놓았다.
그래서 application.yml 에서
spring:
profiles:
active: test
를 하고 애플리케이션을 실행시켜서 h2 console에 들어갈 수 있었다.
그 결과, 실제 어떻게 Flyway가 디비에 적용시켰는지, 왜 jpa가 매핑을 못시키고 있었는지 원인을 알 수 있었다.
원인
테이블들이 기본적으로 uppercase로 적용 되어 있었다.
적용
원인을 해결하기 위해
datasource:
url: jdbc:h2:mem:skka-for-test;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE
결과
맨 뒤에
;DATABASE_TO_LOWER=TRUE
을 추가 해주니까 됐다.