[이슈해결] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'option

MinSeong Kang·2022년 9월 6일
1

이슈해결

목록 보기
4/12

최근에 Spring MVC를 이용하여 프로젝트를 진행하는 도중에, 엔티티 수정이 크게 있었다. 따라서 모든 기능 개발을 멈추고 다같이 엔티티 수정을 하였다.

변경사항

  • 다대다 관계를 이어주는 중간 연관 테이블의 이름 수정하기 위해 엔티티 수정 (사이에 And 추가)

ex) Cart 엔티티와 Option 엔티티의 중간 테이블 엔티티 : 기존) CartOption -> 수정) CartAndOption

  • MenuOption 엔티티를 Option 엔티티로 변경

MenuOption이라는 이름이 길어 간단하게 Option으로 엔티티명 변경, 그에 따른 Controller, Service, Repository 명 변경

  • 요구 사항 변경으로 엔티티 추가

Option에 대해서 제한조건이 필요하다고 생각이 들어, OptionGroup 엔티티를 만들고 Option과 OptionGroup을 다대다로 설정 (OptionAndOptionGroup 중간 테이블 엔티티 추가)

예외 발생

위 3가지를 전부 변경하고 연관관계도 정확히 확인 후 어플리케이션을 실행시켰는데, 총 14개의 테이블이 만들어져야하는데 13개의 테이블밖에 만들어지지 않았다. 로그를 확인해본 결과, 아래와 같은 오류가 났었다.

어떠한 이유 때문에, Option이라는 테이블이 만들어지지 않았던 것이다.

우리는 당연히 엔티티 설계를 잘못했거나, 엔티티끼리 연관관계를 만들어줄 때 잘못 설정을 했다고 생각이 들어 모든 엔티티를 검토하고, 미리 설계한 erd와 비교하며 오류를 찾고자 했다. 하지만 무슨 오류인지 찾을 수 없었는데, 다른 팀원이 자신의 로컬 환경에서 같은 코드를 실행했을 때, 옵션 테이블이 문제없이 잘 만들어졌다.

에러의 이유를 곰곰히 생각해보고 위 에러를 구글링을 해도 단순히 sql syntax 에러라는 해결책만 나왔다.
근데 문득!! option이라는 게 mysql의 예약어가 아닐까 라는 생각이 들었다.
우리 프로젝트 엔티티 중 order라는 엔티티는 실제 order가 mysql의 예약어로 되어있어 엔티티 명을 order로 하되 @Table 어노테이션을 통해 테이블명을 order이 아닌 orders로 변경하여 만들어주었다.

역시나 구글에 mysql의 예약어를 찾아보니 option이 포함되어 있었다. - mysql 예약어 목록 참고

해결방법

option이 mysql의 예약어이기 때문에 엔티티명은 option으로 하되, @Table 어노테이션을 통해 테이블명을 options로 변경해주었더니 options 테이블이 잘 생성되는 것을 확인할 수 있었다.

@Entity
@Table(name = "Options")
public class Option {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "OPTIONS_ID")
    private Long id;

    private String name;
    private int price;
}

만약 Option 엔티티를 연관관계로 설정되어 있는 엔티티에서는
아래와 같이 private Option option이 아닌 private Option options로 연관관계 매핑을 해주어야 한다.

@Entity
public class OptionAndOptionGroup {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "OPTIONS_OPTIONGROUP_ID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "OPTIONS_ID")
    private Option options;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "OPTIONGROUP_ID")
    private OptionGroup optionGroup;
}

0개의 댓글