본문 바로가기
추가 공부/개념학습

[Spring] HandlerInterceptor

by shyun00 2023. 6. 11.

HandlerInterceptor

Spring MVC에서 HTTP 요청을 처리하는 과정에서 요청과 응답 사이에 Intercept 하여 원하는 동작을 수행할 수 있는 인터페이스를 말한다. 요청을 가로채는 시점의 Spring Context와 Bean에 접근할 수 있다.

 

HandlerInterceptor의 특징은 다음과 같다.

1. 컨트롤러 동작 전/후에 작업 수행이 가능하다. 요청의 전처리(인증, 권한 검사 등)나 후처리(데이터 변환, 로깅 등)에 사용할 수 있다.

2. 체인 형태의 다중 인터셉터: 여러개의 HandlerInterceptor를 등록한 후 체인 형태로 동작시킬 수 있다.

3. 요청 및 응답 조작: HttpServletRequest와 HttpServletResponse 객체를 전달받아 요청과 응답에 대한 조작을 수행할 수 있다.

 

HandlerInterceptor 인터페이스는 다음 세가지 메서드를 가지고 있다.

1. boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception;

    컨트롤러가 호출되기 전에 실행되는 메서드이다. 주어진 요청과 응답을 기반으로 필요한 전처리를 수행한다.

    전처리 반환값이 true 인 경우 컨트롤러에 진입하고 false인 경우 진입하지 않는다.

2. void postHandle((HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception;

    컨트롤러가 실행된 후에 실행되는 메서드이다. 실제 View가 렌더링 되기 전에 호출된다.

3. void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex) throws Exception;

    요청 처리가 완료된 후에 호출되는 메서드이다. 보통 리소스 정리나 로깅 등의 작업을 수행한다.

세 메서드는 default 메서드로 구현되어 있으므로 필요한 경우 HandlerInterceptor를 구현하는 클래스를 만들어 오버라이딩하여 사용할 수 있다.

 

HandlerInterceptor를 사용하기 위해서는 HanderInterceptor를 구현한 클래스를 만든 후  해당 인터셉터를 InterceptorRegistry에 추가해서 특정 패턴에 맞는 URL에서만 사용할 수 있도록 설정해줄 수 있다.

<예시>

    // @Configuration 클래스 내부
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new JwtParseInterceptor(jwtUtils()))
                .addPathPatterns("/*/qna-questions/**");
    }

 

참고자료

HandlerInterceptor를 활용한 로그인 처리

HandlerInterceptor 설정하기

Filter, Interceptor, AOP 차이