Spring-Filter, Interceptor

김종조·2024년 4월 22일
post-thumbnail

Filter

요청, 응답 시 걸러내거나 추가할 수 있는 객체

Dispatcher Servlet 보다 앞단에 존재하고 있고 Dispatcher Servlet에 요청이 전달되기 전/후의 요청에 대한 부가 작업을 처리할 수 있는 기능을 제공한다.

스프링 컨테이너가 관리하는것이 아니라 서블릿 컨테이너에 의해 관리가 되는 것이다.
(스프링 빈으로 등록이 가능하다.)



Filter의 메소드

Filter를 사용하기 위해서는 jakarta.servlet.Filter 인터페이스를 상속을 받아야 하며 3가지의 메소드를 가지고 있다.

  • init( )

    필터 객체를 초기화 하고 서비스에 추가하기 위한 메소드이다.
    웹 컨테이너가 1회 init()을 호출하여 필터 객체를 초기화하면 이후 요청들은 doFilter()를 통해 처리된다.

  • doFilter( )

    HTTP 요청이 Dispatcher Servlet으로 전달되기 전에 웹 컨테이너에 의해 실행되는 메소드이다.
    파라미터 - FilterChain
    다음 대상으로 요청을 전달할 수 있게한다.
    (다음 필터가 없으면 Dispatcher Servlet으로 전달)

  • destory( )

    필터 객체를 제거하고 사용하는 자원을 반환하기 위한 메소드이다.
    웹 컨테이너에서 호출하여 필터 객체를 종료하면 이후에는 doFilter에 의해 처리되지 않는다.




Interceptor

요청, 응답을 가로채는 객체

Dispatcher Servlet이 Controller를 호출하기 전/후에 Interceptor가 끼어들어 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다.
스프링 컨텍스트에서 동작을 한다. (스프링에서 관리)

Dispatcher Servlet이 Handler Mapping을 통해서 Controller를 찾도록 요청해서 그 결과로 HandlerExecutionChain을 돌려준다.

HandlerExecutionChain은 1개 이상의 Interceptor가 등록되어 있다면 순차적으로 Interceptor들을 거쳐서 Controller가 실행되도록 하고, Interceptor가 없다면 바로 Controller를 실행한다.

Interceptor의 메소드

Interceptor를 추가하기 위해서는 HandlerInterceptor 인터페이스를 상속 받아서 구현 해야 하며 3개의 메소드를 가지고 있다.

  • preHandle( )

    Controller가 호출되기 전에 실행된다.(전처리)
    Dispatcher Servlet -> Controller 사이 수행

  • postHandle( )

    Controller가 호출된 후에 실행된다.(후처리)
    Controller -> Dispatcher Servlet 사이 수행

  • afterCompletion( )

    모든 작업이 완료된 후에 실행된다.(View 렌더링 후)



차이점

필터가 다음 필터를 호출 할때 request, response 객체를 넘겨주므로 우리가 원하는 request, response 객체를 넣어줄 수 있다.

인터셉트는 Dispatcher Servlet이 여러 인터셉터 목록을 가지고 있고, 순차적으로 실행시킨다. true를 반환하면 다음 인터셉터가 실행되거나 컨트롤러로 요청이 전달되며, false가 반환되면 요청이 중단된다.(request, response 객체를 넘겨줄 수 없다.)



Filter는 특정 요청과 컨트롤러에 관계없이 전역적으로 처리해야 하는 작업이나, 웹 어플리케이션에 전반적으로 사용되는 기능을 구현할 때 적용한다.
(스프링과 무관하게 전역적으로 처리해야 하는 작업들을 처리할 수 있다.)

  • 보안 및 인증/인가 관련 작업
  • 모든 요청에 대한 로깅 또는 검사
  • 이미지/데이터 압축 및 문자열 인코딩
  • Spring과 분리되어야 하는 기능



Interceptor클라이언트 요청과 관련된 작업에 대해 추가적인 요구사항을 만족해야 할 때 적용한다.
(클라이언트의 요청과 관련되어 전역적으로 처리해야 하는 작업들을 처리할 수 있다.)

  • 세부적인 보안 및 인증/인가 공통 작업
  • API 호출에 대한 로깅 또는 검사
  • Controller로 넘겨주는 정보(데이터)의 가공
profile
웹 개발 공부 기록

3개의 댓글

comment-user-thumbnail
2024년 4월 23일

filter와 Interceptor 차이를 표로 정리해주셔서 이해하는데 도움이 되었습니다~ 예시도 추가 해주실 수 있나요? 😊

2개의 답글