1 minute read

개요

응답헤더가 자꾸만 ISO-8859-1 이다.
💡 아래처럼 셋팅했음에도 그렇다.

클라이언트
💡 JSP의 브라우저에게 전송하는 인코딩설정 완료함

<!-- 
   contentType: JSP페이지가 브라우저에게 전달할때 인코딩
   charset: JSP페이지가 자체의 인코딩. (내용이 UTF-8 으로 작성되어있야아 한다.)
-->
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" %>

서버
💡 톰캣서버의 기본인코딩을 UTF-8 으로 완료함.
💡 post용임(body 데이터).

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

💡 web.xml 사전 요청응답 필터링을 UTF-8 으로 완료함.

<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>
<!-- 한글설정END 이제부터 ibatis 한글로 쿼리를 날리면 정상해석된다. -->

문제 요약

@RequestMapping(value="/preview/{id}", method=RequestMethod.GET)
public @ResponseBody String getContent(@PathVariable("id") long id) {
    return service.getContent(id);
}

컨트롤러 내용
💡 String 전문(@ResponseBody 적용)을 응답

위 결과의 응답헤더

Content-Type:application/json;charset=ISO-8859-1

💡 UTF-8 을 응답하지 않는다..
💡 한글이 깨진다.

해결1: 스프링3.1버전 이전 방법(잭슨을 직접서블릿에 등록해야함)

servlet-context.xml

<!-- -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- @ResponseBody Content-Type:application/json;charset=UTF-8  -->
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

위 설정으로 RequestBody 의 String 리턴 조치
💡 UTF-8 을 응답한다.
💡 한글이 정상적으로 출려된다.

원인

Spring의 MessageConverter의 Charset의 기본값은 형태로 되어 있다. 여기에 UTF-8을 추가해줌으로써 String값을 형태로 바꾸는 것이다.

GPT
💡 이 설정은 StringHttpMessageConverter를 빈으로 등록하고, supportedMediaTypes 속성을 통해 특정 미디어 타입과 문자 인코딩을 지정하는 것입니다. 여기서는 text/html 미디어 타입과 UTF-8 문자 인코딩을 지정하고 있습니다.
💡 이 설정이 적용되면, 해당 미디어 타입(text/html)으로 요청이나 응답이 발생할 때 StringHttpMessageConverter가 사용됩니다. 이때, 지정한 문자 인코딩(UTF-8)이 적용되어 데이터가 처리됩니다.
💡 즉, 이 설정은 HTML 형식의 데이터를 처리할 때, 그 데이터가 UTF-8로 인코딩된 것으로 가정하고 처리하도록 StringHttpMessageConverter를 구성하는 것입니다. 이는 주로 @ResponseBody 어노테이션을 사용하여 HTTP 응답을 생성할 때 적용됩니다
💡 따라서, 클라이언트에게 HTML 형식의 응답을 제공하고자 할 때, 이 설정을 통해 UTF-8로 인코딩된 HTML을 전송할 수 있습니다.

해결2: 3.1버전 이후(잭슨이 자동으로 설정되어있음)

작성중..

Leave a comment