JPA 는 ORM 으로써 내부적으로 별도로 선언하지 않은 부분에 대해서 자동으로 만들어준다는 점에 의해서 굉장히 예쁘고 사랑스럽지만 종종 개같은 경우를 만들 때가 있다.
그 중 하나가 미리 예약된 예약어 같은 케이스인데, 그런 예약어를 보게 된다면 아래와같은 에러를 마주칠 수가 있다.
로그를 한땀한땀 해석해보자면, GenerationTarget (생성하려는 대상)이 명령어를 수용하는 도중에 예외에 맞닥들였다는 것이다. 특히 이 부분에서 DDL "alter table if exists group_users add constraint xxxx" 라고 나오는데 문제가 되는 부분이 바로
"group_users" 가 되시겠다.
group 은 사실 스프링 예약어라기 보다는 SQL 에서 예약된 예약어로써 다들 알다시피 group by 에서 납치해다 쓰는 경우가 많은데, 이 때문에 생성하면서 alter table 로 외래키 제약조건을 생성하려다가 망할놈의 에러를 만난 것이다
그래서 어떻게 해결하는데?
약 2가지 정도의 해결 방법이 떠오르는데, 첫번째 방법은 그냥 감싸주는 것이다.
@Entity
@Table(name = "article")
public class Article {
@Id
private Long id;
private String title;
private String description;
@Column(name = "\"group\"")
private String group;
}
예를 들어 내부에 정의된 속성 중 group 이라는 놈이 걸릴꺼니까 저렇게 감싸버리고, 그리고 다른 경우에 Entity 하위에 나와같이 Table 명 자체를 group으로 주고 싶은 경우에는 @Table(name = "\"group\"") 과 같이 주면 되겟다.
그런데 이 짓거리를 언제 다 하냐 이말이지.
그래서 나온 것이 application.properties 쪽이나 yml 에서 떄려잡는 것이다.
spring:
jpa:
properties:
hibernate:
globally_quoted_identifiers: true # 이 설정을 추가해준다.
show_sql: true # 쿼리를 출력해준다.
format_sql: true # 쿼리를 예쁘게 출력해준다.
generate_statistics: true # 쿼리 수행 통계를 확인할 수 있다.
properties 쪽에서 때려잡은 나는 아랫쪽의 것을 사용해줫다
# 이 설정을 추가해준다.
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
# 참고로 아래 설정은 실행된 SQL 쿼리를 출력해준다.
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
# 쿼리 수행 통계를 확인할 수 있다.
spring.jpa.properties.hibernate.generate_statistics=true
결론 = 데이터베이스 예약어나 키워드를 Entity 가 정의된 클래스에서 사용하지 말자
'Java > Spring Boot JPA' 카테고리의 다른 글
[Slack] 2.10.0 은 작동하지 않는다 -> 1.30.0 으로 납치 (0) | 2023.07.20 |
---|---|
HOw to resovle Cannot resolve table 'user_group' (0) | 2023.07.19 |
[Slack] Integration Slack API (0) | 2023.07.14 |
[JPA] SQL N/A statement / MySQL 1064 & 42000 (0) | 2023.07.11 |
ElasticSearch with Spring Data JPA (1) | 2023.06.14 |