개발 일지/Spring

data.sql 초기화 설정 후 Error creating bean with name 'dataSourceScriptDatabaseInitializer' 에러

미숫가루설탕많이 2023. 5. 27. 10:07

 진행 중인 프로젝트에서 데이터 값을 초기 설정하고 싶어서 data.sql을 만들고 설정을 해줬더니 이런 에러가 발생했다.

data.sql Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource

Table "SKILL_STACK" not found; SQL statement:

 

해결 과정

 

시도 1.

 테이블이 없다?.. yml 파일에 ddl-auto를 create로 설정해줬는데 그럼 테이블이 생겨야 하는 거 아닌가.. 라는 생각에 mysql을 확인해보니 테이블은 있었다.

 

 직접 쿼리를 작성해서 테이블을 만들어주고 ddl-auto를 update로 변경 후 재실행했다. -> 실패

 

시도 2.

 찾아보니까 스프링부트가 2.4에서 2.5  버전으로 올라가면서 data.sql 스크립트가 hibernate 초기화 전에 실행되기 때문에 에러가 발생하는 것이라고 한다. 따라서 yml에 spring.jpa.defer-datasource-initialization 값을 true로 설정해줬다.

 

 아마 해당 에러가 발생하는 분들은 대부분 이 설정에서 해결될 것 같다.

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

 

 

 

해결

 하지만 나는 시도 2번 과정을 진행했지만 여전히 에러가 발생했다. 다른 테이블은 다 있는데 SKILL_STACK 테이블은 없다라..

Cause: java.sql.SQLSyntaxErrorException: Table 'SKILL_STACK' doesn't exist

 

 문제는 data.sql 파일에 있었다.

// 변경 전
INSERT INTO SKILL_STACK (SKILL_NAME) VALUES ('Java');

// 변경 후
INSERT INTO skill_stack (SKILL_NAME) VALUES ('Java');

 

mysql에 저장되어 있는 테이블은 skill_stack 이지만 쿼리에는 SKILL_STACK으로 보냈던 것이다. 다시 테이블명을 소문자로 입력해서 해결했다.

 

 역시 에러는 정말 간단한 곳에서 발견되는 것 같다.

 

 

 

 


 에러를 해결하고 보니 서버를 실행할 때마다 data.sql의 쿼리가 적용돼서 똑같은 데이터들이 식별자 값만 바뀌고 추가로 저장되는 것을 확인했다.

 

 H2 같은 데이터베이스를 사용하거나 새로 실행할 때마다 초기화 되어야하는 환경이 아니면 굳이 data.sql이 필요할까? 굳이 쿼리문에 조건을 달아서 부담을 더해주는 것보다는 필요한 stub 데이터는 직접 넣어주면 되지 않을까? 라는 생각이 들어서 지금 프로젝트 파일에는 data.sql 설정을 빼줬다.