Framework & Library/Spring

[SpringBoot/JPA] org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "테이블 이름" not found (this database is empty)

sechoi 2023. 2. 5. 00:49

문제 상황

- 연결 된 데이터베이스에 해당 테이블이 존재하는 것을 확인함

- 하지만 스프링부트 실행 시 제목과 같이 해당 테이블이 데이터베이스에 존재하지 않는다는 에러를 띄웠다

 

해결 과정

구글링 결과

  1. application.yaml에서 spring.jpa.defer-datasource-initialization을 true로 설정한다 (스프링부트 2.5 버전 업데이트 문제)
  2. 테이블의 이름이 예약어(ex. user)이거나 대소문자가 다른지 확인한다

두 가지 해결 방법을 찾았지만 소용이 없었다. 이미 1, 2번이 모두 해결 된 상황에서 에러가 발생했기 때문이다.

 

결국 교수님 찬스를 써서 원인을 알아냈다. 테스트 코드에 있던 @DataJpaTest 때문이었다. 해당 어노테이션에 대한 설명을 보면 다음과 같은 문구가 있다.

By default, tests annotated with @DataJpaTest are transactional and roll back at the end of each test. They also use an embedded in-memory database (replacing any explicit or usually auto-configured DataSource). The @AutoConfigureTestDatabase annotation can be used to override these settings.

 

해당 어노테이션은 @AutoConfigureTestDatabase을 포함하는데 이 어노테이션은 테스트용 데이터베이스를 사용하도록 한다. 테이블은 로컬 mysql 서버에 생성하고 select 쿼리는 테스트용 데이터베이스에 날렸으니 테이블이 없다고 나올 수 밖에... 어쩐지 에러 로그에 h2가 왜나오나 했다.

 

따라서 @AutoConfigureTestDatabase(replace = Replace.NONE) 을 추가해줬다. 아예 application.yaml에 spring.test.database.replace=none 을 추가해도 된다는데 나는 해당 property가 없다고 안된다.