본문 바로가기
Spring/Spring Boot

[Spring Boot | 삽질] H2 Database (User Table)

by seoyamin 2023. 1. 20.

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