Spring | Filter와 Interceptor

바다·2024년 6월 3일
0

Spring

목록 보기
8/13
post-thumbnail

모의면접 시간에 이런 질문을 받았다

"Filter와 Interceptor의 공통점과 차이점을 말해주세요"

Filter는 들어봤지만... Interceptor... 어디서 들어보긴 했는데... 응... 모르겠네?

그렇게 모의면접에서 한 문제를 아주 절어버렸고, 그렇게 FilterInterceptor의 차이가 무엇인지 알아보려고 한다 😇


1. 필터(Servlet Filter)

1) 필터(Filter)란?

Filter는 J2EE 표준 스펙 기능으로 Dispatcher Servlet 에 요청이 전달되기 전,후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다

한 마디로, Filter는 Servlet이 지원하는 수문장이며
스프링 범위 밖에서 먼저 처리가 된다

필터의 흐름

필터를 적용하면 필터가 호출된 다음에 서블릿이 호출되게 된다
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 컨트롤러

필터의 제한

정상적인 요청일 경우
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 컨트롤러

비정상적인 요청이라고 판단될 경우, 해당 필터에서 끝을 낼 수 있다
HTTP 요청 👉 WAS 👉 필터 (적절하지 않은 요청이라고 판단, 서블릿 호출 X)

필터 체인

필터는 체인으로 구성되어, 중간에 필터를 자유롭게 추가할 수 있다
HTTP 요청 👉 WAS 👉 필터1 👉 필터2 👉 필터3 👉 서블릿 👉 컨트롤러

2) 필터 인터페이스

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()

  • url-pattern에 맞는 모든 HTTP 요청이 서블릿으로 전달되기 전에 실행되는 메소드
  • 필터의 로직을 구현하면 된다
  • chain.doFilter()를 해주어야 다음 filter로 넘어간다

destroy()

  • 필터 객체를 서비스에서 제거하고 사용하는 자원을 반환하기 위한 메소드
  • 필터 종료 메소드
  • 서블릿 컨테이너가 종료될 때 호출된다

2. 인터셉터(Spring Interceptor)

1) 인터셉터(Interceptor) 란?

서블릿에서 기능을 제공하는 필터와는 다르게, 인터셉터는 Spring MVC가 기능을 제공한다

필터와 인터셉터 모두 과 관련된 공통 관심사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다

인터셉터의 흐름

HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터 👉 컨트롤러

  • 스프링 인터셉터는 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출된다
  • 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 서블릿 이후에 등장하게 된다
  • 스프링 인터셉터에도 URL 패턴을 적용할 수 있는데, 서블릿 URL 패턴과는 다르고, 매우 정밀하게 설정할 수 있다

인터셉터의 제한

정상적인 요청
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터 👉 컨트롤러

비정상적인 요청이라고 판단될 경우, 해당 인터셉터에서 끝을 낼 수 있다
HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터(적절하지 않은 요청이라고 판단, 컨트롤러 호출 X)

인터셉터 체인

인터셉터는 체인으로 구성되기 때문에 중간에 인터셉터를 자유롭게 추가할 수 있다

HTTP 요청 👉 WAS 👉 필터 👉 서블릿 👉 인터셉터1 👉 인터셉터2 👉 인터셉터3 👉 컨트롤러

2) 인터셉터 인터페이스

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 {}
}

preHandle()

  • 컨트롤러 호출 전에 호출
  • 컨트롤러 이전에 처리해야 하는 전처리 작업이나 요청 정보를 가공하거나 추가하는 경우에 사용
  • preHandle의 응답값이 true이면 다음으로 진행, flase이면 더 진행하지 않는다

postHandle()

  • 컨트롤러 호출 후에 호출
  • 컨트롤러 이후에 처리해야 하는 후처리 작업이 있을 때 사용

afterCopletion()

  • 뷰가 렌더링 된 이후에 호출
  • 요청 처리 중에 사용한 리소스를 반환할 때 사용

3. 필터와 인터셉터의 공통점 및 차이점

공통점

비즈니스 로직과 분리되어 특정 요구사항 (보안, 인증, 인코딩 등)을 만족시켜야 할 때 적용

차이점

필터

  • Request와 Response를 조작 가능
  • 웹 컨테이너에서 관리됨
  • 용도
    • 공통된 보안 및 인증/인가 관련 작업
    • 모든 요청에 대한 로깅 또는 감사
    • 이미지/데이터 압축 및 문자열 인코딩
    • Spring과 분리되어야 하는 기능

인터셉터

  • Request와 Response 조작 불가
  • 스프링 컨테이너에서 관리됨
  • 용도
    • 세부적인 보안 및 인증/인가 공통 작업
    • API 호출에 대한 로깅 또는 감사
    • Controller로 넘겨 주는 정보(데이터)의 가공
profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글