에러로그:
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a drop table if exists [*]user CASCADE "; expected "identifier";
상황설명:
User.java
안에 @Entity 와 @Table(name = "user")
로 설정되어있고, data.sql
에 insert into user (~) values (~)
라고 되어있는 상태로 Spring Boot 서버를 실행했을 때 위 오류가 발생했다.
(Spring Boot 2.7.7 버전, h2database 2.1.214 버전 사용중)
찾아본 내용:
일반적인 원인은 예약된 키워드를 식별자로 사용하는 것이다.
알고보니 H2가 1.x.x에서 2.x.x로 올라오면서 'user'라는 키워드가 h2의 예약어로 사용되는 것이다.
해결방법:
1. 테이블 이름을 예약어가 아닌 것으로 @Table(name = "member")
처럼 변경하면 된다.
2. application.yml(properties) 파일에 spring.datasource.url
을 jdbc:h2:mem:testdb;NON_KEYWORDS=USER
와 같이 NON_KEYWORDS=USER
를 추가해서 h2에게 예약어가 아님을 명시해준다.
3. h2database 버전을 1.4.200 으로 낮춰서 사용한다.
참조:
https://www.h2database.com/html/advanced.html#keywords
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Release-Notes#h2-21
https://www.baeldung.com/spring-boot-h2-jdbcsqlsyntaxerrorexception-expected-identifier