1.5.4. Tomcat에서의 한글문제
작성자: 심 우곤 (wgshim@greenbell.co.kr)
본 문서는 JLab (http://www.jlab.net) 홈페이지에서도 보실 수 있습니다.
Tomcat의 악명 높은 한글 문제입니다. HTML의 <FORM>을 통해 한글 정보를 전달하면 이 값이 깨져버리는데, 이 문제는 Tomcat이 넘어오는 데이터를 내부적으로 변환해 버리기 때문이지요. 물론, 한글을 변환하는 빈을 만들어서 처리하는 방법도 있습니다만, 매 페이지마다 빈을 불러서 처리해야 하는 것이 귀찮지요.
여기서 알려드리려 하는 방법은 Tomcat으로 하여금 <FORM>을 통해 전달하는 값을 URL 인코딩을 하지 않고 EUC_KR로 변환하여 넘기도록 합니다. 이는 한글문제에 대해 고민을 하지 않아도 된다는 것이지요.
물론, 매 페이지는 한글을 잘 표현할 수 있도록 다음과 같은 지시문을 둘 거라 생각합니다.
<%@ page language="java" contentType="text/html; encoding=euc_kr"%>
이제 본격적으로 Tomcat의 한글문제를 다루도록 합시다. 사실 여기서 다루려는 해결방안은 Tomcat을 설치하면서 딸려 들어오는 예제코드(4.0.5나 4.1.12 모두에서 찾아볼 수 있습니다)에서 내용을 찾을 수 있었습니다. -_-;; 놀라셨다구요? 저도 놀랐습니다. 정말 등잔 밑이 어둡다고 하더니만, 이렇게 가까운 곳에 해결책이 있을 줄이야!
%CATALINA_HOME%\webapps\examples\WEB-INF에 존재하는 web.xml을 열어보면, 다음과 같은 부분을 찾을 수 있습니다.
이 방법은 Filter를 사용하는 방법으로 사용자의 입력을 서블릿이 처리하기 전에 해당 정보를 Filter가 적절한 방식으로 변환할 수 있도록 합니다.
그림 20. Tomcat 예제의 web.xml
참 이런걸 보면, 2 Bytes 문자체계를 지원하는 솔루션은 일본인들을 위해서 먼저 만들어진다는 것이 안타깝습니다. 하지만 이로 인해서 우리나라도 유사한 방법으로 한글문제를 쉽게 해결할 수 있지만요.. 잠깐 푸념이었습니다.
물론 위에 보이는 <filter>의 encoding 파라미터의 값을 EUC_JP에서 EUC_KR로 변경해야겠죠? 여기서 한글변환을 위해 사용된 SetCharacterEncodingFilter 클래스는 %CATALINA_HOME%\webapps\examples\WEB-INF\classes\filters에서 찾을 수 있습니다
[그림 21].
그럼 정리하겠습니다.
[ Filter를 사용하여 Tomcat에서의 한글문제 해결방안 ]
1. 구축하고자 하는 여러분의 웹 어플리케이션의 WEB-INF\classes 폴더에 filters라는 새로운 폴더를 생성합니다.
2. 이제 WEB-INF\classes\filters에 SetCharacterEncodingFilter.class 파일을 %CATALINA_HOME%\webapps\examples\WEB-INF\classes\filters 폴더에서 복사합니다.
3. 그 후 여러분의 웹 어플리케이션의 WEB-INF\web.xml의 상단에 다음 라인을 추가합니다.
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>EUC_KR</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
※ 참고: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 인지를 확인합니다. 간혹 2.2버전의 파일이 있는데, 이 때는 아래의 <filter> 및 <filter-mapping>인지하지 못합니다.)
매번 SetCharacterEncodingFilter.class 파일을 WEB-INF\classes\filters에 복사하는 것이 귀찮으시다구요?
Tomcat은 여러 웹 어플리케이션들간에 클래스를 공유할 수 있는 공간을 마련해 두었습니다. Tomcat 4.0.5에서는 %CATALINA_HOME%\classes폴더가 Tomcat 4.1.12에서는 %CATALINA_HOME%\common\classes 폴더가 있는데, 이들 폴더가 바로 그 공간입니다. 자 그럼 이곳에 공용 클래스인 SetCharacterEncodingFilter.class를 공유공간에 복사해 봅시다. 절차는 다음과 같습니다:
Tomcat 4.0.5를 사용하시는 분은 %CATALINA_HOME%\classes에, Tomcat 4.1.12를 사용하시는 분은 %CATALINA_HOME%\common\classes에 filters폴더를 만들고SetCharacterEncodingFilter.class 파일을 복사합니다.
혹은, 매번 폴더 만들고 복사하기가 귀찮으시다면 jar로 압축된 파일을 여기( http://ietmserver.greenbell.co.kr/~wgshim/java/TomcatCharacterEncodingFilter.jar )서 받으시기 바랍니다. 그냥 제가 묶어 놓은 것입니다. 여러분도 예제로부터 쉽게 만들어 사용하시면 됩니다. [파일명: TomcatChracterEncodingFilter.jar]
Tomcat 4.1.12를 사용하시는 분은 %CATALINA_HOME%\lib에, Tomcat 4.1.12를 사용하시는 분은 %CATALINA_HOME%\common\lib에 받으신 jar파일을 복사합니다.
이로써 우리는 앞으로 만들게 될 웹 어플리케이션에서 SetCharacterEncodingFilter 클래스를 공유하게 되었습니다. 그 결과, 여러분들은 위에 언급한 세 단계의 절차 중 첫 번째와 두 번째 항목을 매 어플리케이션마다 수행하실 필요가 없어진 것이지요. 단지 web.xml 파일에 내용을 추가하시기만 하면 됩니다.
감격의 순간이지 않습니까? 저는 이런 방법이 있다는 사실을 다수의 국내 개발자들이 모르고 있다는 것이 안타깝습니다. 널리 이 방법을 전파시켜 주시길 바랍니다. 한글 변환 빈을 만들어서 매번 불편하게 사용해 왔다면, 정말 신선한 방법이겠죠? ^_^
작성자: 심 우곤 (wgshim@greenbell.co.kr)
본 문서는 JLab (http://www.jlab.net) 홈페이지에서도 보실 수 있습니다.