개발메모/간단정리

[간단정리] Spring - Filter, Interceptor, AOP 특징 및 차이

99C0RN 2022. 10. 25. 18:41

개요

웹 개발을 하다 보면 실제 비즈니스 로직이 호출되기 이전, 이후에 공통적으로 처리해야 할 기능들이 존재하는데, 대표적인 예로 로깅, 인증/인가, 인코딩 변환 등이 있다.

공통적인 기능의 코드를 모든 Controller, Service 레이어에서 작성하게 되면 코드의 중복이 발생하게 되고, 공통 기능 수정이 필요한 경우 중복으로 작성된 모든 코드들을 수정해야하는 번거로움이 생길 수 있다.(수정간에 빠뜨리고 수정하지 않는 코드 또한 생길 수 있음)

따라서, 공통 기능을 모아서 Spring에서 처리 할 수 있는 방법으로 이번 간단정리의 주제인 3가지가 주로 언급된다.

1. Filter

2. Interceptor

3. AOP

3가지 방법은 약간의 차이점이 존재한다.


실행 순서

Filter와 Interceptor 는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.

 

실행 순서를 보면 다음과 같다.

  1. Filter는 Spring의 가장 앞단에 존재하는 Dispatcher Servlet(디스패처 서블릿) 전/후에 처리된다.
    (Filter는 Spring 범위 밖에서 처리. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리 되는 것)
  2. Interceptor는 Spring에서 제공하는 기술로써, Dispatcher Servlet이 Controller를 호출하기 전/후에 처리된다.
  3. AOP는 Filter/Interceptor와 달리 다양한 지점에 자유롭게 설정이 가능하다.
    (Filter/Interceptor는 URL 패턴으로 적용되는 반면, AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 적용 대상을 지정할 수 있다.)

Filter(필터)

Filter는 일반적으로 Spring과 무관하게 전역적으로 처리해야 하는 작업들을 처리할때 사용한다.

  • Filter는 Spring이 실행 되기전 실행되며 톰캣과 같은 웹 컨테이너(WAS)에서 처리를 해주게 된다.
  • Request / Response에 대한 조작이 가능함
    (HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 처리 함)

따라서 아래와 같은 처리에 적합하다.

  • 공통된 보안 및 인증/인가 관련 작업(XSS방어)
  • 이미지/데이터 압축 및 문자열 인코딩 변환 처리
  • Spring과 분리되어야 하는 기능
  • 모든 요청에 대한 로깅

Interceptor(인터셉터)

Interceptor는 주로 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 작업을 처리할때 사용한다.

  • Interceptor는 Dispatcher Servlet에 N개 등록 될 수 있다. DS가 해당 요청을 처리 가능한 Intercepter에게 할당
  • 스프링의 모든 빈 객체에 접근 할 수있다.

따라서 아래와 같은 처리에 적합하다.

  • 세부적인 보안 및 인증/인가 공통 작업( 특정 사용자는 특정 기능을 사용 못하게 막음)
  • API 호출에 대한 로깅
  • Controller로 넘겨주는 정보(데이터)의 가공
    (필터와 다르게 HttpServletRequest나 HttpServletResponse 등과 같은 객체를 제공받으므로 객체 자체를 조작할 수는 없음, 대신 해당 객체가 내부적으로 갖는 값은 조작할 수 있으므로 컨트롤러로 넘겨주기 위한 정보를 가공 가능
    ex) JWT 토큰 정보를 파싱해서 컨트롤러에게 사용자의 정보를 제공하도록 가공)

AOP(Aspect Oriented Programming)

Aop는 주로 로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.

 

Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.
Interceptor와 Filter는 주소(URL)로 대상을 구분해서 걸러내야하는 반면,
AOP는 주소, 파라미터, 애노테이션 등 PointCut이 지원하는 다양한 방법으로 대상을 지정할 수 있다.

즉, URL 패턴 기반이 아닌 PointCut 단위로 동작한다.
이 때문에 비즈니스 로직의 메서드 실행 전, 후 단위까지 핸들링 할 수 있다.