ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] REST API 만들기(6) - Interceptor 적용
    Spring Boot/2.4.x - REST API 만들기 2020. 5. 7. 17:05
    반응형

    1. Interceptor 란?

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

     

    2. Interceptor 적용

    2_1. HandlerInterceptorAdapter를 상속받은 클래스 구현

    com.spring.board.interceptor 패키지를 생성한 후 BoardInterceptor 클래스 추가하세요.

     

    BoardInterceptor.java

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package 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());
     
        @Override
        public boolean preHandle( HttpServletRequest request
                                , HttpServletResponse response
                                , Object handler ) throws Exception {
            logger.info("===== ===== ===== ===== ===== preHandle");
            return true;
        }
     
        @Override
        public void postHandle( HttpServletRequest request
                              , HttpServletResponse response
                              , Object handler
                              , ModelAndView modelAndView ) throws Exception {
            logger.info("===== ===== ===== ===== ===== postHandle");
        }
     
        @Override
        public 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

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package 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;
     
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
     
        @Override
        public 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

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package 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());
     
        @Override
        public boolean preHandle( HttpServletRequest request
                                , HttpServletResponse response
                                , Object handler ) throws Exception {
            
             if (logger.isDebugEnabled()) {
                 logger.debug("===== ===== ===== ===== =====    START     ===== ===== ===== ===== =====");
                 logger.debug("RequestURI:[{}]", request.getRequestURI());
             }
            
            return true;
        }
     
        @Override
        public void postHandle( HttpServletRequest request
                              , HttpServletResponse response
                              , Object handler
                              , ModelAndView modelAndView ) throws Exception {
            
             if (logger.isDebugEnabled()) {
                 logger.debug("===== ===== ===== ===== =====     END     ===== ===== ===== ===== =====\n");
             }
        }
     
        @Override
        public void afterCompletion( HttpServletRequest request
                                   , HttpServletResponse response
                                   , Object handler
                                   , Exception ex ) throws Exception {
        }
    }
    cs

     

    application.properties

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # datasource 설정
    spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
    spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/board?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
    spring.datasource.hikari.username=board
    spring.datasource.hikari.password=password1!
     
    # root 로깅 레벨 설정
    logging.level.root=info
    # 패키지 단위로 로깅 레벨 설정 
    logging.level.com.api.board=debug
     
    # profiles 설정
    spring.profiles.active=local
    cs

     

     

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

    Github에서 프로젝트 가져오기 - https://tychejin.tistory.com/33

    반응형

    댓글

Designed by Tistory.