2월 04, 2024

[Servlet Filter] 한글깨짐 Filter에서 Encoding 바꾸어서 해결해보기

 Servlet으로 한글 value를 POST로 넘겨주면 받을 때 한글이 깨져 보이는 경우가 있다. 

여기서 Encoding 방식을 바꿔주면 되는데, Servlet에서 사용되는 Filter를 사용해서 쉽게 구현을 할 수 있다. 


1. Servlet Filter란?

Client로부터 Server로 요청이 들어오기 전에 서블릿을 거쳐서 filtering하는 것을 Servlet Filter (서블릿 필터) 라고 한다. 공통적인 기능들을 서블릿이 호출되기 전에 전처리, 혹은 후처리하고 싶을 경우 Servlet Filter로 구현할 수 있다. 


2. Filter 구현시 override 필요한 메소드


특정 class를 Filter를 implements 하기 위해서는 위 세 가지 method를 구현해주어야 한다. 

1) init(filterConfig:FilterConfig)

=> 서블릿 컨테이너가 필터 인스턴스를 초기화하기 위해서 호출하는 메소드

2) doFilter(request:ServletRequest, response:ServletResponse, chain:FilterChain)

=> 필터에서 구현해야 하는 로직을 구현하는 메소드

3) destroy() : void

=> 필터를 종료하기 전에 호출하는 메소드



우리가 흔히 Servlet에서 Filter가 이루어진다고 하는 것은 doFilter() 메소드에서 구현을 하면 된다. 

@Override
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain) 
throws IOException, ServletException {
    //전처리

chain.doFilter(request, response);
    //후처리
}


필터는 요청을 받을 때 수행이 되고 chain.doFilter() 를 통해 다음 부분으로 넘겨주게 된다. 따라서 chian.doFilter 메소드 전에 전처리를 해주고 이후에 후처리를 해주면 된다. 


3. Encoding 방식 Servlet Filter를 통해 바꾸어보기

우리는 실제 filtering이 이루어지는 doFilter를 통해 Encoding 방식을 UTF-8로 바꾸어줄 것이다. 또한 Filter를 구현하여 새로운 class를 만들어줄 것이다. 

package org.example.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/+")
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig)
    throws ServletException {

}

@Override
public void doFilter(ServletRequest request,
    ServletResponse response, FilterChain chain) 
    throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

chain.doFilter(request, response);
}

@Override
public void destroy() {

}
}


EncodingFilter라는 새로운 class를 만들었고 Filter를 구현해주었다. Filter를 implmenets 하기 위해서는 init(), doFilter(), destroy() 메소드를 모두 override해주어야 하기 때문에 모두 @Override를 해주었다. 


init() 과 destroy()에는 특별히 추가해야 하는 메소드는 없고 doFilter 메소드에 전처리 과정으로 CharacterEncoding을 설정해주었다. 


또 주목해야 할 것은 

@WebFilter라는 annotation인데 이는 필터링 경로를 설정해주는 것이다. 특정 경로로 요청이 들어왔을 때 filtering이 작동하는 것이다. 


만약 어떤 경로로 들어오든 Servlet Filter를 작동시키고 싶다면 위 코드처럼 

@WebFilter("/+")

라고 써주면 된다.