Filter VS Interceptor

bp.chys·2020년 5월 10일
1

Spring Framework

목록 보기
4/15

필터와 인터셉터

종종 우리는 어디선가(?) 필터와 인터셉터를 비교하는 질문을 듣곤한다. 분명 비슷한 부분이 있기 때문에 그 명확한 차이를 구별하는 것이 중요하다고 생각한다. 그렇다면 필터와 인터셉터의 비슷한 점은 무엇인가?

그것은 바로 핸들러 메서드가 호출되기 전/후에 HTTP 요청에 접근하여 특수한 작업을 할 수 있다는 것이다. 두 개 이상부터 모든 핸들러 메서드에 걸쳐 중복으로 적용되는 작업이라면, 필터 또는 인터셉터를 활용해서 코드 중복을 없애고, 유지보수가 편한 코드를 작성할 수 있을 것이다.

이 글에서 알아볼 필터와 인터셉터의 차이는 바로 작업이 수행되는 시점 그리고 생성되어 존재하는 위치라고 할 수 있다.

아래 Spring MVC request life cycle 도식도를 참고하여 그 차이를 더 자세히 알아보자.

필터(Filter)

  • 필터는 DispatcherServlet 전에 생성되고 위치하므로 요청을 가장 먼저 맞이하게 된다.
  • 모든 요청에 대해 일괄적으로 수행된다.
  • 여러 개의 필터를 둘 수 있고, @Order 어노테이션으로 순서를 지정할 수 있다.
  • Spring Context 밖에서 정의되기 때문에 Bean들을 사용하는 비즈니스 로직과 관련된 작업을 수행할 수 없다.
  • 따라서 대표적으로 인코딩, CORS, XSS, LOG, 인증 등 을 구현하는 목적으로 사용한다.
  • Filter 인터페이스를 구현하거나, OncePerRequestFilter 같은 클래스를 상속하여 doFilter()를 구현한다.

인터셉터(Interceptor)

  • 인터셉터는 DispatcherServlet에서 핸들러 매핑을 지나, 컨트롤러로 요청을 전달할 때 중간에 요청을 가로채서 특별한 처리를 해줄 수 있다.
  • 여러 개의 인터셉터를 체이닝하여 사용할 수 있다.
  • 특정 URI 해당하는 요청에만 인터셉터를 거치도록 설정할 수 있다.
  • 스프링 컨텍스트에 정의된 모든 빈 객체에 접근할 수 있다.
  • 대표적으로 로그인(인증) 체크, 권한(인가) 체크, 프로그램 실행시간 계산작업 로그 확인 등을 할 수 있다.
  • HadlerInterceptor라는 인터페이스를 통해 preHandle, postHandle, afterCompletion 메서드를 구현할 수 있다.

결론

필터와 인터셉터는 여러 요청에 일관된 작업을 할 때 코드의 중복을 줄이면서 유용하게 활용할 수 있다. 둘의 가장 큰 차이는 생성되는 위치이고 그 차이가 결국 디테일 적으로 수행할 수 있는 범위가 다르게 만든다.

필터에서는 애플리케이션의 비즈니스 로직과 관계없는 작업이 수행되고, 인터셉터에서는 애플리케이션 비즈니스 로직과 관계있는 작업이 수행된다.

profile
하루에 한걸음씩, 꾸준히

0개의 댓글