Hibernate를 사용하여 Spring Boot 프로젝트를 개발할 때, 데이터베이스 테이블 이름이나 컬럼 이름이 SQL 예약어와 겹치는 경우 문제가 발생할 수 있습니다. 예를 들어, user라는 테이블 이름을 사용하면, user는 SQL에서 예약어로 사용되기 때문에 Hibernate가 생성하는 SQL 쿼리에서 오류가 발생할 수 있습니다.
원인
SQL 예약어는 데이터베이스에서 특정한 의미를 가지고 있는 단어들입니다. 예약어를 테이블이나 컬럼 이름으로 사용하면, Hibernate가 자동으로 생성한 SQL 쿼리에서 예약어로 인식되어 충돌을 일으킬 수 있습니다. 예를 들어, user라는 테이블 이름을 사용하면, SQL 쿼리에서 "user"로 감싸지지 않으면 예약어로 간주되어 오류가 발생할 수 있습니다.
해결 방법 1: hibernate.globally_quoted_identifiers 사용
가장 일반적인 해결 방법은 Hibernate 설정에서 hibernate.globally_quoted_identifiers를 true로 설정하는 것입니다. 이 설정은 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;
// 기타 필드 및 메서드
}
'Server > 🌱 Spring Boot (java)' 카테고리의 다른 글
[Spring boot jpa] 연관된 엔티티 불러올때 LazyInitializationException 발생하는 문제 해결 (0) | 2025.01.25 |
---|---|
[Spring boot jpa] 찜/좋아요 삭제시 연관된 엔티티도 같이 삭제되는 문제 해결 (0) | 2025.01.25 |
[Spring boot] DataJpaTest를 이용한 Repository 테스트와 여러 문제 해결 (0) | 2025.01.25 |
[Spring boot] @Scheduled 어노테이션을 사용한 스케줄링이 작동하지 않는 문제 해결 (0) | 2025.01.25 |
[Spring Boot] 멀티-모듈 프로젝트 build시 common 모듈의 의존성 받지 못하는 문제 해결 (0) | 2025.01.24 |
댓글