2014년 마지막날 새벽에 SpringBoot + SpringSecurity 기반의

밀키3 삽질개발하다가 생긴 한글 인코딩 이슈를 이야기를 해볼까 한다.



스프링을 써오면서. 그렇게 큰 고민 없이 한글 입출력을 처리 하고 있었다.

오늘 새벽에도 평소와 다름 없이.. 개발+테스트를 진행하였다.


기본 환경구성(서버쪽)은 대략 되어서 실질적으로 개발을 시작하였다.

간단하게 글(post) CRUD를 만들고 테스트를 시작하였다.

처음에는 글 작성을 '1234' 'qwer' 뭐 이런 단순한것으로 진행하다가.. 한글로 작성하니. 아차차 깨지고 있었다.

뭐 스프링에서 제공하는(너무나 자주 사용하던) CharacterEncodingFilter 사용하면 되겠지 하고. 적용을 하였다.


뭐 요즘 스프링 부트 너무 간단하게 잘 되어있어서 요렇게 메서드 하나 추가하면 끝날 줄 알았다.

@Bean

public CharacterEncodingFilter characterEncodingFilter() {

CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();

    characterEncodingFilter.setEncoding("UTF-8");

    characterEncodingFilter.setForceEncoding(true);

    return characterEncodingFilter;

}


자세한 설명은 생략한다. (http://theeye.pe.kr/archives/2206 참고 부탁드립니다 ^^;)


음 그런데.. 여전히 한글이 깨지고 있었다.



안되는것이 조금 이상하지만(?! -_-;) 뭔가 방식이 틀렸나? 하고 이전에 밀키2 때 작성한 코드를 보았다.


FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());

encodingFilter.setInitParameter("encoding", "UTF-8");

encodingFilter.setInitParameter("forceEncoding", "true");

encodingFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");


이 코드는 스프링 3.x 부터 web.xml 대신 Java코드로 설정을 진행하던 부분이다.

위부분을 적용해도 안되었다. 음...


새벽이라 무엇에 홀린것인가 하고.. 인터넷 막 찾아보니..

아주 오래전(그래봐야 2~3년 전 스프링 2.x)에 web.xml 에 필터 넣어 사용하던 방식까지 발견하였다 -_-;;;


<filter>

<filter-name>Character Encoding Filter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>Character Encoding Filter</filter-name>

<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>

<url-pattern>/*</url-pattern>

</filter-mapping>



요즘 누가...;;


다시 정신을 가다듬고. 올해 초 사내 프로젝트로 작성한 코드를 살펴보았다.

처음 설명한 @Bean public CharacterEncodingFilter characterEncodingFilter() { ...

방식으로 잘 동작하고 있었다;;


이건 아니다 싶어서 잽싸게 스프링 부트 테스트 프로젝트를 하나 만들었다~

만들어서 테스트 해보니....

역시 처음 설명한 방식으로 한글이 잘 동작하는것이었다 ㅠ 뭔가 밀키가 문제가 있었다...


그래서 밀키 코드를 찬찬히 살펴보았다.

몇분 볼 필요도 없이 설정용 class를 보다보니.. 스프링 시큐리티가 보였다.

아... 그냥 본능적으로.. 이부분임을 인지하고 구글링을 시작하였다.


http://stackoverflow.com/a/23051264/2304188

(https://stackoverflow.com/questions/20863489/characterencodingfilter-dont-work-together-with-spring-security-3-2-0/23051264#23051264)


바로 이거였다. ㅠㅠ

코드에 적용하니. 바로 한글 입력 가능!! ㅠㅠ


SpringSecurity 사용시. CsrfFilter 앞에 CharacterEncodingFilter를 놓아야 한다.


@Configuration

@EnableWebMvcSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        CharacterEncodingFilter filter = new CharacterEncodingFilter();

        filter.setEncoding("UTF-8");

        filter.setForceEncoding(true);

        http.addFilterBefore(filter,CsrfFilter.class);

        //rest of your code   

    }

//rest of your code

}


이렇게 적용 가능하다.


두시간만의 삽질을 끝내고 잠을 잘 수 있었다.


우리나라 개발자들에게 한글 문제는 아주 오래전부터 있어왔고...

앞으로도 계속 지켜봐야 할 문제인것 같다. (요즘은 국제화 이슈로 전 세계 개발자들의 고민거리일까?)


이렇게 올해는 다 가고 ㅋㅋㅋ