공부/Spring

JPA data.sql로 초기화 시 에러 해결방법 Error creating bean with name 'dataSourceScriptDatabaseInitializer'

2021. 8. 29. 00:10

spring에서 jpa를 사용 시 @Entity 어노테이션을 사용하면 ddl이 자동으로 생성되고(모드 설정 가능) 초기 데이터 생성을 위해 resource 디렉토리 아래 data.sql 파일을 insert 문을 넣어 사용하곤 한다.

이렇게 줄곧 사용해 왔으나 최근에 갑자기 에러를 마주하게 되었고 간신히 해결하게 되어 그 해결 방법을 기록하기로 했다.

 

스프링 버전이 올라가면서 생긴 문제로 2.4 버전에선 잘 되던 것이 같은 방법으로는 2.5에는 에러가 났다.

 

먼저 스프링 부트 2.4 버전을 보면 아래와 같다.

Member클래스에 @Entity 어노테이션을 사용하여 members 테이블을 자동 생성하게 하였다.

그리고 초기 데이터를 넣기 위해 data.sql에 다음과 같이 insert문을 작성하였다.

 

실행을 해보면 정상적으로 되고 db에도 데이터가 잘 생성된 것을 확인할 수 있다.

 

그리고 문제가 되었던 2.5 버전이다.

동일한 코드에도 이렇게 에러가 발생한다.

 

결론은 스프링 2.5에서 SQL Script DataSource Initialization의 기능이 변경되면서 발생된 문제였다.

스프링 2.5 릴리즈 노트에는 다음과 같은 문구가 있었다.

 

Hibernate and data.sql
By default, data.sql scripts are now run before Hibernate is initialized. This aligns the behavior of basic script-based initialization with that of Flyway and Liquibase. If you want to use data.sql to populate a schema created by Hibernate, set spring.jpa.defer-datasource-initialization to true. While mixing database initialization technologies is not recommended, this will also allow you to use a schema.sql script to build upon a Hibernate-created schema before it’s populated via data.sql.

이제 data.sql 스크립트는 hibernate가 초기화되기 전에 실행되며 hibernate에 의해 생성된 스키마에 데이터를 넣기 위해 data.sql을 사용하고 싶으면 spring.jpa.defer-datasource-initialization 이 값을 true로 하라고 되어있다.

(단, 데이터 데이터 초기화 기술을 섞는 것을 추천하지는 않는다고 되어있다.)

 

그래서 application.property에 값을 추가하였고 정상적으로 실행되는 것을 확인하였다.

data.sql이 잘 살행 되어 db에 값이 들어가 있는 것을 확인하였다.

 

긴 시간 동안 고민하던 문제를 해결하였으나 데이터 초기화 기술을 섞어서 쓰지 않는 것을 추천한다고 하니 다른 대안을 고민해봐야겠다.

끝.

 

 

 

참조 : 스프링 부트 2.5 릴리즈 노트 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes#hibernate-and-datasql

 

 

 

 

반응형