DEV-STUDY/Spring

[트러블슈팅] InvalidDataAccessResourceUsageException : expected "identifier";

HwangJerry 2023. 11. 6. 21:11

질문받았던 에러를 기록한다.

 

JPA를 활용하여 개발을 하다가 제목과 같은 SQL Error가 발생하였고, 문제의 SQL은 다음과 같다.

SQL statement:
insert into like (artist,date_time,item_id,item_name,raffle_state,user_id,venue,like_id) 
values (?,?,?,?,?,?,?,default)

 

이것과 유사한 에러를 나도 처음 마주했던 때를 생각하면, 도대체 SQL을 자동으로 완성해주는 data JPA를 사용했는데도 SQL Error가 뜬다는 것이 이해가 되지 않았었다.

 

사실 위 SQL문을 블로그에서 보면 문제가 뭔지 바로 보이긴 한다. 문제는 자바 코드를 기반으로 생성된 SQL 문에서 like 와 같은 SQL상에서 사용하는 예약어를 테이블 네임으로서 사용했기 때문이다. (==자바 코드로 LIKE라는 이름의 엔티티를 설계했던 것이 문제였다.)

 

LIKE는 SQL에서 문자열의 형식 조건을 명시할 때 사용하는 예약어이기 때문에, table 이름으로 사용할 수 없다. (SQL이 해석될 수 없다.)

Like 예약어는 문자열의 형식 조건을 명시할 때 사용한다.

--'김'으로 시작하는 사원 조회
SELECT * FROM My_Talbe WHERE Nm_Kor LIKE '김%'

--김이 들어가는 시작하는 사원 조회
SELECT * FROM My_Talbe WHERE Nm_Kor LIKE '%김%'

--김으로 끝나는 사원의 사원번호 조회
SELECT No_Emp FROM My_Talbe WHERE Nm_Kor LIKE '%김'

(예시 출처 : https://coding-factory.tistory.com/114)

 

 

이를 해결하기 위해 Like 엔티티를 Likes 엔티티로 바꿔주니 해결되었다.

 

교훈

group이나 values와 같은 SQL에서 사용하는 커맨드 예약어를 엔티티 이름으로 선언하지 않도록 주의해야 한다.

(이를 막상 겪으면 머리가 멈춰버려서 무엇이 문제인지 빠르게 알아채기 힘드므로, 이를 항상 염두해두고 네이밍을 설계해줘야 한다.