일단 씻고 나가자

[Spring] (java.sql.SQLSyntaxErrorException) Error: 1064-42000: You have an error → 데이터베이스 예약어 본문

Study/고난과 역경 (trouble shooting)

[Spring] (java.sql.SQLSyntaxErrorException) Error: 1064-42000: You have an error → 데이터베이스 예약어

일단 씻고 나가자 2023. 8. 1. 13:18

문제 상황 (에러 본문)

2023-08-01 12:43:35.082  WARN 6544 --- [           main] o.m.jdbc.message.server.ErrorPacket :
Error: 1064-42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'describe varchar(255) not null,
        name varchar(255) not null,
       ...' at line 4
 
Caused by: java.sql.SQLSyntaxErrorException: (conn=156) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'describe varchar(255) not null,
        name varchar(255) not null,
       ...' at line 4
  
2023-08-01 12:43:35.096  WARN 6544 --- [           main] o.m.jdbc.message.server.ErrorPacket : 
Error: 1064-42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'order bigint not null,
        price_consumer bigint not null,
        pric...' at line 4
 
Caused by: java.sql.SQLSyntaxErrorException: (conn=156) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'order bigint not null,
        price_consumer bigint not null,
        pric...' at line 4
 

 
 
 

해결책 (선요약)

데이터베이스에 들어갈 속성(애트리뷰트) 변수명과 DB의 예약어가 충돌했던 문제로,
describe -> explanation, order -> sequenceNum으로 바꾸니 정상 작동했다.
 
 
 


 
 
 

사건 개요

프로젝트를 데이터베이스와 연결하려고 엔티티 클래스를 작성하고 Hibernate로 연결하던 중 위의 에러가 떴다.
 

 
당시 에러를 냈던 엔티티들의 ERD는 다음과 같았는데,
이상하게 User 테이블은 정상 반영되는 반면 Product와 Wait_list 테이블은 등록되지 않았었다.
이유는 데이터베이스의 예약어와 충돌하여 이상이 있는 테이블은 반영되지 않았던 것으로 추정된다.
 
예약어는 쉽게 문법적인 용도로 쓰이는 단어들로, 어떠한 기능을 위해 미리 구현된 단어들이므로 식별자로 사용할 수 없는 단어들을 뜻한다. 예를 들어 프로그래밍 언어에서 return, for 등은 변수명으로 사용할 수 없는 것과 같다.
SQL문에서도 예약어는 존재한다. 흔히 SELECT, WHERE 과 데이터베이스를 정렬할 때 사용되는 'ORDER BY', 내림차순을 의미하는 'DESC' 등의 예약어가 존재한다.
 
먼저 세 테이블 중 하나는 정상 반영된 것으로 보아 hibernate 자체의 문제는 배제했고,
다음으론 엔티티 클래스에서의 어노테이션 등의 구문 작성 자체를 확인해보았더니 문제는 없었다.
에러를 읽어보니 "You have an error in your SQL syntax;" 라는 문구가 눈에 띄었는데
에러 로그를 자세히 살펴봤더니 'near describe/order ...' 으로 시작하여 저 단어 자체에 문제가 있나 생각할 수 있었다.
두 단어의 공통점은 desc, order 모두 DB의 예약어라는 점이었고,
따라서 describe -> explanation, order -> sequenceNum으로 필드명을 바꾸어보았더니 정상 반영되었다.
 
만약 내가 sql 문에 익숙하지 않았다면 해결하지 못했을 에러였을 것 같다..
describe와 order 둘 다 잘 사용할 법한 단어인데 실무에선 대체할 수 있는 어떤 단어로 사용하는지 궁금하다 ? ?