[Spring Boot | 삽질] H2 Database (User Table)
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