-
[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반응형'Spring Boot > 2.7.x - REST API 만들기' 카테고리의 다른 글
[Spring Boot] REST API 만들기(9) - Transaction 적용 (0) 2022.10.11 [Spring Boot] REST API 만들기(7) - Controller 구현 및 단위 테스트(Junit5) (0) 2022.10.05 [Spring Boot] REST API 만들기(6) - Service 구현 및 단위 테스트(Junit5) (0) 2022.10.03 [Spring Boot] REST API 만들기(5) - Mapper 구현 및 단위 테스트(Junit5) (0) 2022.09.25 [Spring Boot] REST API 만들기(4) - Log4jdbc 설정 (0) 2022.09.15