Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

그라가승훈

[SpringBoot] - 인터셉터(Interceptor) 본문

Spring

[SpringBoot] - 인터셉터(Interceptor)

그라가승훈 2023. 10. 15. 18:02

- 인터셉터(Interceptor) 

Spring의 인터셉터는 어떠한 URI를 호출했을 때 해당 요청의 컨트롤러가 처리되기 전 또는 후에 작업을 하기 위해서 사용한다. 이러한 역할은 필터와 인터셉터로 수행할 수 있다. 둘의 차이를 알아보자.

 

스프링 MVC 요청의 라이프사이클

1. 필터와 인터셉터의 차이

  • 필터는 디스패처 서블릿 앞 단에서 동작하지만 인터세터는 디스패처 서블릿에서 핸들러 컨트롤러로 가기 전에 동작
  • 필터는 J2EE 표준 스펙에 있는 서블릿의 기능 중 일부, 인터셉터는 스프링 프레임워크에서 제공되는 기능. 따라서 필터와 달리 인터셉터는 스프링 빈을 사용할 수 있다.
  • 일반적으로 문자열 인코딩과 같은 웹 전반에서 사용되는 기능은 필터로 구현, 클라이언트의 요청과 관련이 있는 여러가지 처리(로그인, 인증, 권한 등)는 인터세터로 처리한다.

2. 인터셉터(Interceptor) 구현

- 스프링에서 인터셉터는 HandlerInterceptorAdapter 클래스를 상속받아서 구현한다.

- spring 5.3 이상에서는 HandlerInterceptor 를 implements 하는 것으로 변경!

 

- HandlerInterceptor 가 제공하는 메서드

  • preHandle :  컨트롤러 실행 전에 수행
  • postHnadle : 컨트롤러 수행 후 결과를 뷰로 보내기 전에 수행.
  • afterCompletion : 뷰의 작업까지 완료된 후 수행

- 시작과 끝을 보여주는 로그를 출력해주는 인터셉터를 작성

@Slf4j
// spring 5.3 이상에서는 HandlerInterceptor 를 implements 하는 것으로 변경..
// public class LoggerInterceptor extends HandlerInterceptorAdapter {
public class LoggerInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
        log.debug("=========================== START ==========================");
        log.debug("Request URI \t : {}", request.getRequestURI());
        // impl 하는 방식으로는 true 반환.
        // return super.preHandle(request, response, handler);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{
        log.debug("=========================== END ==========================");
    }
}

- 인터셉터 등록

스프링 3.x 버전에서는 스프링에 관련된 설정을 XML에 등록했지만, 스프링4.0 이상에서는 자바 기반의 설정을 지원한다.

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggerInterceptor());
    }
}

인터셉터를 등록할 때에는 addPathPatterns() 메서드와 excludePathPatterns() 메서드를 이용하여 요청 주소의 패턴과 제외할 요청 주소의 패턴을 지정할 수 있다. 여기서는 모든 요청에 대해서 인터셉터를 적용하기 때문에 따로 지정하지 않음.

3. 로그 확인

위 로그처럼 컨트롤러의 호출이 일어나기 전, 모든 로직이 정상적으로 수행된 후에 로그가 남는것을 확인할 수 있다.

Comments