데이터베이스

[DB / H2] spring.jpa.properties.hibernate.globally_quoted_identifiers=true 설정

syj0522 2024. 11. 26. 00:55

설명

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의 테이블, 컬럼명이 만들어지는 것은 아니다.