spring의 다양한 intercept 방법 (Servlet Filter, HandlerInterceptor, PreHandle, AOP)

2021. 3. 23. 00:41 Spring Framework/Spring Core

1. 다양한 intercept 방법들과 주 사용처

  1. Servlet Filter : 인코딩, 인증, 압축, 변환 등
  2. HandlerInterceptor : 세션, 쿠키, 검증 등
  3. AOP : 비즈니스단 로깅, 트랜잭션, 에러처리 등

2. Servlet Filter 와 HandlerInterceptor 차이

  • Servlet Filter : Dispatcher Servlet의 앞단에서 들어오는 요청을 처리
    • J2EE 스펙
    • spring과 무관
  • HandlerInterceptor : Dispatcher Servlet의 뒤의 Handler 영역에서 요청을 처리
    • org.springframework.web.servlet.handler 패키지가 제공
  • 흐름 정리 : Request -> Servlet Filter -> Dispatcher Servlet -> HandlerInterceptor -> Controller

3. HandlerInterceptorAdapter의 메소드

HandlerInterceptorAdapter는 추상클래스로서 메소드들을 재정의해서 쓰면 된다.

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    • 반환 값이 true 일 경우, 컨트롤러에게 요청을 넘긴다. flase 일 경우 컨트롤러를 실행조차 하지 않는다.
    • Object handler 는 HandlerMapping이 사용하는 인자
  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    • view 랜더링 전에 해당 메소드가 호출된다.
    • modelAndView 인자를 이용해 view model 조작이 가능
  3. afterComplete(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    • view 랜더링 후 호출되는 메소드 컨트롤러 진입 후 view가 정상적으로 랜더링 된 후 제일 마지막에 실행이 되는 메서드입니다.
  4. afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
    • 비동기 서블릿 관련

Interceptor 가 여러개라면?

만약 HandlerInterceptorAdapter를 여러 곳에서 상속받아서 PreHandle 가 여러개일 때는!? (당연히) 정의한 순서대로 동작한다..!

  • xml 설정이라면
  <mvc:interceptors>
      <!-- 1번 -->
      <mvc:interceptor>
          <mvc:mapping path="/**"/>
          <mvc:exclude-mapping path="/login*"/>
          <bean class="경로" />
      </mvc:interceptor>
      
      <!-- 2번 -->
      <mvc:interceptor>
          <mvc:mapping path="/**"/>
          <bean class="경로"/>
      </mvc:interceptor>
  
      <!-- 3번 -->
      <mvc:interceptor>
          <mvc:mapping path="/**"/>
          <bean class="경로"/>
      </mvc:interceptor>
  </mvc:interceptors>
  • java bean 설정이라면 WebMvcConfigurerAdapter 를 상속받은 addInterceptors에 추가되는 대로 일 것이다.

4. HandlerInterceptor 와 AOP 차이

AOP 관련포스팅 : http://sjh836.tistory.com/157

  • HandlerInterceptor 는 위에서 많이 이야기했고..
  • AOP는 주로 비즈니스 로직단에서 횡단관심(로깅, 트랜잭션, 공통예외처리) 분리할 때 사용한다.
  • 둘은 비슷하지만, 가장 큰 차이는 AOP가 JoinPoint를 이용해 메소드의 매개변수에만 접근할 수 있다는 것이다. 물론 컨트롤러의 메소드가 HttpServletRequest를 사용한다면 HandlerInterceptor와 동일할 수 있다. (모든 컨트롤러 메소드에서 이렇게 쓰진 않으니..)
  • 따라서 요청과 응답에 항상 무언가 수행을 해야한다면, aop보단 HandlerInterceptor 가 맞다.



출처: https://sjh836.tistory.com/163?category=680970 [빨간색코딩]