spring의 다양한 intercept 방법 (Servlet Filter, HandlerInterceptor, PreHandle, AOP)
1. 다양한 intercept 방법들과 주 사용처
- Servlet Filter : 인코딩, 인증, 압축, 변환 등
- HandlerInterceptor : 세션, 쿠키, 검증 등
- 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는 추상클래스로서 메소드들을 재정의해서 쓰면 된다.
- preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- 반환 값이 true 일 경우, 컨트롤러에게 요청을 넘긴다. flase 일 경우 컨트롤러를 실행조차 하지 않는다.
- Object handler 는 HandlerMapping이 사용하는 인자
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- view 랜더링 전에 해당 메소드가 호출된다.
- modelAndView 인자를 이용해 view model 조작이 가능
- afterComplete(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- view 랜더링 후 호출되는 메소드 컨트롤러 진입 후 view가 정상적으로 랜더링 된 후 제일 마지막에 실행이 되는 메서드입니다.
- 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 [빨간색코딩]
'Spring Framework > Spring Core' 카테고리의 다른 글
[Spring] 스프링 빈(Bean)의 개념과 생성 원리 (0) | 2021.04.21 |
---|---|
[Spring] 스프링 예제 PetClinic 프로젝트 분석 및 기능 변경 (0) | 2021.04.21 |
[Spring] 스프링 예제 프로젝트 PetClinic 빌드 및 실행하기 (0) | 2021.04.21 |
spring websocket (polling, Handshake 과정, sockjs, webSocketHandler, 예제) (0) | 2021.03.23 |
Spring AOP (개념, 용어, 원리, 포인트컷 표현식, JoinPoint API) (0) | 2021.03.22 |
Controller에서 다양한 타입으로 Request 요청받기 (PathVariable, RequestParam, ModelAttribute, RequestBody) (0) | 2021.03.22 |
lombok (롬복의 특징, annotations) (0) | 2021.03.22 |
EHCache (ehcache-spring-annotations, ehcache.xml, @Cacheable) (0) | 2021.03.22 |