UTF-8 Spring MVC + Mybatis + MYSQL

UTF-8 Spring MVC + Mybatis + MYSQL

Spring MVC

앞서 구현하였던 CRUD를 완성하여 테스트를 하던 중에 UTF-8문제를 직면하였다..
값을 입력할때 한글만 넣으면 ?로 값이 들어가서 원인을 파악하던 중에 log에서는 sql에서는 문제가 없다는 것을 발견하고 디버그를 한 결과 Mybatis에서 Mysql로 넘어갈때의 문제로 밝혀졌다.
찾다보니 단순하게 web.xml에서 설정하였던 부분 외에도 Mysql, tomcat까지도 설정을 해줘야하는 부분이 있어서 쉽게 정리해보았다.

Mac 기준으로 설명하겠습니다.

설정 순서 설명

  1. web.xml
  2. Mysql 설정
  3. jsp 설정
  4. root-context.xml
  5. Tomcat의 server.xml

web.xml 설정

앞의 SpringMVC 프로젝트를 생성하면 webapp/WEB-INF/web.xml이 존재하는데 그 안의 UTF-8 filter를 추가해 줘야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Mysql 설정

Mysql은 terminal에서 직접접속하여서 내부의 encoding setting을 변경해줘야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cd /usr/local/mysql/bin

./mysql -uroot -p

---- 접속후 ------

status

Connection id: 134
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: less
Using outfile: ''
Using delimiter: ;
Server version: 5.7.18 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /tmp/mysql.sock
Uptime: 7 min 37 sec

status를 입력하면 현재 상태가 나오게된다.
이때 latin1을 utf8로 변경을 해줘야하는데 임시적 방법과 영구적인 방법이 존재한다.

임시적 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
SHOW VARIABLES LIKE 'c%'

'character_set_client','utf8'
'character_set_connection','utf8'
'character_set_database','utf8mb4'
'character_set_filesystem','binary'
'character_set_results','utf8'
'character_set_server','latin1'
'character_set_system','utf8'
'character_sets_dir','/usr/local/mysql-5.7.18-macos10.12-x86_64/share/charsets/'
'check_proxy_users','OFF'
'collation_connection','utf8_general_ci'
'collation_database','utf8mb4_general_ci'
'collation_server','latin1_swedish_ci'
'completion_type','NO_CHAIN'
'concurrent_insert','AUTO'
'connect_timeout','10'
'core_file','OFF'

-------- 변경 전

SET character_set_server = utf8;
SET collation_server = utf8_general_ci;

-------- 변경 후
SHOW VARIABLES LIKE 'c%'

'character_set_client','utf8'
'character_set_connection','utf8'
'character_set_database','utf8mb4'
'character_set_filesystem','binary'
'character_set_results','utf8'
'character_set_server','utf8'
'character_set_system','utf8'
'character_sets_dir','/usr/local/mysql-5.7.18-macos10.12-x86_64/share/charsets/'
'check_proxy_users','OFF'
'collation_connection','utf8_general_ci'
'collation_database','utf8mb4_general_ci'
'collation_server','utf8_general_ci'
'completion_type','NO_CHAIN'
'concurrent_insert','AUTO'
'connect_timeout','10'
'core_file','OFF'

영구적 방법

/usr/local/etc 안에 my.cnf 파일이 없을 경우 /usr/local/mysql/support-files my-default.cnf 설정 파일을 복사해서 생성한 후에 mysql를 재실행해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[client]
default-character-set=utf8

[mysqld]
character-set-client-handshake=FALSE
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='set names utf8'

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

jsp 설정

최상단과 head tag 사이에 한줄씩 추가해주면 된다.

1
2
3
4
5
6
7
8
9
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>
</html>

root-context.xml 설정

이 부부을 통해서 Mysql를 연결하는데 여기서 url의 value 부분을 해결하기 위해서 시간이 오래 걸렸었다.

1
2
3
4
5
6
7
8
9
10
11
12
<!-- Mysql Connection -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="url"
value="jdbc:log4jdbc:mysql://127.0.0.1:3306/DB명?useUnicode=yes&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC">
<!-- url DB명 뒤의 value의 순서가 바뀌면 안된다 -->
</property>

<property name="username" value=""></property>
<property name="password" value=""></property>
</bean>

&란? & 기호 자체를 표현해 주기 위해서는 & 를, & 로 표현해야한다.

Tomcat server.xml 설정

64번째 줄에 UTF-8를 추가해주면 된다.

1
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

이렇게하면 UTF-8 설정이 완료가 된다.

Share