스프링 부트 인코딩 설정 - eunja511005/Tutorial GitHub Wiki
이클립스 설정

스프링 부트 CharacterEncodingFilter 설정


# encoding
sever.servlet.encoding.charset=UTF-8
sever.servlet.encoding.force=true
한글깨짐
이 문제를 해결하기 위해서 인코딩 세팅을 다 해보았지만 무용지물이었다.
application.properties 세팅
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
spring.http.encoding.force-response=true
spring.http.encoding.force-request=true
spring.http.encoding.mapping.KOREAN=UTF-8
그리고 온갖 설정을 진행하고 나고 아무리 해도 되지 않았다.
결국 코드를 전부 역추적하기 시작했다.
AbstractMessageConverterMethodProcessor 클래스의
writeWithMessageConverters메소드에서 ISO-8859-1로 바꾸는 것을 발견하였다.
그리고 기본적으로 생성된 StringHttpMessageConverter에서 기본 옵션 ISO-8859-1을 발견
아래와 같이 Converter 세팅을 진행하였다.
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
converter.setWriteAcceptCharset(false); //이거 설정 안하면 Accept-Charset에 대다수의 Encoding Type 리턴함
converters.add(converter);
super.configureMessageConverters(converters);
}
}
한글 깨짐 테스트 코드
package com.eun.tutorial.controller;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.filter.CharacterEncodingFilter;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
class MainControllerJTest {
@Autowired
MainController mainController;
@Autowired
MockMvc mockMvc;
@Test
public void contextLoads() throws Exception {
assertThat(mainController).isNotNull();
}
@Test
@DisplayName("MockMvc 생성시 MessageConverters를 추가해줘야 HTTP Get 방식에서 Request Param 전달 시 한글 안 깨짐")
public void hello() throws Exception {
String name = "홍길동";
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(MainController.class)
// .addInterceptors(null)
.setMessageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8))
.build();
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/reqParam")
.param("name", name)
)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
String responseBody = mvcResult.getResponse().getContentAsString();
assertEquals("Hello, "+name, responseBody);
}
@Test
@DisplayName("자동 생성된 MockMvc를 사용하여 HTTP Post 방식에서 Request Param 전달 시 한글 안 깨짐")
public void hello2() throws Exception {
String name = "홍길동";
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/reqParam")
.param("name", name)
.contentType("text/plain;charset=UTF-8")
.with(csrf())
)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
String responseBody = mvcResult.getResponse().getContentAsString();
assertEquals("Hello, "+name, responseBody);
}
}