ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] Kotlin으로 REST API 만들기(8) - Interceptor 적용
    Spring Boot/Kotlin으로 REST API 만들기 2022. 11. 1. 23:08
    반응형

    Kotlin으로 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.kt

    package com.example.springbootrestapi.web.interceptor
    
    import com.example.springbootrestapi.web.controller.TodoController
    import org.slf4j.LoggerFactory
    import org.springframework.web.servlet.HandlerInterceptor
    import org.springframework.web.servlet.ModelAndView
    import javax.servlet.http.HttpServletRequest
    import javax.servlet.http.HttpServletResponse
    
    class TodoInterceptor : HandlerInterceptor {
    
      private val log = LoggerFactory.getLogger(TodoController::class.java)
    
      override fun preHandle(
        request: HttpServletRequest,
        response: HttpServletResponse,
        handler: Any
      ): Boolean {
        val startTime = System.currentTimeMillis()
        log.debug(
          "Request URL::" + request.requestURL.toString() + ":: "
              + "Start Time=" + System.currentTimeMillis()
        )
        request.setAttribute("startTime", startTime)
        return true
      }
    
      override fun postHandle(
        request: HttpServletRequest,
        response: HttpServletResponse,
        handler: Any,
        modelAndView: ModelAndView?
      ) {
        log.debug(
          "Request URL::" + request.requestURL.toString() + " Sent to Handler :: "
              + "Current Time=" + System.currentTimeMillis()
        )
      }
    
      override fun afterCompletion(
        request: HttpServletRequest,
        response: HttpServletResponse,
        handler: Any,
        ex: Exception?
      ) {
        val startTime = request.getAttribute("startTime") as Long
        log.debug(
          "Request URL::" + request.requestURL.toString() + ":: "
              + "End Time=" + System.currentTimeMillis()
        )
        log.debug(
          "Request URL::" + request.requestURL.toString() + ":: "
              + "Time Taken=" + (System.currentTimeMillis() - startTime)
        )
      }
    }

     

    2_2. Interceptor 빈 등록

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

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

    WebMvcConfiguration.kt

    package com.example.springbootrestapi.config
    
    import com.example.springbootrestapi.web.interceptor.TodoInterceptor
    import org.springframework.context.annotation.Configuration
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
    
    @Configuration
    class WebMvcConfiguration : WebMvcConfigurer {
    
      override fun addInterceptors(interceptorRegistry: InterceptorRegistry) {
        interceptorRegistry.addInterceptor(TodoInterceptor())
          .addPathPatterns("/api/*")
      }
    }

     

    3. 결과 확인

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

     

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

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

    반응형

    댓글

Designed by Tistory.