Spring - Filter, Interceptor, AOP

2022. 1. 25. 15:15 Spring Framework/Spring Core

자바 웹프로그래밍을 구현하다보면 공통적인 업무를 추가해야할 것들이 많다. 공통적인 업무에는 로그인처리(세션체크), pc웹과 모바일웹의 분기, 로그 확인, 페이지 인코딩 변환, 권한체크, XSS(Cross site script)방어 등이 있는데 이러한 공통업무에 관련된 코드를 모든 페이지 마다 작성 해야한다면 중복된 코드가 많아지게 되고 업무량이 상당히 증가할 것이다. 이러한 공통업무를 프로그램 흐름에서 앞, 중간, 뒤에 추가하여 자동으로 처리할 수 있는 방법이 있는데 서블릿에서 지원하는 서블릿 필터, 스프링 프레임워크를 사용하면 쓸 수 있는 인터셉터, AOP가 있다. 앞서 AOP개념을 정리할 때 언급한 것처럼 개발자는 좀더 핵심로직에 집중하고, 부가로직으로부터 자유로워지게 도와주는 역할을 한다.

그렇다면 요청에 흐름에 따라 필터, 인터셉터, AOP의 차이점에 대해 알아보자.


1. Filter, Interceptor, AOP의 흐름

Filter, Interceptor, AOP의 실행순서


사진 및 내용 출처: 심해펭귄의 심해도서관, [Spring] Interceptor, filter, AOP의 차이

위 그림을 보면 필터와 인터셉터의 차이를 구분할 수가 있다. 작업처리를 위해 컨트롤러가 실행되기 전에 사용한다는 점에서 별반 차이가 없어보이지만 흐름을 보면 명확히 호출되는 시점이 다르다. 실행되는 메서드를 기준으로 다시 설명해보자면, 서버를 실행시켜 서블릿이 올라오는 동안 init이 실행되고, 그후 doFilter가 실행된다. 그후 컨트롤러에 들어가기 전에 preHandler가 실행된다. AOP가 실행된 후에 컨트롤러에서 나와 postHandler, after Completion, doFilter순서로대로 진행되고 destroy가 실행된다.


2. Filter, Interceptor, AOP의 개념

01) Filter(필터)

말그대로 요청과 응답을 거른뒤 정제하는 역할을 한다.

서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다. 또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.
필터는 web.xml에 등록하는데 대표적으로 인코딩 변환, 로그인 여부확인, 권한체크, XSS방어 등의 요청에 대한 처리로 사용된다.

<!-- 한글 처리를 위한 인코딩 필터 -->
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
 

등록한 encoding는 이름은 encoding이고, 값은 UTF-8인 파라미터를 정의하고 있다. 필터를 /* 에 맵핑하여 필터가 servlet, jsp뿐만 아니라 이미지와 같은 모든 자원의 요청에도 호출 된다는 것을 의미한다.

필터의 실행메서드

  • init() - 필터 인스턴스 초기화
  • doFilter() - 전/후 처리
  • destroy() - 필터 인스턴스 종료

02) Interceptor(인터셉터)

요청을 가로챈다(작업 전/후)

앞서 말했던 것처럼 필터와 인터셉터는 호출 시점이 다르다. 필터는 스프링과 무관하게 지정된 자원에 대해 동작한다. 스프링은 DistpatcherServlet으로부터 시작되므로 필터는 스프링 컨텍스트 외부에 존재하게 된다. 하지만 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에 존재하게된다. 그리고 스프링 내의 모든 객체(bean) 접근이 가능하다. 인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인, 업로드 파일처리등에 사용된다.

인터셉터의 실행메서드

  • preHandler() - 컨트롤러 메서드가 실행되기 전
  • postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
  • afterCompletion() - view페이지가 렌더링 되고 난 후

03) AOP

관점 지향 프로그래밍

AOP와 관련해서는 이전 포스팅을 참고
관련 포스팅: # AOP(관점지향 프로그래밍)


3. 정리

구분FilterInterceptorAOP
실행 위치 서블릿 서블릿 메서드
실행 순서 1 2 3
설정 위치 web.xml xml or java xml or java
실행 메서드 init(), doFilter(), destroy() preHandler(), postHanler(), afterCompletion() 포인트 컷으로 @After, @Before, @Around 위치를 지정

내용 및 출처
쉬고 싶은 개발자 블로그 : 실행 흐름에 끼어들기(Filter,Interceptor,AOP) 1 - Servlet Filter, 실행 흐름에 끼어들기(Filter,Interceptor,AOP) 2 - Interceptor, 실행 흐름에 끼어들기(Filter,Interceptor,AOP) 3 - AOP

심해펭귄의 심해도서과 : [Spring] Interceptor, filter, AOP의 차이

https://doublesprogramming.tistory.com/133