본문 바로가기
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;

    // 기타 필드 및 메서드
}

 

반응형

댓글