It's going to be one day 🍀

안녕하세요! 매일 매일 공부하려고 노력하는 백엔드 개발자 지망생의 공부 흔적입니다.

Back-End/Spring

[Spring] 필터와 인터셉터

2jin2 2024. 3. 18. 15:49

필터와 인터셉터의 흐름

필터와 인터셉터 모두 스프링의 컨트롤러가 실행되기 전과 후에 실행됨

 

클라이언트의 요청이 처리되는 순서 :

HTTP 요청 → 필터 → 인터셉터 → Controller → 인터셉터 → 필터 → 응답

-> 클라이언트의 요청을 필터가 먼저 처리하고 인터셉터가 그 다음에 처리함을 알 수 있음.


필터

스프링의 Dispatcher Servlet에 요청이 전달되기 전/후에 실행됨. WAS(서블릿 컨테이너)에서 실행되므로 스프링의 범위 밖에서 처리가 된다는 특징이 있음.

필터를 사용하기 위해서는 Filter 인터페이스를 구현해야함.

public interface Filter {

    public default void init(FilterConfig filterConfig) throws ServletException {}
    
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;
            
    public default void destroy() {}

}
  • init()
    • 필터를 초기화하기위한 메소드. 최초 1회만 실행됨.
  • doFilter()
    • 클라이언트의 요청이 올 때마다 실행됨. 매개변수로 request와 response를 받아 chain.doFilter를 통해 값을 변경하여 넘길 수 있음.
    chain.doFilter(request, response);
    
  • destroy()
    • 필터 객체를 제거하고 자원을 반환하기 위한 메소드임. 서블릿 컨테이너가 종료될 때 1회만 실행됨.

필터 체인

여러 개의 필터를 만들어놓고 이를 순서대로 연결하여 사용할 수도 있음.

ex) 3개의 필터 연결

Client 요청 → 필터1 → 필터2 → 필터3 → Controller

Controller → 필터3 → 필터2 → 필터1 → client 응답


인터셉터

인터셉터는 스프링 MVC가 제공하는 기능임. Controller가 실행되기 전/후에 실행됨.

인터셉터를 사용하기 위해선 HandlerInterceptor 인터페이스를 구현해야함.

public interface HandlerInterceptor 

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
	throws Exception {
        return true;
    }
    
    default void postHandle(HttpServletRequest request, HttpServletResponse response,
	Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
        
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response,
	Object handler, @Nullable Exception ex) throws Exception {
    }
}
  • preHandle()
    • 컨트롤러 호출 전에 실행됨. 반환 타입이 boolean 타입으로 true일 경우 계속 진행하고 false일 경우 진행을 멈춤.
  • postHandle()
    • 컨트롤러 실행 직후에 실행됨. 컨트롤러가 반환하는 ModelAndView를 받을 수 있음. 컨트롤러에서 예외가 발생하면 실행되지 않음.
  • afterCompletion()
    • afterCompletion은 항상 호출됨. (Controller에서 예외가 발생해도) 컨트롤러가 요청 처리가 완료된 후에 실행됨.

인터셉터 체인

여러 개의 인터셉터를 만들어놓고 이를 순서대로 연결하여 사용할 수도 있음. 이를 인터셉터 체인이라고 함.

ex) 1개의 필터와 3개의 인터셉터가 있을 때

Client 요청 → 필터 → 인터셉터1 → 인터셉터2 → 인터셉터3 → Controller 


필터(Filter)와 인터셉터(Interceptor)의 차이

- 필터의 경우 Web Context 안에서 실행되며, 인터셉터의 경우 Spring Context 안에서 실행됨.

- 필터의 경우 HttpServlet request / response 객체를 조작할 수 있지만 인터셉터의 경우엔 불가능하다.