본문 바로가기

FrameWork/Spring Boot

Spring Boot - 한글, 한자 인코딩(Encoding) 에러시 체크리스트!

SpringBoot Db사용시 인코딩

이번 포스팅은 Spring Boot를 이용해 만들어진 어플리케이션 서버에서, DB에 값을 입력하는 경우 한자 또는 한글의 인코딩이 이루어지지 않았던 문제를 해결한 과정에대해 정리해보려 합니다.

 

 

 

문제상황

제가 만든 어플리케이션은 중국인 관광객들을 대상으로하는 애플리케이션이었습니다. 중국인 관광객이 사진을 업로드하면, 그 사진에 대한 정보를 입력해주어야 하는 상황이었고, 이때 간체로 데이터를 입력해주어야 했습니다.

 

이를 SpringBoot로 만든 웹을 이용해서 입력하기로 했고, 입력한 결과 DataBase에서 간체를 인식하지 못하는 상황이 발생했습니다.

 

 

 

 

 

 

체크리스트

1. Database(&& Table) Charset/Collation

첫번째로 확인해보아야 할 것은 Database의 Charset/Collation입니다. 기본적으로 Database에서 사용될 Charset을 지정하는 것인데요, MysqlWorkbench를 이용하는 경우, 위그림처럼 Database에 마우스를 오버하면 나나타는 repair Icon을 클릭하면, 각각의 값을 설정할 수 있습니다.

 

Table의 Charset의 경우 기본적으로 Database에서 지정된 Charset을 상속받게 됩니다. 하나의 Table만 Charset을 별도로 지정할수있는데요, Table역시 같은 방법으로 각각의 값을 설정할 수 있습니다.

 


Mysql Server 설정을 통해 Default CharacterSet 변경하기 

위와 같이 수동으로 하기에는 Spring jpa의 audo generate 기능을 이용하는 분들에게는 불편할 수 있습니다. 따라서 서버에서 디비와 테이블 생성시 자동으로 character set을 맞추어 생성하도록 하는 것이 좋습니다.


1. my.cnf 파일 찾기

그 후  "whereis my.cnf " 명령어를 이용하여 파일의 위치를 찾습니다.


2. my.cnf 수정

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

위의 내용을 추가합니다.


3. mysqld 서버 재시작

 마지막으로 서버를 재시작합니다.



 

2. Spring StringHttpMessageConverter Charset

StringHttpMessageConverter는 요청본문, 응답본문의 content-typetext/plain인 경우 동작합니다. 이 객체를이용하여 요청본문, 응답본문의 텍스트의 charset을 설정할 수 있는데요,

 

Spring Boot를 사용하는 경우, HttpMessageConvertersAutoConfiguration안에서 자동으로 StringHttpMessageConverter 설정까지 해줍니다. 따라서 별도의 설정을 하지 않아도, 한글과 한자에 대한 인코딩이 자동으로 됩니다.

 

 

 

 

3. JDBC 연결시 encoding에러

앞서서 1. Database에서 자체적으로 데이터를 저장할때 사용하는 인코딩, 2. Spring에서 요청을 받고 응답을 보낼때의 인코딩에 대해 살펴보았습니다.

 

따라서 마지막으로 고려해볼 수 있는 사항은, Spring을 통해 Database에 데이터를 저장할 때의 인코딩입니다(연결시).

 

필자의 경우 이부분이 문제였습니다. 해결방법은 간단합니다. Database연결시 url 파라미터에 characterEncoding=UTF-8을 추가적으로 입력해주면 됩니다.