마사키군의 다락방

끄적끄적할게 있을때 끄적거려 보관해두는 다락방

Tomcat에서 UTF-8 사용하기

요 근래에는 자바를 다시 공부하고 있다. 일단 기본적인건 아니까 대충 넘어가고, 자바 웹 어플리케이션 부분을 살펴보고 있는데, 내가 보고 있는 교재에선 뜬끔없이 프로젝트가 EUC-KR로 작성되어 있는것이 아닌가.

요즘같은 세상에 EUC-KR이라니, 이 무슨… 하는 생각을 하면서 JSP 페이지 디렉티브와 meta 태그의 캐릭터셋 부분을 모두 UTF-8로 변경한 뒤 웹 어플리케이션을 실행해보니 아뿔싸, 넘겨준 데이터를 받아서 출력하는 부분에서 한글 데이터는 모조리 깨져 나오는 것이 아닌가…

이것은 자바가 내부적으로는 데이터를 유니코드로 처리하지만, 외부와 데이터를 주고받을때는 시스템의 캐릭터셋에 따라서 데이터를 변환하기 때문에 그런 것 같다. 대충 조회해보니 한글 윈도우에서는 MS949, 맥에서는 EUC-KR로 처리하는거 같더라. 어쨌건 이래서는 안되기 때문에-_- 인터넷을 뒤져 이런저런 자료 수집 후 UTF-8로 정상적으로 표시하는데 성공했고, 그 내용을 기록해둔다.

참고로, 인터넷을 뒤져보니 톰캣에서 UTF-8로 처리되게 하는 방법은 이것저것 많았는데, 그 중 필터를 이용하는 방법이 가장 간편하고 확실했다고 생각되었기에 그 방법으로 기록해둔다. 다른 방법도 이것저것 있었지만 모두 실패했다-_-

실행 환경은 자바 1.8.0.25에 톰캣 7.0이었지만, 다른 버전에서도 크게 다르지는 않을 거라고 생각한다. 실제로도 톰캣 6.0에서 동일한 방법으로 동작했다.

1. 기본사항

기본적으로 모든 파일은 UTF-8로 통일되어 있다고 가정한다. 또한 HTML나 JSP 파일 또한 meta 태그 및 JSP 파일의 헤더로 UTF-8임을 명시한다.

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

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

2. CharsetFilter 클래스 작성

아래 코드를 참고해서, 처리되는 데이터가 UTF-8임을 알려주는 필터를 작성한다. 구문강조 플러그인을 설치 안해서 이쁘게 안나오는데, 그러려니 하고 보자-_-;

package TestPrj;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharsetFilter implements Filter
{
private String encoding;

public void init(FilterConfig config)
throws ServletException
{
encoding = config.getInitParameter(“requestEncoding”);

if(encoding == null) encoding = “utf-8”;
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
throws IOException, ServletException
{
if(request.getCharacterEncoding() == null)
{
request.setCharacterEncoding(encoding);
response.setContentType(“text/html; charset=” + encoding);
response.setCharacterEncoding(encoding);
}

next.doFilter(request, response);
}

public void destroy() {}
}

3. 필터 설정

필터 클래스를 작성했다면, 웹페이지 요청이 발생할 때마다 필터를 거치도록 설정해야 한다. WEB-INF 폴더 아래의 web.xml 파일에 아래 구분을 추가한다. 만약 web.xml 파일이 없다면 그냥 새로 만들면 된다. 역시 구문 강조 플러그인이 없어서 보기 힘든데, 걍 그러려니 하고 보자-_-

<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>TestPrj.CharsetFilter</filter-class>
<init-param>
<param-name>requestEncoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

위에서 filter-class 엘리먼트에는 위에서 만든 캐릭터셋 클래스의 정확한 위치를 패키지명 포함해서 명시하면 된다.

4. server.xml 파일 수정

일단 위와 같이 수정하고 톰캣을 재시작하면 Post로 전송되는 데이터들은 올바르게 표시된다. 하지만 Get으로 전송되는 데이터들은 여전히 URL 인코딩시에 시스템의 캐릭터셋에 따라서 인코딩하기 때문에 깨져나오게 된다.

현재 실행되고 있는 톰캣의 server.xml(이클립스를 사용하는 경우, Project Explorer에서 Server 트리 아래에 표시되고 있는 server.xml)을 편집기 등을 사용해서 연다.

server.xml 파일에는 <Connector> 엘리먼트가 있을텐데, 이 엘리먼트에 URIEncoding이라는 속성을 추가한다.

<Connector port="8080" URIEncoding="utf-8" />

위와 같이 설정한 다음 톰캣을 재시작하면 주고받는 데이터가 UTF-8로 처리되며, 자바빈을 UTF-8로 작성해도 데이터 깨짐 없이 표시된다.

이 짓(?)을 하면서 생각한 것이 있다면, 톰캣은 프로젝트의 캐릭터셋 한번 설정하는데에도 이런 삽질을 해야 하는가 하는거다-_-

이 문서는 StackOverflow의 How to get UTF-8 working in Java webapps?라는 스레드를 참고해서 작성했으며, 해당 스레드는 자바 자바 웹 어플리케이션에서 데이터를 UTF-8로 처리하는 것 뿐만 아니라 MySQL에서 UTF-8로 데이터를 처리하기 위해서는 어떤 부분을 설정해야 하는지도 다룬다.

, , , , , ,

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.