설명
Spring Boot에서 embadded database(h2 등)을 쓸 때 ddl-auto를 사용하면 hibernate가 자동으로 쿼리를 만들어준다. 이때 설정으로 spring.jpa.properties.hibernate.globally_quoted_identifiers=true를 켜두면 hibernate가 ddl, dml을 생성할 때 테이블명/컬럼명을 백틱(`) 또는 쌍따옴표(")로 감싸서 생성한다. (dbms에 따라 사용되는 기호는 다름)
ddl은 ddl-auto 옵션(update, create 등)에 따라 애플리케이션이 처음 실행될 때 한 번만 실행된다. hibernate가 스키마를 생성하거나 수정할 때 사용되는 명령어이다.
dml은 entity mananger의 영속성 컨텍스트에서 엔티티의 변경사항을 감지하면 hibernate가 만드는 쿼리이고, 쿼리 저장소에 저장된다.
이 설정이 필요한 상황
- 식별자명이 dbms의 예약어와 겹칠 때
만약에 dbms 예약어로 'USER'가 등록되어 있다면, SQL에서 테이블명이나 컬럼명으로 'USER'을 사용할 때 오류가 발생할 것이다.
#오류
create table user (
...
);
그런데 백틱으로 식별자를 감싸서 SQL을 생성하면 실행할 때 'USER'을 예약어가 아닌 테이블명으로 인식하여 정상 실행된다.
#정상 실행
create table `user` (
...
);
참고 : hibernate의 ddl-auto SQL 생성 규칙
hibernate가 ddl-auto로 SQL을 생성할 때 Java의 엔티티/멤버 이름을 SQL의 테이블/컬럼명으로 바꾸는데, 기본적인 규칙이 있다. CamelCase를 snake_case로 바꾸는 것이다.
#엔티티 CamelCase
createAt
#SQL SankeCase
create_at
spring.jpa.properties.hibernate.globally_quoted_identifiers=true 설정을 켜두더라도 이 기본 규칙은 적용된 채로 SQL문이 만들어진다. 개발자가 지정한 엔티티, 멤버명 그대로 SQL의 테이블, 컬럼명이 만들어지는 것은 아니다.
'데이터베이스' 카테고리의 다른 글
[DB / Error] @DataJpaTest 사용 시 org.springframework.beans.factory.UnsatisfiedDependencyException 에러 (0) | 2024.11.26 |
---|---|
[DB / 테스트] @DataJpaTest (0) | 2024.11.26 |
[DB / Error] Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a (0) | 2024.11.25 |
[DB] Error / engine[*]=InnoDB"; expected "identifier";] (0) | 2024.11.24 |
[DB / MySQL] Index의 동작 원리 (0) | 2024.07.11 |