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

이클립스 설정

image

스프링 부트 CharacterEncodingFilter 설정

image

image

# 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);
		
	}
}