티스토리 뷰

반응형

에러 화면

 

 

📌 문제

Hibernate에서 로그를 MySQL처럼 보이게 하기 위해 

spring.jpa.properties.hibernate.dialect=MySQL5InnoDBDialect

H2 메모리 DB에서 Syntax error in SQL statement 에러가 발생했다.
예전에는 이 설정이 잘 동작했는데, 왜 지금은 안 되는 걸까?

H2의 버전 변화와 Hibernate Dialect가 어떻게 작동하는지 정리해본다.

 


 

Spring Boot에서 개발 중, 디버깅을 위해 SQL 로그를 MySQL처럼 출력하고 싶어서 Hibernate Dialect를 다음처럼 설정했다.

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

 

그런데 실행하자마자 다음과 같은 에러가 발생했다.

Syntax error in SQL statement: ... engine=InnoDB ...

 

 


🧠 문제 원인 요약

이 설정은 Hibernate가 SQL을 MySQL 문법으로 생성하게 만든다.

로그는 그럴듯하지만 문제는 실제 DB인 H2가 이 쿼리를 실행할 수 없다는 점이다.

 


 

📜 과거에는 왜 됐을까?

  • 과거 H2 1.4.x에서는 engine=InnoDB 같은 MySQL 문법을 무시하고 실행을 허용
  • 그래서 MySQL5InnoDBDialect로 생성된 SQL도 H2에서 문제없이 실행 가능
  • Hibernate 로그도 깔끔하게 MySQL처럼 보였고 실행도 잘 됐음

🚫 지금은 왜 안 되는가?

  • H2 2.x (예: 2.2.224 이후)부터는 SQL 문법에 훨씬 엄격해짐
  • engine=InnoDB, auto_increment 등은 더 이상 허용되지 않음
  • MySQL 문법을 그대로 H2에 넘기면 SQL 오류 발생

 


💡 대안은?

1. SQL 로그만 MySQL처럼 보기 - 실제 MySQL DB 사용하거나, 로그 스타일을 참조용으로만 보기

2. 실행까지 H2로 하고 싶다면? - H2Dialect 사용 (기본값)

3. 로그는 MySQL처럼, 실행은 H2로? - ddl-auto=none + schema.sql 방식 또는 통합 테스트 시 MySQL 컨테이너 사용(TestContainers)

 

✅ 결론

Hibernate Dialect 설정은 실행 + 로그 출력에 모두 영향을 준다.
MySQL 문법으로 로그를 찍게 되면, 실행도 그 문법으로 하게 되므로
H2에서는 오류가 발생한다.

과거에는 허용됐지만, H2의 버전이 올라가면서 더 이상 되지 않음을 기억하자.

 

 

✚ 참고 링크

 


 

결국

H2 2.x + strict 모드 + MySQL 방언 설정

이 조합이 문제였던 것인데,

 

1. H2가 2.x로 업그레이드되면서

👉 STRICT 모드가 기본 활성화되었고

 

2. 이로 인해 MySQL 전용 문법

  • AUTO_INCREMENT
  • ENGINE=InnoDB
    등을 더 이상 허용하지 않게 되었던 것이다.

3. 그런데 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 옵션을 추가하면
👉 Hibernate는 MySQL 기준의 DDL 문법(AUTO_INCREMENT 등) 으로 쿼리를 생성하게 되고

 

4. 하지만 실제 DB는 H2이고, STRICT 모드가 적용되어 있으므로
👉 MySQL 문법이 포함된 DDL이 오류를 발생시키고 테이블이 생성되지 않았던 것이다.

 

 

 

 

반응형