[Spring] interceptor 개념 정리

고양이·2022년 10월 25일
0

Interceptor란 ?

interceptor는 말 그대로 낚아채다라는 의미로 서버로 들어온 request 객체를 컨트롤러의 핸들러로 도달하기 전에 낚아채 필요한 추가작업 후 핸들러로 보낼 수 있도록 한다. 인터셉터를 활용하면 요청과 응답을 가로챔으로써 기존 컨트롤러의 로직을 수정하지 않고 원하는 동작을 추가할 수 있다.

인터셉터 동작 순서

  1. 클라이언트에서 서버로 동작 요청을 위해 request 객체를 보낸다
  2. DispatcherServlet이 request를 받아 요청에 맞는 컨트롤러를 찾는 일을 HandlerMapping에 요구
  3. 이러한 결과로 핸들러 실행체인 (HandlerExecutionChain)이 동작하게 되는데 핸들러 실행체인은 하나이상의 인터셉터를 거쳐 컨트롤러가 실행될 수 있도록 구성되어 있다.

이 때 만약 핸들러 인터셉터를 등록해주지 않았다면 바로 컨트롤러가 실행되지만 반면에 하나 이상의 핸들러 인터셉터를 지정했다면 지정된 순서에 따라 인터셉터를 거쳐 컨트롤러를 실행한다.

대표적인 사용 예)

대표적으로 세션기반의 로그인기능 구현 시 사용. controller에서 요청을 받아들이기 전 세션에서 로그인한 사용자가 있는지 확인 후 없다면 로그인페이지로 redirect 시킨다.

  • 만약 interceptor를 사용하지 않을 경우 모든 컨트롤러마다 로그인여부를 체크하는 로직을 넣어야하는 번거로움이 발생하게되며 만약 해당 로직을 적용해야할 핸들러가 수천개로 많아지게 된다면 ? 반복되는 코드로 인해 메모리 낭비 문제가 발생하게 된다.

따라서 Interceptor를 이용했을 때의 장점은

  1. 공통로직을 사용하는 경우 코드가 누락되는 것을 방지할 수 있다
  2. 코드의 재사용성이 증가한다

HandlerInterceptor 인터페이스

: Interceptor를 구현하기 위해서는 spring framework에서 지원하는 HandlerInterceptor 인터페이스를 Implements해서 사용하면 된다.

public interface HandlerInterceptor {

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable Exception ex) throws Exception {
    }
}
  • handlerInterceptor 제공 메서드
    • preHandle : Controller 동작 이전에 호출하며 컨트롤러 실행 이전에 처리해야 할 작업이 있을 경우 사용한다. false를 리턴하게 되면 작업을 중단하기 때문에 컨트롤러와 남은 인터셉터가 실행되지 않는다.
      -> 로그인여부 체크 시 preHandle 메서드를 이용한다.

    • postHandle : Controller 동작 후 호출, Spring MVC의 Dispatcher Servlet이 화면을 처리하기 전에 동작. 만약 preHandle() 메소드에서 false를 리턴했을 경우 postHandle()도 실행되지 않는다.

    • afterCompletion : Dispatcher Servlet의 화면처리가 완료된 이후 처리할 동작. 요청 처리 중에 사용한 리소스를 반환해주기에 적당한 메소드이다.









참조 : 토비의 스프링

0개의 댓글