스프링 ResponsBody로 String 을 전달시 한글 깨짐 현상 해결
개요
❗응답헤더가 자꾸만 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을 전송할 수 있습니다.
Leave a comment