spring AOP, Interceptor, Filter

Spring AOP, Interceptor, Filter 차이

  • 인터셉트와 필터는 서블릿 단위에서 실행
  • AOP는 메소드 앞에 Proxy패턴 형태로 실행

요청이 들어오면 Filter -> Interceptor -> AOP -> Interceptor -> Filter

  1. 서버를 실행시켜 서블릿이 올라오는 동안 init이 실행되고 그 후 doFilter가 실행
  2. 컨트롤러에 들어가기 전 preHandler가 실행
  3. 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행
  4. 서블릿 종료 시 destory 실행

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>

Interceptor(인터셉터)

  • 요청에 대한 작업 전/후로 가로챔
  • 필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작
  • 인터셉터는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리
  • 스프링의 모든 빈 객체에 접근함
  • 인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 업무처리

인터셉터의 실행메서드

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

AOP

  • OOP를 보완하기 위해 나온 개념
  • 객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리
  • 주로 ‘로깅’, ‘트랜잭션’, ‘에러 처리’등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용
  • Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능
  • Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애너테이션 등 다양한 방법으로 대상을 지정

AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이

  • Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출
  • 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용

AOP의 포인트컷

  1. @Before: 대상 메서드의 수행 전
  2. @After: 대상 메서드의 수행 후
  3. @After-returning: 대상 메서드의 정상적인 수행 후
  4. @After-throwing: 예외발생 후
  5. @Around: 대상 메서드의 수행 전/후

Categories:

Updated:

Comments