본문 바로가기
Server/🌱 Spring Boot (java)

[Spring boot] SQL 예약어와 테이블 이름 충돌 문제 해결

by 코딩하는 동현 2025. 1. 25.

 

Hibernate를 사용하여 Spring Boot 프로젝트를 개발할 때, 데이터베이스 테이블 이름이나 컬럼 이름이 SQL 예약어와 겹치는 경우 문제가 발생할 수 있습니다. 예를 들어, user라는 테이블 이름을 사용하면, user는 SQL에서 예약어로 사용되기 때문에 Hibernate가 생성하는 SQL 쿼리에서 오류가 발생할 수 있습니다.


원인

 

SQL 예약어는 데이터베이스에서 특정한 의미를 가지고 있는 단어들입니다. 예약어를 테이블이나 컬럼 이름으로 사용하면, Hibernate가 자동으로 생성한 SQL 쿼리에서 예약어로 인식되어 충돌을 일으킬 수 있습니다. 예를 들어, user라는 테이블 이름을 사용하면, SQL 쿼리에서 "user"로 감싸지지 않으면 예약어로 간주되어 오류가 발생할 수 있습니다.

 

 

해결 방법 1: hibernate.globally_quoted_identifiers 사용

가장 일반적인 해결 방법은 Hibernate 설정에서 hibernate.globally_quoted_identifierstrue로 설정하는 것입니다. 이 설정은 Hibernate가 자동으로 테이블과 컬럼 이름을 큰따옴표(")로 감싸도록 하여 예약어와의 충돌을 방지할 수 있습니다.

 

설정 방법

 

application.yml 또는 application.properties 파일에 다음과 같이 설정을 추가합니다.

spring:
  jpa:
    properties:
      hibernate:
        globally_quoted_identifiers: true

이렇게 설정하면 Hibernate가 모든 테이블 및 컬럼 이름을 자동으로 큰따옴표로 감싸기 때문에, 예를 들어 user라는 테이블 이름도 "user"로 감싸져서 SQL 쿼리에서 예약어로 인식되지 않게 됩니다.


해결 방법 2: @Column 어노테이션을 활용한 이름 변경

hibernate.globally_quoted_identifiers를 사용하는 방법 외에도, @Column 어노테이션을 사용하여 테이블의 컬럼 이름을 명시적으로 지정할 수 있습니다. 이 방법은 특정 테이블이나 컬럼에 대해 예약어 충돌을 방지할 수 있습니다.

 

예를 들어, User라는 엔티티의 user라는 필드를 사용한다고 가정했을 때, @Column 어노테이션을 이용해 컬럼 이름을 바꿀 수 있습니다.

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "\"user\"")  // 예약어와 충돌하지 않도록 큰따옴표로 감싸기
    private String userName;

    // 기타 필드 및 메서드
}

 

반응형

댓글