문제 상황
Spring Boot 애플리케이션에서 H2 메모리 데이터베이스를 사용해 JPA로 테이블을 생성하고, data.sql 파일로 초기 데이터를 삽입하려 했습니다. 하지만 애플리케이션 실행 중 다음과 같은 오류가 발생했습니다.
Table "BOOK" not found (this database is empty)
data.sql이 실행될 때 book 테이블이 아직 생성되지 않아 데이터 삽입에 실패한 것입니다. ddl-auto: create 옵션으로 JPA가 테이블을 자동 생성하도록 설정했지만, data.sql이 실행되는 시점이 JPA 테이블 생성 이전이어서 문제가 발생했습니다.
원인 분석
Spring Boot는 기본적으로 데이터베이스 초기화를 데이터 소스 설정 직후에 실행합니다. 따라서, data.sql이 테이블 생성 이전에 실행되어 테이블이 존재하지 않는 상태에서 데이터 삽입을 시도하는 문제가 발생했습니다.
해결 방법
이 문제를 해결하기 위해 defer-datasource-initialization: true 옵션을 추가했습니다. 이 설정은 Spring Boot 2.5 이상에서 제공되며 데이터베이스 초기화가 JPA에 의해 테이블이 생성된 후에 실행되도록 지연시킵니다.
적용 방법
application.yml에 다음 설정을 추가했습니다:
spring:
jpa:
database-platform: org.hibernate.dialect.H2Dialect
defer-datasource-initialization: true
이 설정으로 인해 JPA가 테이블을 먼저 생성하고, 이후에 data.sql이 실행되어 데이터가 정상적으로 삽입되었습니다.
결과
defer-datasource-initialization: true 옵션을 사용함으로써 테이블이 생성된 후 데이터가 삽입되도록 순서를 맞춰 문제를 해결할 수 있었습니다.
'Spring Framework > 에러 해결' 카테고리의 다른 글
사용자 인증 권한 (0) | 2024.11.29 |
---|