어 나 갱수.

[Spring] 필터(Filter)랑 인터셉터(Interceptor) 🐻 본문

Spring

[Spring] 필터(Filter)랑 인터셉터(Interceptor) 🐻

김경수 2023. 8. 1. 01:54
728x90

필터(Filter) 란?

필터는 말 그대로 요청과 응답을 거른 뒤 정제하는 역할을 한다.

 

필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 요청에 대한 부가적인 기능을 해주는 역할을 한다.

디스패처 서블릿은 스프링 가장 앞단에 위치하는 컨트롤러이므로, 필터는 스프링 범위 밖에서 작동한다.

스프링 범위 밖에서 작동하니 스프링이 관리하는 것이 아닌 톰캣과 같은 웹 컨테이너가 관리를 한다.

필터의 흐름

  • 동작 과정
    • HTTP 요청 → WAS → (필터) → (디스패처)서블릿 → 컨트롤러 순으로 동작한다.(스프링에선 서블릿이 디스패처 서블릿이 된다.)
    • 만약 필터에서 걸러지게 된다면 디스패처 서블릿을 호출하지 않는다.
  • 필터 체인
    • HTTP 요청 -> WAS -> (필터1) -> (필터2) -> ... -> (디스패처) 서블릿 -> 컨트롤러
    • 필터를 연속해서 추가 시킬 수 있다.
    • 등록된 순서에 따라서 동작이 달라진다.

필터를 구현할 땐 javax.servlet의 Filter 인터페이스를 사용한다.

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() - 필터 인스턴스 초기화 시 실행되는 메서드
  • doFilter() - 클라이언트의 요청/응답 처리 시 실행되는 메서드
  • destroy() - 필터 인스턴스가 제거될 때 실행되는 메서드

 

인터셉터(Interceptor) 란?

인터셉터는 쉽게 말해 요청에 대한 작업 전/후로 가로챈다고 보면 된다.

 

인터셉터(Interceptor)는 필터와 달리 스프링에서 제공하는 기술이다.

디스페처 서블릿이 컨트롤러로 요청하기 전/후에 요청에 대한 부가적인 기능을 해주는 역할을 한다. 스프링이 제공하는 기술이기 때문에 웹 컨테이너가 관리하지 않고 스프링 컨테이너가 관리를 한다. 작동도 스프링 컨테이너에서 작동한다.

인터셉터의 흐름

  • 동작 과정
    • HTTP 요청 -> WAS -> 필터 -> (디스패처)서블릿 -> (인터셉터) -> 컨트롤러 순으로 동작
    • 인터셉터에서 걸러지게 된다면 컨트롤러가 동작하지 않는다.
  • 인터셉터 체인
    • HTTP요청 -> WAS -> 필터 -> (디스패처)서블릿 -> (인터셉터 1) -> (인터셉터 2) ->... -> 컨트롤러

 핸들러를 구현할때는 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() - preHandle 메서드는 지정된 컨트롤러의 동작 이전에 가로채는 역할로 사용합니다.
  • postHandle() - 지정된 컨트롤러의 동작 이후에 처리한다.
  • afterCompletion() - Dispatcherserlvet의 화면 처리(뷰)가 완료된 상태에서 처리합니다.

Reference

728x90