그림 그리는 개발자
  • 스프링부트 Interceptor 실습
    2022년 01월 30일 22시 58분 55초에 업로드 된 글입니다.
    작성자: 루루개발자

    안녕하세요. 이번에는 스프링부트의 Interceptor 를 실제로 구현해보도록 하겠습니다.

    지난번에 Filter 실습을 했었던 프로젝트에 이어서 진행해보겠습니다.

    먼저 다음과 같이 3개 파일을 새로 생성해 줍니다.

     

    interceptors/TestInterceptor1.java

    package com.example.springbootsampleproject.interceptors;
    
    import org.slf4j.Logger;
    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;
    
    public class TestInterceptor1 implements HandlerInterceptor {
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            this.logger.info("TestInterceptor1.preHandle");
            return HandlerInterceptor.super.preHandle(request, response, handler);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            this.logger.info("TestInterceptor1.postHandle");
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            this.logger.info("TestInterceptor1.afterCompletion");
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }

     

    interceptors/TestInterceptor2.java

    package com.example.springbootsampleproject.interceptors;
    
    import org.slf4j.Logger;
    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;
    
    public class TestInterceptor2 implements HandlerInterceptor {
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            this.logger.info("TestInterceptor2.preHandle");
            return HandlerInterceptor.super.preHandle(request, response, handler);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            this.logger.info("TestInterceptor2.postHandle");
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            this.logger.info("TestInterceptor2.afterCompletion");
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }

     

    위와 같이 Interceptor 2개를 만들어 줍니다.

    그리고 해당 Interceptor 가 동작하려면 스프링부트가 실행할 때 등록을 해주어야 하는데,

    그러기 위해선 WebMvcConfigurationSupport 클래스를 extend 한 Configuration 어노테이션을 달아줄

    클래스를 하나 만들어주어야 합니다.

     

    configurations/InterceptorConfiguration.java

    package com.example.springbootsampleproject.configurations;
    
    import com.example.springbootsampleproject.interceptors.TestInterceptor1;
    import com.example.springbootsampleproject.interceptors.TestInterceptor2;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    
    @Configuration
    public class InterceptorConfiguration extends WebMvcConfigurationSupport {
        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new TestInterceptor1())
                    .addPathPatterns("/test/test2"); // 해당 interceptor가 특정 URL 에만 작동되게 할 수 있음
    
            registry.addInterceptor(new TestInterceptor2())
                    .addPathPatterns("/*");
        }
    }

     

    그리고 특정 경로에 특정 Interceptor 가 동작함을 테스트하기 위해

    아래와 같이 TestConttoller.java 의 내용을 수정합니다.

     

    controllers/TestConttoller.java

    package com.example.springbootsampleproject.contollers;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @RequestMapping("/test")
    public class TestController {
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @GetMapping("")
        public @ResponseBody String index() {
            this.logger.info("TestController 진입!");
            return "This is Test Page!";
        }
    
        @GetMapping("/test2")
        public @ResponseBody String test2() {
            this.logger.info("TestController 진입!");
            return "This is Test2 Page!";
        }
    }

     

     

    이제 스프링부트를 구동해보고 8080포트로 LISTEN 중인걸 확인 한 후, 다음과 같이 요청을 날려보겠습니다.

     

     

     

    보시다시피 설정한 경로에 맞춰 해당 Interceptor 가 컨트롤러에 진입 전, 후 정상 작동하는 것을 볼 수 있었습니다.

    댓글