-
반응형
1. Interceptor 란?
인터셉터란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다.
2. Interceptor 적용
2_1. HandlerInterceptorAdapter를 상속받은 클래스 구현
com.spring.board.interceptor 패키지를 생성한 후 BoardInterceptor 클래스 추가하세요.
BoardInterceptor.java
더보기1234567891011121314151617181920212223242526272829303132333435363738package com.api.board.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class BoardInterceptor implements HandlerInterceptor {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Overridepublic boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception {logger.info("===== ===== ===== ===== ===== preHandle");return true;}@Overridepublic void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView ) throws Exception {logger.info("===== ===== ===== ===== ===== postHandle");}@Overridepublic void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex ) throws Exception {logger.info("===== ===== ===== ===== ===== afterCompletion");}}cs Interceptor를 구현을 하기 위해서는 HandlerInterceptor 인터페이스를 상속받아 구현해야 합니다. HandlerInterceptor 인터페이스는 아래와 같은 메서드가 선언되어 있고 다음과 같은 작업을 수행합니다.
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가 정상적으로 랜더링 된 후 제일 마지막에 실행이 되는 메서드입니다.
2_2. Interceptor 빈 등록
com.api.board.config 패키지에 WebMvcConfig 클래스 추가하세요.
WebMvcConfig.java
더보기123456789101112131415161718package com.api.board.config;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import com.api.board.interceptor.BoardInterceptor;@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new BoardInterceptor()).addPathPatterns("/**").excludePathPatterns("/sample/**");}}cs addInterceptor에 인터셉트 클래스를 등록하세요. 인터셉터를 등록할 때 인터셉터를 적용할 요청 주소의 url 패턴과 제외할 url 패턴을 명시하여 선택적 적용이 가능합니다. addPathPatterns는 적용할 url 패턴을 설정하고, excludePathPatterns는 제외할 url 패턴을 설정하세요.
2_3. Interceptor 출력되는 로그 확인
http://localhost:8080/board 호출 시에는 BoardInterceptor 클래스에서 추가한 로그가 출력되는 것을 확인할 수 있습니다.
http://localhost:8080/sample 호출 시에는 BoardInterceptor 클래스에서 추가한 로그가 출력되지 않는 것을 확인할 수 있습니다.
2_4. Interceptor 출력되는 로그 수정
인터셉터에서 컨트롤러의 메서드가 실행되기 이전, 이후 시점과 URL 정보를 로그로 출력하도록 BoardInterceptor 클래스와 application.properties를 수정하겠습니다.
BoardInterceptor.java
더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445package com.api.board.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class BoardInterceptor implements HandlerInterceptor {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Overridepublic boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception {if (logger.isDebugEnabled()) {logger.debug("===== ===== ===== ===== ===== START ===== ===== ===== ===== =====");logger.debug("RequestURI:[{}]", request.getRequestURI());}return true;}@Overridepublic void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView ) throws Exception {if (logger.isDebugEnabled()) {logger.debug("===== ===== ===== ===== ===== END ===== ===== ===== ===== =====\n");}}@Overridepublic void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex ) throws Exception {}}cs application.properties
더보기12345678910111213# datasource 설정spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpyspring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/board?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTCspring.datasource.hikari.username=boardspring.datasource.hikari.password=password1!# root 로깅 레벨 설정logging.level.root=info# 패키지 단위로 로깅 레벨 설정logging.level.com.api.board=debug# profiles 설정spring.profiles.active=localcs 소스 코드는 Github Repository - https://github.com/tychejin1218/api-board_v1 (branch : section06) 를 참조하세요.
Github에서 프로젝트 가져오기 - https://tychejin.tistory.com/33
반응형'Spring Boot > 2.4.x - REST API 만들기' 카테고리의 다른 글
[Spring Boot] REST API 만들기(8) - Service 구현 및 테스트(Junit4) (0) 2020.05.09 [Spring Boot] REST API 만들기(7) - Transaction 적용 (0) 2020.05.09 [Spring Boot] REST API 만들기(5) - Mapper 구현 및 단위 테스트(Junit4) (0) 2020.05.06 [Spring Boot] REST API 만들기(4) - Log4jdbc 설정 (0) 2020.05.05 [Spring Boot] REST API 만들기(3) - Logback 설정 (0) 2020.05.04