Spring

SQLGrammarException

진공청소ㄱl 2024. 9. 26. 17:48

테스트 코드를 작성하던 도중 다음과 같은 에러가 발생하였다.

 

Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement [(conn=134) Incorrect string value: '\\xEC\\x83\\x81\\xED\\x92\\x88...' for column testdb.product.product_name at row 1] [insert into product (created_at,product_name,product_price,product_stock,updated_at) values (?,?,?,?,?) returning product_id]

 

SQLGrammarException은 Hibernate나 JPA에서 SQL 쿼리를 실행할 때 문법 오류가 발생했을 때 발생하는 예외이다. 이 예외는 SQL 쿼리의 구문이 잘못되었거나, 데이터베이스가 이해할 수 없는 형식으로 쿼리가 작성되었을 때 나타난다.

 

에러를 살펴보니 저장하려는 문자열이 데이터베이스의 현재 문자 셋과 호환되지 않음을 나타내는 것 이였다. 에러에 있는 '\xEC\x83\x81\xED\x92\x88' 내가 넣은 한글 "상품"의 UTF-8 인코딩을 나타내는 것 이였으며, 데이터베이스가 이 문자열을 인식하지 못하고 있다는 의미였다.

 

즉, utf8 문자 셋으로 데이터를 넣으려 했지만 데이터베이스의 문자 인코딩 설정이 맞지 않는다는 것 이였다.

 

해결 방법

 

데이터베이스(H2) 문자 셋 확인

SHOW TABLE STATUS WHERE Name = 'product';

 

armscill8에 대해 찾아보니 아르메니아어 문자 셋이라 한다. ASCII 문자 및 아르메니아어 외 문자는 지원하지 않는다고 한다. \xEC\x83\x81\xED\x92\x88가 UTF-8 인코딩을 나타내는 것 이였으므로, UTF-8을 지원하는 문자 셋으로 변경해줘야 했다.

 

문자 셋 변경

ALTER DATABASE testdb CHARACTER SET utf8mb4 COLLATE UTF8MB4_UNICODE_CI;

 

H2 데이터베이스를 사용하고 있는 중 이였는데, MySQL의 UTF-8을 지원하는 utf8mb4 문자 셋으로 변경했다. utf8로 변경해도 되지만 emoji 사용을 위해 utf8mb4로 설정하였다.

다음과 같이 값이 잘 들어가는 것을 확인할 수 있다.

 

참고

https://pixx.tistory.com/265

@Query 어노테이션 사용하기 - 실습편 - [ 스프링 부트 (Spring Boot) ] (youtube.com)