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