HandlerInterceptor란?

maketheworldwise·2022년 4월 18일
0


이 글의 목적?

HandlerInterceptor에 대해서 알아보자.

HandlerInterceptor

Handler를 실행하기 전과 후 그리고 완료 시점에 추가적인 작업을 하고 싶은 경우에 사용한다. 여러 핸들러에서 반복적으로 사용하는 코드를 줄이고 싶을 때 사용이 가능하다. (로깅, 인증 체크, Locale 변경 등)

여러 개의 HandlerInterceptor를 사용할 경우, 다음과 같은 순서로 적용된다. (PreHandle를 제외하고 나머지 PostHandle과 AfterCompletion은 역순으로 진행)

  1. PreHandle 1
  2. PreHandle 2
  3. 요청 처리
  4. PostHandle 2
  5. PostHandle 1
  6. 뷰 렌더링 (REST API에서는 생략)
  7. AfterCompletion 2
  8. AfterCompletion 1

PreHandle

boolean preHandle(request, response, handler)

Handler가 실행하기 전에 호출이 된다. Handler에 대한 정보를 사용할 수 있기 때문에 서블릿 필터에 비해 세부적으로 로직을 구현할 수 있다. 반환값으로 다음 인터셉터나 Handler로 요청, 응답을 전달할지(true) 응답 처리가 끝났는지(false) 알려준다.

PostHandle

void postHandle(request, response, modelAndView)

Handler의 실행이 끝나고 뷰를 렌더링하기 전에 호출이 된다. 비동기적인 요청에는 호출되지 않는다.

AfterCompletion

void afterCompletion(request, response, handler, ex)

요청 처리와 뷰 렌더링이 모두 끝난 뒤에 호출이 된다. 단, PreHandler가 true를 반환한 경우에만 호출이 되며, PostHandle과 동일하게 비동기적인 요청에는 호출되지 않는다.

사용법

사용 방법은 간단하다. HandlerInteceptor 인터페이스를 구현하고, 구현한 클래스를 WebConfigurer 인터페이스를 이용하여 등록해주면 된다.

public class GreetingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Greeting PreHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Greeting PostHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Greeting AfterCompletion");
    }
}
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // Order 옵션을 주지 않으면 Add한 순서대로 적용
        registry.addInterceptor(new GreetingInterceptor()).order(0);
        registry.addInterceptor(new AnotherInterceptor())
                .addPathPatterns("/hi/")
                .order(-1);
    }
}

서블릿 필터와의 차이?

HandlerInterceptor는 서블릿 필터보다 더 구체적인 처리가 가능하다는 점에서 차이가 있다. 서블릿 필터는 주로 일반적인 용도의 기능을 구현하는데 사용하는게 좋다고 한다. 예를 들어, XSS와 같은 공격은 Lucy-xss와 같은 오픈소스를 web.xml에 등록하여 서블릿 필터로 구현해야한다고 한다.

이 글의 레퍼런스

  • 백기선님의 스프링 웹 MVC
profile
세상을 현명하게 이끌어갈 나의 성장 일기 📓

0개의 댓글