> Hello World !!!

     

@syaku

Spring MVC Test - Response Body 한글 깨짐 이슈

JSON Media Type

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json
             Body = {"message":"인증되지 않았습니다.","resultStatus":"UNAUTHORIZED","code":401,"reason":"UNAUTHORIZED"}

테스트 실행시 위와 같이 한글이 깨지는 경우가 발생한다.

테스트가 아닌 일반적인 운영 웹서비스에 호출시 한글깨짐은 없었다.

MockMvc 테스트시 아래와 같이 설정해주면 한글깨짐이 없어진다.

.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)

하지만 APPLICATION_JSON_UTF8_VALUE enum 은 Deprecated 되었고 매번 이렇게 설정해서 한글 문제를 해결하는 것은 효율적이지 않다.

응답에 대한 언어셋 처리는 클라이언트의 기본 설정을 따르게 하기위함이 아닐까 생각된다.

하여 스프링 부트에 설정에서 응답에 대한 처리를 서버에서 하도록 설정을 변경하여 이문제를 해결하였다.

아래 설정은 테스트일때만 사용해야 한다.

application-test.yml

server:
  servlet:
    encoding:
      force-response: true

결과

MockHttpServletResponse:
           Status = 401
    Error message = null
          Headers = [Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = application/json;charset=UTF-8
             Body = {"message":"인증되지 않았습니다.","resultStatus":"UNAUTHORIZED","code":401,"reason":"UNAUTHORIZED"}

Text Plain Media Type

해당 이슈는 StringHttpMessageConverter 구현 클래스에 기본 언어셋이 StandardCharsets.ISO_8859_1 설정되어 있는 부분을 개선하기 위함도 있다.

json 처리 방법처럼 요청시 header accept 에 UTF-8 을 명시하면 된다.

.accept(new MediaType(MediaType.TEXT_PLAIN, StandardCharsets.UTF_8));

일괄적으로 반영하기 위해 HttpMessageConverter 를 재정의해주어야 한다.
설정이 커스텀하므로 @EnableWebMvc 선언하는 대신 DelegatingWebMvcConfiguration 상속하여 사용한다.

@Configuration
public class WebMvcConfiguration extends DelegatingWebMvcConfiguration {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
        converters.add(stringConverter);
        super.addDefaultHttpMessageConverters(converters);
    }
}