목차

Spring Boot; Interceptor

🗓️

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 ----