상세 컨텐츠

본문 제목

트러블 슈팅 : Spring으로 구성된 API에서 @ResponseBody시 한글 깨짐 현상

IT/프로그래밍

by James Lee. 2017. 8. 6. 16:41

본문


현상

메서드에 @ResponseBody를 붙여서 String 값을 반환하면 한글이 ???로 나오는 현상

해결

스프링 환경설정 파일에 아래와 같이 bean을 설정해줌

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 지원되는 캐릭터셋에 UTF-8 추가 -->
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

왜 해결된 것일까?

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

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); //기본 문자열 셋은 ISO-8859-1로 설정되어 있음.
private final List<Charset> availableCharsets;
private boolean writeAcceptCharset;

public StringHttpMessageConverter() {
this(DEFAULT_CHARSET);
}

public StringHttpMessageConverter(Charset defaultCharset) {
super(defaultCharset, new MediaType[]{MediaType.TEXT_PLAIN, MediaType.ALL});
this.writeAcceptCharset = true;
//가능한 문자열 셋을 가져옴.
this.availableCharsets = new ArrayList(Charset.availableCharsets().values());
}
...
}
%23%20%uD2B8%uB7EC%uBE14%20%uC288%uD305%20%3A%20Spring%uC73C%uB85C%20%uAD6C%uC131%uB41C%20API%uC5D0%uC11C%20@ResponseBody%uC2DC%20%uD55C%uAE00%20%uAE68%uC9D0%20%uD604%uC0C1%0A@%28%uD2B8%uB7EC%uBE14%20%uC288%uD305%29%5B%uD2F0%uC2A4%uD1A0%uB9AC%5D%0A%0A%23%23%23%20%uD604%uC0C1%0A%0A%uBA54%uC11C%uB4DC%uC5D0%20%60@ResponseBody%60%uB97C%20%uBD99%uC5EC%uC11C%20String%20%uAC12%uC744%20%uBC18%uD658%uD558%uBA74%20%uD55C%uAE00%uC774%20%3F%3F%3F%uB85C%20%uB098%uC624%uB294%20%uD604%uC0C1%0A%0A%23%23%23%20%uD574%uACB0%20%0A%0A%uC2A4%uD504%uB9C1%20%uD658%uACBD%uC124%uC815%20%uD30C%uC77C%uC5D0%20%uC544%uB798%uC640%20%uAC19%uC774%20bean%uC744%20%uC124%uC815%uD574%uC90C%0A%60%60%60%0A%3Cmvc%3Aannotation-driven%3E%0A%20%20%20%20%20%20%20%20%3Cmvc%3Amessage-converters%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cbean%20class%3D%22org.springframework.http.converter.StringHttpMessageConverter%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cproperty%20name%3D%22supportedMediaTypes%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Clist%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%21--%20%uC9C0%uC6D0%uB418%uB294%20%uCE90%uB9AD%uD130%uC14B%uC5D0%20UTF-8%20%uCD94%uAC00%20--%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cvalue%3Etext/html%3Bcharset%3DUTF-8%3C/value%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/list%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/property%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C/bean%3E%0A%20%20%20%20%20%20%20%20%3C/mvc%3Amessage-converters%3E%0A%20%20%20%20%3C/mvc%3Aannotation-driven%3E%0A%60%60%60%0A%0A%23%23%23%20%uC65C%20%uD574%uACB0%uB41C%20%uAC83%uC77C%uAE4C%3F%0A%0ASpring%uC758%20MessageConverter%uC758%20Charset%uC758%20%uAE30%uBCF8%uAC12%uC740%20%60ISO-8859-1%60%uD615%uD0DC%uB85C%20%uB418%uC5B4%20%uC788%uB2E4.%20%uC5EC%uAE30%uC5D0%20%60UTF-8%60%uC744%20%uCD94%uAC00%uD574%uC90C%uC73C%uB85C%uC368%20String%uAC12%uC744%20%60UTF-8%60%uD615%uD0DC%uB85C%20%uBC14%uAFB8%uB294%20%uAC83%uC774%uB2E4.%0A%60%60%60%0Apublic%20class%20StringHttpMessageConverter%20extends%20AbstractHttpMessageConverter%3CString%3E%20%7B%0A%20%20%20%20public%20static%20final%20Charset%20DEFAULT_CHARSET%20%3D%20Charset.forName%28%22ISO-8859-1%22%29%3B%20//%uAE30%uBCF8%20%uBB38%uC790%uC5F4%20%uC14B%uC740%20ISO-8859-1%uB85C%20%uC124%uC815%uB418%uC5B4%20%uC788%uC74C.%0A%20%20%20%20private%20final%20List%3CCharset%3E%20availableCharsets%3B%0A%20%20%20%20private%20boolean%20writeAcceptCharset%3B%0A%0A%20%20%20%20public%20StringHttpMessageConverter%28%29%20%7B%0A%20%20%20%20%20%20%20%20this%28DEFAULT_CHARSET%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20StringHttpMessageConverter%28Charset%20defaultCharset%29%20%7B%0A%20%20%20%20%20%20%20%20super%28defaultCharset%2C%20new%20MediaType%5B%5D%7BMediaType.TEXT_PLAIN%2C%20MediaType.ALL%7D%29%3B%0A%20%20%20%20%20%20%20%20this.writeAcceptCharset%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20//%uAC00%uB2A5%uD55C%20%uBB38%uC790%uC5F4%20%uC14B%uC744%20%uAC00%uC838%uC634.%0A%20%20%20%20%20%20%20%20this.availableCharsets%20%3D%20new%20ArrayList%28Charset.availableCharsets%28%29.values%28%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20...%0A%20%7D%0A%60%60%60%0A%0A


관련글 더보기

댓글 영역