Interceptor
- 스프링의 인터셉터는 어떤 URI를 호출했을 때 요청 컨트롤러가 처리되기 전 또는 후 작업을 하기 위해 사용 된다 (프록시 패턴) 이런 역할은 Filter와 Interceptor로 수행할 수 있다.
Spring의 MVC 요청 lifecycle
위치
- filter는 dispatcher servlet 앞 단에서 동작
- interceptor는 handler로 가기 전 동작
제어권
- filter는 servlet의 일부 기능이다.
- interceptor는 spring framework내에 있기 때문에 bean을 사용할 수 있다.
주 사용처
- filter는 웹 전반에 사용되는 기능을 구현 → RESTful
- interceptor는 클라이언트 요청(로그인, 권한 등)과 같은 동적 처리를 위해 구현
HandlerInterceptorAdapter
- 스프링에서 interceptor를 구현하기 위해
HandlerInterceptorAdapter
를 상속받는다.
Methods
- preHandle : 컨트롤러 실행 전에 수행.
- postHandle : 컨트롤러 실행 후 뷰로 결과를 보내기 전에 수행.
- afterCompletion : 뷰 작업이 완료 된 다음 수행.
// interceptor.LoggerInterceptor.class
@Slf4j
public class LoggerInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
log.debug("---- START ----");
log.debug(" Request URI \t: " + request.getRequestURI());
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.debug("---- END ----\n");
}
}
책코드는 또 오류가 있고 정오표는 없고 깃헙 소스에만 슬쩍 반영되있음.. 짜증남..
Interceptor 등록
- 만든
LoggerInterceptor
를 bean으로 등록하는 작업. WebMvcConfigurer
를 상속받아 interceptor를 간단하게 등록한다.
//configuration.WebMVCConfiguration.class
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new LoggerInterceptor());
}
}
책의 5.3.2 단락 첫 문단을 보면 눈이 휘둥그래진다. 본 적 없는 클래스를 마치 있었다는 듯 언급하기 때문이다.
- 아래와 같은 로그가 찍힌다
2021-03-04 11:11:24,081 DEBUG [org.platanus.webappboard.interceptor.LoggerInterceptor] ---- START ----
2021-03-04 11:11:24,082 DEBUG [org.platanus.webappboard.interceptor.LoggerInterceptor] Request URI : /board/openBoardList.do
2021-03-04 11:11:24,082 DEBUG [org.platanus.webappboard.app.controller.BoardController] openBoardList
2021-03-04 11:11:24,082 DEBUG [org.platanus.webappboard.app.mapper.BoardMapper.selectBoardList] ==> Preparing: SELECT board_idx, title, hit_cnt, FORMATDATETIME(created_datetime, 'yyyy-MM-dd HH-mm-ss') AS created_datetime FROM t_board WHERE deleted_yn = 'N' ORDER BY board_idx DESC
2021-03-04 11:11:24,082 DEBUG [org.platanus.webappboard.app.mapper.BoardMapper.selectBoardList] ==> Parameters:
2021-03-04 11:11:24,083 INFO [jdbc.sqlonly] SELECT board_idx, title, hit_cnt, FORMATDATETIME(created_datetime, 'yyyy-MM-dd HH-mm-ss') AS
created_datetime FROM t_board WHERE deleted_yn = 'N' ORDER BY board_idx DESC
2021-03-04 11:11:24,084 INFO [jdbc.resultsettable]
|----------|------|--------|--------------------|
|board_idx |title |hit_cnt |created_datetime |
|----------|------|--------|--------------------|
|7 |rger |13 |2021-02-26 12-24-13 |
|6 |afs |3 |2021-02-26 12-24-10 |
|----------|------|--------|--------------------|
2021-03-04 11:11:24,084 DEBUG [org.platanus.webappboard.app.mapper.BoardMapper.selectBoardList] <== Total: 2
2021-03-04 11:11:24,084 DEBUG [org.platanus.webappboard.interceptor.LoggerInterceptor] ---- END ----