모의면접 시간에 이런 질문을 받았다
"Filter와 Interceptor의 공통점과 차이점을 말해주세요"
Filter는 들어봤지만... Interceptor... 어디서 들어보긴 했는데... 응... 모르겠네?
그렇게 모의면접에서 한 문제를 아주 절어버렸고, 그렇게 Filter
와 Interceptor
의 차이가 무엇인지 알아보려고 한다 😇
Filter는 J2EE 표준 스펙 기능으로 Dispatcher Servlet
에 요청이 전달되기 전,후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리
할 수 있는 기능을 제공한다
한 마디로, Filter는 Servlet이 지원하는 수문장이며
스프링 범위 밖에서 먼저 처리가 된다
필터를 적용하면 필터가 호출된 다음에 서블릿이 호출되게 된다
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 컨트롤러
정상적인 요청일 경우
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 컨트롤러
비정상적인 요청이라고 판단될 경우, 해당 필터에서 끝을 낼 수 있다
HTTP 요청 👉 WAS 👉 필터 (적절하지 않은 요청이라고 판단, 서블릿 호출 X)
필터는 체인으로 구성되어, 중간에 필터를 자유롭게 추가할 수 있다
HTTP 요청 👉 WAS 👉 필터1 👉 필터2 👉 필터3 👉 서블릿 👉 컨트롤러
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() {}
}
서블릿에서 기능을 제공하는 필터와는 다르게, 인터셉터는 Spring MVC가 기능을 제공한다
필터와 인터셉터 모두 웹
과 관련된 공통 관심사항을 처리하지만, 적용되는 순서와 범위
, 그리고 사용방법
이 다르다
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터 👉 컨트롤러
정상적인 요청
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터 👉 컨트롤러
비정상적인 요청이라고 판단될 경우, 해당 인터셉터에서 끝을 낼 수 있다
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터(적절하지 않은 요청이라고 판단, 컨트롤러 호출 X)
인터셉터는 체인으로 구성되기 때문에 중간에 인터셉터를 자유롭게 추가할 수 있다
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터1 👉 인터셉터2 👉 인터셉터3 👉 컨트롤러
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
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 {}
}
비즈니스 로직과 분리되어 특정 요구사항 (보안, 인증, 인코딩 등)을 만족시켜야 할 때
적용
웹 컨테이너
에서 관리됨스프링 컨테이너에
서 관리됨