티스토리 뷰
📌 문제
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의 버전이 올라가면서 더 이상 되지 않음을 기억하자.
✚ 참고 링크
- https://stackoverflow.com/questions/72402946/h2-auto-increment-not-working-after-update-from-1-4-200-to-2-1-212
- https://h2database.com/html/features.html#compatibility
결국
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이 오류를 발생시키고 테이블이 생성되지 않았던 것이다.
- Total
- Today
- Yesterday
- 해커랭크
- 22 정보처리산업기사
- Java
- 자바
- 22 정보처리 산업기사
- BAEKJOON
- 정보처리산업기사
- 소스코드
- 해커랭크 자바
- 해커랭크 자바 챌린지
- JPA
- 챌린지
- 정보처리 산업기사
- 그리디
- 강의
- 백준
- challenges
- 해커랭크 챌린지
- 정보처리산업기사 공부법
- queue
- hackerrank
- MSA
- 나동빈
- 코드
- 자바의 정석
- ORM
- Spring Security
- 이코테
- hackerrank challenges
- 디버깅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |