🟧 01. 필터(Filter)와 인터셉터(Interceptor)
Filter와 Interceptor는 위치부터 차이가 있다.
Filter는 서블릿 컨테이너(Servlet Container)가 관리하고 Interceptor는 스프링 컨테이너(Spring Container)가 관리하고 있다.

클라이언트의 요청이 들어왔을 때 DispatcherServlet에 들어가기 전과 들어간 후로 Filter와 Interceptor가 작업을 처리하는 것을 볼 수 있다. Filter와 Interceptor는 무슨 일을 하고 있으며 어떻게 사용할 수 있을지 알아보자.
🟧 02. 필터(Filter)는 어떻게 이용되고 있을까 ?

그림에서 볼 수 있듯이 필터(Filter)는 서블릿 컨테이너(Servlet Container)에서 관리되고 있다.
필터 용도
- 공통 인증/인가
- 로깅
- 이미지/데이터 압축 및 문자열 인코딩
주로 필터는 스프링 시큐리티(Spring Security)에서 사용된다.
🟢 Filter 내부 구현
Filter 인터페이스에는 init(), doFilter(), destroy() 메서드가 있다.
doFilter() 메서드가 개발자가 구현한 기능이 사용되는 중요한 부분이다.
doFilter() 메서드의 파라미터에 필터 체인(FilterChain)을 이용해서 다음 필터에게 조작한 request 객체를 넘겨줄 수도 있다.
public interface Filter() {
default void init(FilterConfig filterConfig) throws ServletException {}
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
default void destroy() {}
}
FilterChain의 doFilter() 메서드를 통해 다음 필터(없을 경우 디스패처 서블릿)에 넘기며 체인 형식으로 이용할 수 있다.

🟢 FilterChain의 doFilter() 내부 구현 - OncePerRequestFilter
FilterChain의 doFilter() 메서드 내부 구현 코드로 보여주기 위해서 OncePerRequestFilter를 가져왔다.

GenericFilterBean
- Filter에서 얻어올 수 없는 정보였던 스프링 설정 정보를 가져오기 위해 확장된 추상 클래스다.
OncePerRequestFilter
- GenericFilterBean을 확장한 추상 클래스로 필터를 한 번만 호출할 수 있도록 고안됐다.
FilterChain.doFilter(request, response) 메서드를 이용해서 다음 필터에게 파라미터 request, response를 넘겨주는 것을 확인할 수 있다.

이러한 이유로 클라이언트 요청으로 들어온 데이터를 가지고 인증/인가 작업이 가능하며 로깅이 필요하다면 Request, Response 객체를 조작해서 다음 필터에게 넘겨줄 수 있다.
🟧 03. 인터셉터(Interceptor)는 어떻게 이용되고 있을까 ?

필터와 다르게 인터셉터는 스프링이 제공하고 있는 기술이다.
디스패처 서블릿이 컨트롤러를 호출하기 전/후에 인터셉터를 이용할 수 있다.
인터셉터는 스프링 영역에서 관리되고 있다.
인터셉터 (Interceptor)
- 세부적인 인증/인가 공통 작업
- 컨트롤러로 넘겨주는 데이터 가공
🟢 핸들러 인터셉터 (HandlerInterceptor)
세가지 메서드가 있다.
- preHandle()
- 컨트롤러 호출 전 실행
- Object handler는 HandlerMethod 정보가 있다.
- HanlderMethod 란 컨트롤러의 추상화된 메서드 정보가 담겨있다.
- postHandle()
- 컨트롤러 호출 후 실행
- ModelAndView를 조작할 수 있다.
- afterCompletion()
- 모든 작업이 완료된 후 실행
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 {
}
}
🟢 실행 체인 (HandlerExecutionChain)

핸들러 매핑(HandlerMapping)은 적절한 컨트롤러를 찾게되고 반환값으로 실행 체인(HandlerExecutionChain)을 반환한다.
아래 코드와 같이 URI에 매칭하는 요청에 대해서 인터셉터를 추가한다.

이제 인터셉터들은 실행 체인(HandlerExecutionChain)안에 등록되고 HandlerAdapter가 실제 로직을 호출하기 이전에 순차적으로 인터셉터를 실행되게 된다.

아래 코드는 DispatcherServlet의 doDispatch() 메서드 내부 구현이다.
실행 체인에 등록된 인터셉터들의 preHandle() 메서드를 각각 호출하게 되고 하나라도 false를 반환할 시에 doDispatch() 메서드가 종료된다.
- mappedHandler 변수 타입 : HandlerExecutionChain
- ha 변수 타입 : HandlerAdapter

🟧 04. 필터와 인터셉터의 특징, 용도 차이
필터와 인터셉터가 어떤 느낌으로 동작하고 있는지 알 수 있었다. 이제 정리해보자.
필터(Filter) 특징
- 서블릿 영역에서 관리된다.
- 요청/응답 객체를 조작해서 다른 객체를 다음 필터에 넘길 수 있다.
- 스프링과 관계없는 작업을 처리할 수 있다.
필터(Filter) 관련 작업
- 공통적으로 처리할 수 있는 작업
- 스프링과 분리되는 기능
- 보안 검사
- 공통된 인증/인가 작업
인터셉터(Interceptor) 특징
- 스프링 영역에서 관리된다.
- 클라이언트 요청/응답에 대해서 처리할 수 있다.
- 다른 객체를 넘길 수는 없지만 받은 요청/응답 객체의 데이터를 조작할 수는 있다.
인터셉터(Interceptor) 관련 작업
- 스프링과 관련된 작업
- 세부적인 인증/인가 작업
'🍃 스프링' 카테고리의 다른 글
[Spring] 필터(Filter)란 뭘까? (0) | 2023.05.07 |
---|---|
[Spring MVC] 디스패처 서블릿(DispatcherServlet) 둘러보기 (0) | 2023.04.24 |
[Spring MVC - Exception] @ExceptionHandler와 ExceptionHandlerExceptionResolver로 예외 처리하기 (1/2) (0) | 2023.04.17 |
[Spring MVC - ArgumentResolver] ArgumentResolver를 이용해서 컨트롤러 메서드의 파라미터 받기 (6) | 2023.04.13 |
🟧 01. 필터(Filter)와 인터셉터(Interceptor)
Filter와 Interceptor는 위치부터 차이가 있다.
Filter는 서블릿 컨테이너(Servlet Container)가 관리하고 Interceptor는 스프링 컨테이너(Spring Container)가 관리하고 있다.

클라이언트의 요청이 들어왔을 때 DispatcherServlet에 들어가기 전과 들어간 후로 Filter와 Interceptor가 작업을 처리하는 것을 볼 수 있다. Filter와 Interceptor는 무슨 일을 하고 있으며 어떻게 사용할 수 있을지 알아보자.
🟧 02. 필터(Filter)는 어떻게 이용되고 있을까 ?

그림에서 볼 수 있듯이 필터(Filter)는 서블릿 컨테이너(Servlet Container)에서 관리되고 있다.
필터 용도
- 공통 인증/인가
- 로깅
- 이미지/데이터 압축 및 문자열 인코딩
주로 필터는 스프링 시큐리티(Spring Security)에서 사용된다.
🟢 Filter 내부 구현
Filter 인터페이스에는 init(), doFilter(), destroy() 메서드가 있다.
doFilter() 메서드가 개발자가 구현한 기능이 사용되는 중요한 부분이다.
doFilter() 메서드의 파라미터에 필터 체인(FilterChain)을 이용해서 다음 필터에게 조작한 request 객체를 넘겨줄 수도 있다.
public interface Filter() {
default void init(FilterConfig filterConfig) throws ServletException {}
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
default void destroy() {}
}
FilterChain의 doFilter() 메서드를 통해 다음 필터(없을 경우 디스패처 서블릿)에 넘기며 체인 형식으로 이용할 수 있다.

🟢 FilterChain의 doFilter() 내부 구현 - OncePerRequestFilter
FilterChain의 doFilter() 메서드 내부 구현 코드로 보여주기 위해서 OncePerRequestFilter를 가져왔다.

GenericFilterBean
- Filter에서 얻어올 수 없는 정보였던 스프링 설정 정보를 가져오기 위해 확장된 추상 클래스다.
OncePerRequestFilter
- GenericFilterBean을 확장한 추상 클래스로 필터를 한 번만 호출할 수 있도록 고안됐다.
FilterChain.doFilter(request, response) 메서드를 이용해서 다음 필터에게 파라미터 request, response를 넘겨주는 것을 확인할 수 있다.

이러한 이유로 클라이언트 요청으로 들어온 데이터를 가지고 인증/인가 작업이 가능하며 로깅이 필요하다면 Request, Response 객체를 조작해서 다음 필터에게 넘겨줄 수 있다.
🟧 03. 인터셉터(Interceptor)는 어떻게 이용되고 있을까 ?

필터와 다르게 인터셉터는 스프링이 제공하고 있는 기술이다.
디스패처 서블릿이 컨트롤러를 호출하기 전/후에 인터셉터를 이용할 수 있다.
인터셉터는 스프링 영역에서 관리되고 있다.
인터셉터 (Interceptor)
- 세부적인 인증/인가 공통 작업
- 컨트롤러로 넘겨주는 데이터 가공
🟢 핸들러 인터셉터 (HandlerInterceptor)
세가지 메서드가 있다.
- preHandle()
- 컨트롤러 호출 전 실행
- Object handler는 HandlerMethod 정보가 있다.
- HanlderMethod 란 컨트롤러의 추상화된 메서드 정보가 담겨있다.
- postHandle()
- 컨트롤러 호출 후 실행
- ModelAndView를 조작할 수 있다.
- afterCompletion()
- 모든 작업이 완료된 후 실행
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 {
}
}
🟢 실행 체인 (HandlerExecutionChain)

핸들러 매핑(HandlerMapping)은 적절한 컨트롤러를 찾게되고 반환값으로 실행 체인(HandlerExecutionChain)을 반환한다.
아래 코드와 같이 URI에 매칭하는 요청에 대해서 인터셉터를 추가한다.

이제 인터셉터들은 실행 체인(HandlerExecutionChain)안에 등록되고 HandlerAdapter가 실제 로직을 호출하기 이전에 순차적으로 인터셉터를 실행되게 된다.

아래 코드는 DispatcherServlet의 doDispatch() 메서드 내부 구현이다.
실행 체인에 등록된 인터셉터들의 preHandle() 메서드를 각각 호출하게 되고 하나라도 false를 반환할 시에 doDispatch() 메서드가 종료된다.
- mappedHandler 변수 타입 : HandlerExecutionChain
- ha 변수 타입 : HandlerAdapter

🟧 04. 필터와 인터셉터의 특징, 용도 차이
필터와 인터셉터가 어떤 느낌으로 동작하고 있는지 알 수 있었다. 이제 정리해보자.
필터(Filter) 특징
- 서블릿 영역에서 관리된다.
- 요청/응답 객체를 조작해서 다른 객체를 다음 필터에 넘길 수 있다.
- 스프링과 관계없는 작업을 처리할 수 있다.
필터(Filter) 관련 작업
- 공통적으로 처리할 수 있는 작업
- 스프링과 분리되는 기능
- 보안 검사
- 공통된 인증/인가 작업
인터셉터(Interceptor) 특징
- 스프링 영역에서 관리된다.
- 클라이언트 요청/응답에 대해서 처리할 수 있다.
- 다른 객체를 넘길 수는 없지만 받은 요청/응답 객체의 데이터를 조작할 수는 있다.
인터셉터(Interceptor) 관련 작업
- 스프링과 관련된 작업
- 세부적인 인증/인가 작업
'🍃 스프링' 카테고리의 다른 글
[Spring] 필터(Filter)란 뭘까? (0) | 2023.05.07 |
---|---|
[Spring MVC] 디스패처 서블릿(DispatcherServlet) 둘러보기 (0) | 2023.04.24 |
[Spring MVC - Exception] @ExceptionHandler와 ExceptionHandlerExceptionResolver로 예외 처리하기 (1/2) (0) | 2023.04.17 |
[Spring MVC - ArgumentResolver] ArgumentResolver를 이용해서 컨트롤러 메서드의 파라미터 받기 (6) | 2023.04.13 |