Spring AOP, 필터 및 인터셉터의 차이점

Spring Boot를 사용할 때 AOP, Filter, Interceptor를 통해 어플리케이션의 일반적인 로직을 처리할 때 자주 사용된다.

이 세 가지 차이점을 알고 활용하면 더 깨끗한 코드를 작성할 수 있습니다.

그래서 AOP, Filter, Interceptor의 차이점에 대해 간단히 설명하겠습니다.

AOP, 필터 및 인터셉터의 차이점

그림

  • Spring으로 개발할 때 공통적으로 처리해야 할 업무많이있다.

    로그인, 토큰 처리 및 로그 처리와 같은 많은 작업이 모든 공통 프로젝트에 적용되어야 합니다.


    하지만 모든 코드에 적용하면 코드가 복잡해지고 가독성이 떨어질 가능성이 높습니다.

    따라서 Tomcat과 Spring은 공통 작업을 구분하여 별도로 처리하는 기능을 제공합니다.

    1. 필터 – WAS(Tomcat): Servlet 엔터티에서 실행
    2. Interceptor – Spring: 서블릿 단위로 실행
    3. AOP – Spring: 메소드 이전에 프록시 패턴 형태로 실행

AOP, 필터 및 인터셉터 흐름

  • 서버가 실행되고 서블릿이 로드되는 동안 init()이 실행된 후 doFilter가 실행됩니다.

  • 컨트롤러에 들어가기 전에 PreHandler가 실행됩니다.

  • Controller, postHandler, Completion 및 doFilter에서 나오는 것은 괜찮습니다.

  • 서블릿이 종료되면 Destroy가 실행됩니다.

필터

- WAS로 들어온 요청을 Servlet으로 보내고 또 Servlet이 작성한 응답을 클라이언트로 보내기 전에 특별한 처리가 필요한 경우에 사용되는 필터.
- 체인 형태의 구조
- 클라이언트 요청 정보를 제공하는 SerlvetRequest 객체를  정의함.
- Servlet 컨테이너는 ServletRequest 객체를 생성하고 이를 Servlet service() 메소드에 인수로 전달.
  1. 왜 사용

    • 서블릿 실행 전후에 일부 작업을 수행하는 데 사용됩니다.

    • 반복적으로 수행해야 하는 작업을 수행하기 위해 서블릿에서 공동 작업을 수행하는 이점.
      ex) 데이터 암호화, 복호화(JWT), 문자 인코딩, 디코딩, 로그
  2. 방법

    • init() : 필터 객체가 생성되고 준비를 위해 한 번만 호출됩니다.

    • doFilter() : doFilter()는 필터와 관련된 URL에 대한 요청이 수신될 때마다 호출됩니다.

      • filterChain은 다음 필터를 가리키고 filterChain.doFilter()다음 필터를 호출합니다.

      • 필터가 없으면 서블릿의 Service()가 내부적으로 호출됩니다.

    • Destroy() – WAS를 종료하기 전에 한 번만 호출됩니다.

      $서블릿이 실행되기 전의 작업은 filterChain.doFilter() 이전 코드에 써야한다.

      $서블릿이 실행된 후 응답하는 작업은 filterChain.doFilter() 이후 코드에 써야한다.

  3. 필터 배열

    • 필터를 배치하는 방법에는 web.xml 및 Java 주석의 두 가지가 있습니다.

그림

그림

인터셉터

  • 요청 전/후 작업을 가로채십시오. Filter는 Spring 컨텍스트 외부에 존재하므로 Interceptor는 Spring의 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 개입합니다.


    컨트롤러 관련 요청 및 응답을 내부적으로 처리하고 Spring의 모든 빈 개체에 액세스할 수 있습니다.


    Interceptor여러개를 사용할 수 있습니다.

    1.preHandler() – 컨트롤러 메서드가 실행되기 전

    2.postHandler() – 컨트롤러 메서드가 실행된 직후 및 보기 페이지가 렌더링되기 전

    3.afterCompletion() – 보기 페이지가 렌더링된 후

그림

그림

AOP

  • OOP를 보완하는 개념

  • 객체지향 프로그래밍에서 중복을 줄이는 기능을 제공합니다.

  • 비지니스 단의 메서드에서 조금 더 세밀하게 조정 할 때 사용한다.

    인터셉터, 필터와 달리 메소드 전후에 자유롭게 설정할 수 있으며 주소, 매개변수, 주석 등 다양한 방식으로 대상을 지정할 수 있다.


    반면에 HandlerInterceptor는 HttpServletRequest와 HttpServletResposne을 필터와 유사한 매개변수로 취합니다.

    • @Before : 대상 메서드를 실행하기 전
    • @After: 대상 메서드 실행 후
    • @After-returning: 대상 메서드의 정상 실행 후
    • @After-throwing: 예외가 발생한 후
    • @Around : 대상 메서드 실행 전/후

졸업 증서

필터

- 전체적인 request단 에서 처리가 필요 할 떄.
- URL 및 기타 정보를 캐시하는 Filter

인터셉터

- 세션 및 쿠키 체크하는 Http프로토콜 단위로 처리해야 하는 업무.
- 로그인 토큰 체크 등..

AOP

- 비지니스 단에서 세밀하게 조정하고 싶을 떄
- 로깅, 트랜잭션, 에러처리