[Spring] JPA 테이블 생성 오류 - via JDBC You have an error in your SQL syntax

via JDBC [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 / [Failed to open the referenced table 'member'] 에러 원인 및 해결 방법
Hi's avatar
May 25, 2024
[Spring] JPA 테이블 생성 오류 - via JDBC You have an error in your SQL syntax

✅ 테이블을 생성하는 방법

테이블을 생성하는 방법은 여러가지가 있다.
  1. SQL문으로 테이블 직접 생성
  1. 시각화 도구로 테이블 생성 (ex. MySQL Workbench)
  1. ORM을 사용해서 테이블 생성
 
JPA는 이 중에서 ORM을 사용하여 테이블을 생성하는 방법에 속한다.
 
쉽게 말하자면, Java 언어로 클래스를 만들고 데이터 소스를 연결하면, 연결되어 있는 DB에 알아서 테이블을 생성해준다. 이때, 각 속성에 대해 여러 제약조건을 추가할 수 있다.
 
 

✅ 제약 조건

JPA를 사용하면 자바 클래스의 각 속성에 @Column 어노테이션을 통해 아래와 같은 제약조건을 설정할 수 있다.
  • Primary Key
  • Not Null
  • Unique
  • Length
  • name
 

✅ 에러 내용

여러 테이블 중, member 테이블을 아래와 같이 정의했다.
@Entity @Getter @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @EqualsAndHashCode(callSuper = true) @Table(name = "member") public class Member extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, length = 20) private String name; @Enumerated(EnumType.STRING) @Column(columnDefinition = "varchar", length = 10) private Gender gender; private Integer age; @Column(nullable = false, length = 40) private String address; @Column(name = "spec_address", nullable = false, length = 40) private String specAddress; @Enumerated(EnumType.STRING) @Column(columnDefinition = "varchar", length = 15) private MemberStatus status; @Column(name = "inactive_data") private LocalDate inactiveDate; @Enumerated(EnumType.STRING) @Column(name = "social_type", columnDefinition = "varchar", length = 10) private SocialType socialType; @Column(nullable = false, length = 50) private String email; private Integer point; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List<MemberAgree> memberAgreeList = new ArrayList<>(); @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List<MemberPrefer> memberPreferList = new ArrayList<>(); @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List<Review> reviewList = new ArrayList<>(); @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List<MemberMission> memberMissionList = new ArrayList<>(); }
 
Member class는 다른 테이블과 연관관계가 설정되어 있으며, @Column 어노테이션을 통해 여러 제약조건을 설정한 것을 확인할 수 있다.
 
이렇게 테이블을 정의하고 실행하였는데 아래와 같은 에러가 발생했다.
notion image
alter table review add constraint FKk0ccx5i4ci2wd70vegug074w1 foreign key (member_id) references member (id)" via JDBC [Failed to open the referenced table 'member'] org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " alter table review add constraint FKk0ccx5i4ci2wd70vegug074w1 foreign key (member_id) references member (id)" via JDBC [Failed to open the referenced table 'member'] at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:94) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createForeignKeys(SchemaCreatorImpl.java:303) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:250) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:172) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:142) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:118) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:256) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:145) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] ...
 
로그를 해석하면 review 테이블이 member 테이블과 1:N 연관관계가 설정되어 있었는데, member 테이블이 생성되지 않아서 참조할 수 없어 에러가 발생했다는 내용이었다.
 
처음엔 구글링과 GPT를 통해 에러의 원인을 찾았다.
 
구글에서 check라는 예약어로 인해 에러가 발생했다는 글을 보고, 혹시 MySQL의 예약어를 사용했나? 싶었다. 하지만 예약어를 찾아봤는데 나는 사용하지 않았다.
 
그렇게 몇 시간이 흐르고…
 

✅ 에러의 원인 발견

로그를 보던 중, JPA로 인해 자동으로 생성된 member 테이블 생성 SQL문을 보았는데 뭔가 이상한 점을 발견했다.
 
notion image
 
찾았는가?
 
gender, social_type, status는 모두 내가 만든 Enum 타입으로 정의되어 있었다. 분명 length를 지정해주었는데 varchar밖에 나타나지 않은 것을 확인할 수 있었다.
→ 원래라면 varchar(10) 이런 식으로 나왔어야 했다!!
 
알고 보니,
notion image
Enum 타입을 사용하면 columnDefinition을 varchar로 설정할 때 length를 따로 설정하면 안 되고 아래와 같이 설정해야 했다!!
notion image
 
문제가 있던 Enum 타입의 속성들을 이렇게 전부 바꾸고 실행한 결과..
테이블 생성 SQL문이 정상적으로 작성된 것을 확인할 수 있었다. 휴우..!
notion image
 
 

✅ 결론

JPA로 Enum 타입을 저장하고 싶을 때 길이를 length=10 이런식으로 설정하지 말고, columnDefinition=”varchar(10)” 이렇게 설정하자.
 
 
Share article

soultree