나의개발일지
Spring) Interceptor 본문
728x90
Interceptor
- Controller가 요청을 처리하기 전/후 처리
- 공통 코드 사용으로 코드 재사용성 증가
- 로깅, 모니터링 정보 수집, 접근 제어 처리 등의 실제 Business Logic과는 분리되어 처리해야 하는 기능들을 넣고 싶을 때 유용함
Interceptor 종류
preHandle
- Controller method가 실행되기 전 호출
- return 타입이 boolean => false를 반환하면 request를 바로 종료
- 전처리 작업이나 요청 정보를 가공하는 작업등
postHandle
- Controller method 실행 직후 view 페이지가 렌더링 되기 전 호출
- return 타입이 void
afterCompletion
- view 페이지가 렌더링 되고 난 후 호출
- 예외가 발생해도 실행
- return 타입이 void
Interceptor 등록 및 호출
Interceptor 등록
Interceptor는 웹관련 로직이므로 웹 관련 설정파일인 servlet-context.xml에 등록한다.
<servlet-context.xml>
<interceptors>
<interceptor>
<mapping path="/article"/>
<beans:bean class="com.company.interceptor.AInterceptor"/>
</interceptor>
<interceptor>
<mapping path="/article"/>
<beans:bean class="com.company.interceptor.BInterceptor"/>
</interceptor>
<interceptor>
<mapping path="/article"/>
<beans:bean class="com.company.interceptor.CInterceptor"/>
</interceptor>
</interceptors>
Interceptor는 처리되는 순서가 중요하다 위의 코드를 실행시 preHandle, postHandle, afterCompletion의 순서는 다음 그림과 같다.
Interceptor 호출
HandlerInterceptor 인터페이스 구현
<Ainterceptor class 구현> = implements HandlerInterceptor
package com.company.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class AInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("AInterceptor - preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("AInterceptor - postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
System.out.println("AInterceptor - afterCompletion");
}
}
위의 형식으로 B, C interceptor도 구현하고 /article 요청을 보내면 실행결과로는
AInterceptor - preHandle
BInterceptor - preHandle
CInterceptor - preHandle
(컨트롤러에 대한 요청 처리)
CInterceptor - postHandle
BInterceptor - postHandle
AInterceptor - postHandle
CInterceptor - afterCompletion
BInterceptor - afterCompletion
AInterceptor - afterCompletion
이런식으로 나오게 된다.
728x90
반응형
'Back-End > Spring' 카테고리의 다른 글
Spring) RestAPI (0) | 2024.04.24 |
---|---|
Spring) Mybatis (2) | 2024.04.23 |
Spring) AOP (0) | 2024.04.17 |
Spring) DI 의존성 주입 (0) | 2024.04.15 |
Spring) IoC & Container (0) | 2024.04.15 |