서론
jwt 인증 공부 중 다음과 같은 에러를 만났다.
해당 에러를 해결하는 과정과 발생한 이유에 대해 간략히 정리해놓으려 한다.
사용 기술 스택
- Spring Boot: version 2.7.0
- Spring Data JPA
- Spring Security
- Lombok
- Spring Web
- H2 Database
에러 문구
Error creating bean with name 'dataSourceScriptDatabaseInitializer' ...
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/C:/Users/jkan/Desktop/JAVA_Intellij/jwt-study/jwt-study/build/resources/main/data.sql]: INSERT INTO USERS (USER_ID, USERNAME, PASSWORD, NICKNAME, ACTIVATED) VALUES (1, 'admin', '$2a$08$lDnHPz7eUkSi6ao14Twuau08mzhWrL4kyZGGU5xfiGALO/Vxd5DOi', 'admin', 1); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement: ...
[1번 에러 발생 케이스]
H2 Database가 2.1.212 버전에서 user 키워드가 예약어로 지정되어 해당 버전 이후부턴 user라는 테이블 생성이 이제 안된다.
h2 버전의 이유라면 다음과 같이 3가지 방법으로 해결할 수 있다.
방법 1.
H2 Database Version을 2.1.212 ---> 1.4.200으로 변경.
방법 2.
properties.yml의 url에 NON_KEYWORDS=USER 설정 추가
spring:
datasource:
url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER
방법 3.
테이블 이름 변경
> Table이름을 User -> Users로 변경.
> data.sql의 user -> users로 변경.
[2번 에러 발생 케이스]
2.4 버전 이후로 hibernate 초기화 과정이 변동되었다.
SpringBootApplication을 구동하는 과정 중에서 data.sql을 초기화하는 과정 중간에 Users 테이블을 찾을 수 없어 Insert 구문에서 오류가 발생하는 것이다.
Spring Boot 2.5버전부터 스크립트 기반 초기화의 동작과정을 Flyway와 일치시키기위해서 data.sql은 Hibernate 초기화 되기 전에 실행되는 내용이 추가되었다.
따라서, Hibernate 초기화를 통해 생성된 스키마에다가 데이터를 채우기 위해서 data.sql이 실행되기를 원한다면 위의 이미지와 같이 application.yml(properties)에 아래의 문구를 추가하여야 한다.
spring :
jpa:
defer-datasource-initialization: true
이제 다시 실행해보자.
마무리
다음과 같이 1,2번 케이스를 진행해보면 다음과 같은 에러를 해결 할 수 있을 것이다 생각합니다. 혹시 다음과 같이 하고서도 안되는 부분이 있다면 댓글 부탁드리겠습니다.
댓글