JWT 기초 강의를 들으면서 코드를 작성하고, H2 Database에 연결을 하려는데 자꾸만 에러가 떴다.
그 해결 과정을 기록해놓으려 한다.
[참고] https://jeongkyun-it.tistory.com/184
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:
1. 첫번째 에러
expected "identifier"; SQL statement:
▷ 원인
H2 Database가 최근 2.1.212 버전부터 'User'가 예약어로 지정되었다고 한다.
따라서 user 라는 이름의 테이블명을 사용할 수 없게 되었는데, 내가 사용하려해서 생긴 문제였다.
▶ 해결
Sol 1 ) H2 버전 낮추기
단순히 User가 예약어로 지정되기 전 버전으로 다운그레이드 해주는 방법
2.1.212 이상 → 1.4.200
Sol 2 ) User 테이블명 끝까지 밀고나가기
예약어와 겹치는 이름이여도 사용할 것이라고 설정해주는 방법
application.yml의 spring-datasource-url에 NON_KEYWORDS=USER 설정을 해준다.
spring:
datasource:
url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER
Sol 3 ) User 테이블명 포기하기
예약어와 겹치는 이름은 그냥 내어주고, 다른 테이블명을 사용하는 방법
User → Users (편-안)
2. 두번째 에러
H2 DB에 data.sql 파일로 초기 데이터를 insert하려는데, 자꾸만 테이블이 없다는 문구가 출력되었다.
nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
▷ 원인
알고보니 Spring Boot 2.5부터는 data.sql이 Hibernate의 초기화 이전에 실행되도록 변경된 것이었다.
따라서 Hibernate의 초기화로 스키마가 생성되고, 거기에 data.sql로 데이터를 채우기 위해서는
application.yml 파일에 다음과 같은 설정을 해줘야 했다.
▶ 해결
application.yml의 spring-jpa에 defer-datasource-initialization: true 설정을 해준다.
spring :
jpa:
defer-datasource-initialization: true
'Spring > Spring Boot' 카테고리의 다른 글
[Spring boot - OAuth2] Google Login 구현 #2 (0) | 2023.02.08 |
---|---|
[Spring boot - OAuth2] Google Login 구현 #1 (0) | 2023.02.02 |
[Spring boot - OAuth2] Kakao Login 구현 #04 (0) | 2022.11.21 |
[Spring boot - OAuth2] Kakao Login 구현 #03 (0) | 2022.11.18 |
[Spring boot - OAuth2] Kakao Login 구현 #02 (0) | 2022.11.17 |