ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] REST API 만들기(8) - Interceptor 적용
    Spring Boot/2.7.x - REST API 만들기 2022. 10. 7. 18:33
    반응형

    REST API 만들기(8) - Interceptor 적용

    1. Interceptor 란?
    인터셉터란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다.

     

    2. Interceptor 적용
    2_1. Interceptor 구현

    HandlerInterceptor 인터페이스를 상속 받아서 PreHandle, PostHandle, afterComplete 메소드를 구현하세요.

     

    PreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

    • 컨트롤러(즉 RequestMapping이 선언된 메서드 진입) 실행 직전에 동작합니다.
    • 반환 값이 true일 경우 정상적으로 진행이 되고, false일 경우 실행이 멈춥니다. (컨트롤러 진입을 하지 않습니다.)
    • 전달인자 중 Object handler는 핸들러 매핑이 찾은 컨트롤러 클래스 객체입니다. 

     

    PostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

    • 컨트롤러 진입 후 view가 랜더링 되기 전 수행이 됩니다.
    • 전달인자의 modelAndView을 통해 화면 단에 들어가는 데이터 등의 조작이 가능합니다. 

     

    afterComplete(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 

    • 컨트롤러 진입 후 view가 정상적으로 랜더링 된 후 제일 마지막에 실행이 되는 메서드입니다.

     

    단축키 : Ctrl + O / 메소드 자동 완성(Override/Implement)

     

    TodoInterceptor.java

    package com.example.springbootrestapi.web.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    @Slf4j
    public class TodoInterceptor implements HandlerInterceptor {
    
      @Override
      public boolean preHandle(
          HttpServletRequest request,
          HttpServletResponse response,
          Object handler
      ) throws Exception {
        long startTime = System.currentTimeMillis();
        log.debug("Request URL::" + request.getRequestURL().toString() + ":: "
            + "Start Time=" + System.currentTimeMillis());
        request.setAttribute("startTime", startTime);
        return true;
      }
    
      @Override
      public void postHandle(
          HttpServletRequest request,
          HttpServletResponse response,
          Object handler,
          ModelAndView modelAndView
      ) throws Exception {
        log.debug("Request URL::" + request.getRequestURL().toString() + " Sent to Handler :: "
            + "Current Time=" + System.currentTimeMillis());
      }
    
      @Override
      public void afterCompletion(
          HttpServletRequest request,
          HttpServletResponse response,
          Object object,
          Exception exception
      ) throws Exception {
        long startTime = (Long) request.getAttribute("startTime");
        log.debug("Request URL::" + request.getRequestURL().toString() + ":: "
            + "End Time=" + System.currentTimeMillis());
        log.debug("Request URL::" + request.getRequestURL().toString() + ":: "
            + "Time Taken=" + (System.currentTimeMillis() - startTime));
      }
    }

     

    2_2. Interceptor 빈 등록

    WebMvcConfigurer 인터페이스를 상속 받아서 addInterceptors 메소드를 구현하세요.

    • addInterceptor : 구현한 인터셉터를 추가
    • addPathPatterns : 인터셉터를 적용할 URL 패턴를 설정
    • excludePathPatterns : 인터셉터를 제외할 URL 패턴를 설정

     

    WebMvcConfiguration.java

    package com.example.springbootrestapi.config;
    
    import com.example.springbootrestapi.web.interceptor.TodoInterceptor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Slf4j
    @Configuration
    public class WebMvcConfiguration implements WebMvcConfigurer {
    
      public void addInterceptors(InterceptorRegistry interceptorRegistry){
        interceptorRegistry.addInterceptor(new TodoInterceptor())
            .addPathPatterns("/api/*");
      }
    }

     

    3. 결과 확인

    /api/todos 호출 시 다음과 같이 로그가 출력되는지 확인하세요.

     

    소스 코드는 Github Repository - https://github.com/tychejin1218/springboot-rest-api (branch : section08) 를 참조하세요.

     

    GitHub에서 프로젝트 복사하기(Get from Version Control) - https://tychejin.tistory.com/325
    단축키 기본 및 응용 - https://tychejin.tistory.com/364

     

     

     

    반응형

    댓글

Designed by Tistory.