기본 콘텐츠로 건너뛰기

[ JAVA ] Spring + Tomcat 에서 한글 (UTF-8) 설정하기.

  스프링 프레임워크와 Tomcat을 사용하는 환경에서 한글을 UTF-8 로 처리하는 방법은 여러 가지가 존재한다. 그 중에서 일반적으로 사용할 수 있는 방법을 정리해 놓도록 한다.

  우선 당연한 것이겠지만 원본 소스 코드의 문서 인코딩이 당연히 UTF-8 이어야 한다. Windows Preference 에서 Workspace의 텍스트 파일 인코딩을 UTF-8로 설정하면 된다.




  Tomcat의 Server.xml 에서 Connector에 URIEncoding을 UTF-8로 설정하면 된다.

...
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
...
  스프링 프레임워크에서 기본적인 POST 에서 한글 처리 방식으로 Filter를 설정하면 된다. web.xml 아래와 같이 설정이 가능하다.

...
<!-- 모든 Filter 들 중에서 가장 처음에 존재하여야 함 (단, String 기반의 JSON 반환에서는 적용되지 않음) -->
<filter>
    <filter-name>Set Character Encoding</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>
    <!-- forceEncoding 은 Servlet 버전 2.4 이상인 경우 -->
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
...
  Spring 프레임워크를 사용하기 위해서 구성한 Controller 에서 객체를 이용한 JSON 반환을 사용하고 있다면 @RequestMapping에 요청과 응답에 관련된 정보를 설정할 수 있다. (단, 스프링 3.1 이후에서 가능한 것으로 보인다. 정확하지 않으므로 꼭 확인하고 적용하여야 한다)

...
@RequestMapping(value = "/search", produces = "application/json; charset=utf-8")
@ResponseBody
public String search(@RequestParam(value = "keyword", required = true, defaultValue = "") String keyword) {
   String responseData = "{'recvData':'" + keyword + "'}";
   return responseData;
}
...
  위의 설정은 요청에 대한 것과 응답에 대한 컨텐츠 형식(미디어 형식)을 제한하는 것으로 사용되는 것이다. 그러나 실제 위와 같이 설정했을 경우에 위의 샘플로 사용한 Controller의 메서드는 처리되지 않는다. 이유는 객체를 이용해서 JSON으로 처리한 것이 아니라 String으로 JSON 원본 문자열을 반환하고 있기 때문이다.

  이와 같이 문자열로 직접 @ResponseBody를 처리하는 경우는 위의 방식으로는 적용되지 않는다. 이 경우는 StringHttpMessageConverter 를 이용해서 supportMediaTypes 정보를 변경해 주는 방법을 사용하면 된다.

...
<!-- @ResponseBody Annotation을 이용해서 String 으로 JSON 데이터를 반환하는 경우에 UTF-8 적용 
     (단, 전체에 대해 적용되므로 <mvc:annotation-driven />을 같이 사용하면 문제가 될 수도 있다. -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </list>
    </property>
</bean>
...
  다시 한번 강조하지만 스프링과 Tomcat을 사용하는 경우에는 상황에 따라서 다양하게 설정하는 방법이 존재하므로 용도와 구성에 맞도록 설정을 해 주면 된다. 여기서 정리하지 못한 다른 방법도 존재할 수 있으므로 검토를 충분히 한 후에 가장 적절한 방법을 사용하면 된다.

댓글