0. 현상
2023-04-16 14:44:22.108 INFO 7672 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
...
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
...
Hibernate:
create table user ( id bigint not null, email varchar(255) not null, password varchar(255) not null, role varchar(255) not null, username varchar(255) not null, primary key (id) ) Hibernate: alter table user add constraint UK_ob8kqyqqgmefl0aco34akdtpe unique (email)
...
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a drop table if exists [*]user CASCADE "; expected "identifier"; SQL statement:
...
스프링 서버를 기동 시킬 때, org.hibernate.dialect.Dialect를 처리하는 과정에서 예외가 발생했다. Hibernate 처리 과정을 명확하게 보기위해 application.properties에 다음과 같은 설정을 추가한다.
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show_sql=true
그러면 위와 같이 Hiberanate에서 처리해주는 SQL 문들을 확인할 수 있다. 반복해서 CREATE TABLE USER 를 호출하는 것으로 보아 USER 테이블에서 오류가 발생한 듯 하다.
1. 문제 원인
테이블 User를 생성하는 과정에서 문제가 발생했다. 본 프로젝트에서는 H2 Database를 사용하고 있었으며 User 테이블을 생성하는 과정에서 문제가 발생했따.
H2 DB는 2.1.212 버전에서 user 키워드가 예약어로 지정되어 있는 탓에 user 테이블 생성이 불가능하다.
2. 해결 방법
- User 테이블 명을 Users로 변경하기
@Table(name = "users")
- application.properties의 url에 NON_KEYWORDS=USER 설정 추가
spring.datasource.url=jdbc:h2:mem:springcore;NON_KEYWORDS=USER;
- H2 DB 버전 하향 : 2.1.X -> 1.4.200
3. 결론
H2의 예약어인 user와 테이블명 user의 충돌로 인해 발생한 문제이다. user 키워드를 제외해 버리거나 버전을 하향시키는 것보다도 간단히 User 테이블 명을 지정해 주는 것이 H2의 기능과 버전 관리를 해치지 않을거란 판단에 간단하게 테이블명만 변경해주기로했다.
'오류 > 스프링 오류' 카테고리의 다른 글
[스프링 오류] Spring Boot 빌드 오류 (0) | 2023.03.28 |
---|