들어가며...
Ajax로 호출할 때, 응답값을 한글로 내려 준 경우 ???? 로 노출되는 현상을 겪었다.
Javascript에서 처리한 한글은 잘 되고, 다른 api 결과로 받은 한글 값을 그대로 전달하면 정상적으로 한글이 잘 노출되었다.
@RequestMapping(value = “/save”, method = RequestMethod.POST)
@ResponseBody
public String save() {
//…
String result = api.call(parameter);
if (“SUCCESS”.equals(result)) {
return “성공”; //한글 깨짐
} else {
return result; //한글 정상 노출
}
}
|
정확히 위 코드는 아니지만, 결국은 Java에서 한글을 그대로 return 하고 있는 코드였다.
왜 한글이 깨질까?
삽질 시작
1.Tomcat 한글 설정
보통 서버와 통신시 파라메터 관련 한글 깨짐 현상이 있으면 제일 첫 번째로 의심하는 부분이다.
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8”/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
|
효과 없음...
2.페이지 인코딩
<%@ page language=“java” contentType=“text/html” pageEncoding=“UTF-8” %> |
효과 없음...
3.meta 설정
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”> |
효과 없음...
4.StringHttpMessageConverter 설정
<bean class=“org.springframework.http.converter.StringHttpMessageConverter”>
<property name =“supportedMediaTypes”>
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
|
효과 없음...
5.@RequestMapping.produces 설정
@RequestMapping(value=“/save”, produces=“application/text;charset=utf8”)
@ResponseBody
public String save() {
//…
return “한글…"
}
|
해결...
produces 속성은 처음으로 접한 속성이다. 어떤 기능을 하는 것일까?
https://blog.outsider.ne.kr/902 여기서 아래와 같이 소개하고 있다.
16.3.2.5 생산가능한 미디어 타입(Producible Media Types) 생산가능한 미디어 타입의 목록을 지정해서 주요 매핑을 제한할 수 있다. Accept 요청헤더가 이러한 값 중 하나와 일치할 때만 요청이 매칭될 것이다. 게다가 produces 상태를 사용하면 produces 조건에 지정한 미디어 타입과 관련된 응답을 생성하는데 사용한 실제 컨텐트 타입을 보장한다. 예를 들면 다음과 같다. Java @Controller @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody public Pet getPet(@PathVariable String petId, Model model) {
// 구현부는 생략한다
} consumes에서처럼 생산가능한 미디어타입 표현식에는 text/plain의 Accept 헤더값을 가진 요청을 제외한 모든 요청에 매칭되도록 !text/plain처럼 부정문을 사용할 수 있다. Tip produces 조건은 타입수준과 메서드 수준에서 지원한다. 다른 대부분의 조건과는 달리 타입수준에서 사용했을 때 메서드수준의 producible 타입은 타입수준의 producible 타입을 확장하는 게 아니라 오버라이드한다. |
4번 방법과 유사한 방식인데. 4번이 왜 안 된 것인지는 잘 모르겠다.
MessageConverter 기능을 좀 더 공부해 봐야겠다.
참고
'Programing > Spring' 카테고리의 다른 글
Spring에서 Json을 파라메터로 넘겼을 때 어떻게 객체로 받을 수 있을까? (0) | 2017.07.21 |
---|---|
Method 주석에 @SQL은 무엇일까? DocletSqlMapClientFactoryBean이란? (0) | 2017.05.29 |
MyBatis 를 이용하여 executeBatch 처리하기 (0) | 2016.06.22 |
Spring Bean 생성 및 주입 방법 (0) | 2015.06.23 |
@Resource VS @Autowired (0) | 2015.03.12 |