Software Engineering Blog

컴퓨터공학부 3학년 재학 중인 학생입니다. 백엔드를 주로 공부하며 금융 분야에 관심이 많습니다.

Spring Boot

[Spring] Spring Interceptor란 무엇인가?

잔망준형 2024. 10. 17. 14:26

스프링 인터셉터(Spring Interceptor)란?

Controller의 Handler 호출 전/후/실행 후로 요청과 응답을 낚아채서 처리를 하는 인스턴스다.
보통 인터셉터가 필요한 경우는 특정 핸들러가 실행되기 전에 처리해야 될 로직(예를 들면 로그인 체크) 또는 컨트롤러 실행 이후 예외 처리와 같은 작업을 할 때 사용한다.
 
이와 비슷하게 공통 로직을 처리하는 친구들로 AOP와 Servlet 필터가 있다

스프링 인터셉터 동작 과정

MVC 동작 과정 중 preHandle, postHandle, afterCompletion 이 세 가지가 인터셉터가 동작할 수 있는 위치이다.
각각 Dispatcher Servlet과 컨트롤러 사이에서 컨트롤러 호출 전/후로 그리고 뷰 리졸버를 통한 뷰 렌더링 이후에 동작한다.

* REST API 형식의 뷰가 아닌 데이터 응답 컨트롤러인 경우에는 Model & View를 가공하는 postHandle() 인터셉터는 사용되지 않는다. 컨트롤러 전/후로 preHandle(), AfterCompletion()만 사용된다 RestController는.

스프링 인터셉터 활용

주로 컨트롤러 호출 전 로그인 체크, 권한 검사
그리고 로깅, 예외 처리 등과 같은 공통적인 기능들을 맡아서 제어한다.

서블릿 필터, 스프링 인터셉터, AOP의 차이점?

동작 순서도 위의 나열 순서와 같다.
WAS와 Dispatcher Servlet 사이에서 필터링을 해주는 것이 필터.
그다음 Dispathcer Servlet과 컨트롤러 사이에서 필터링을 해주는 것이 스프링 인터셉터
AOP는 스프링 인터셉터 이후에 좀 더 세밀한 처리를 하기 위해 사용되는 것이다.
 

스프링 인터셉터 구현

HandlerInterceptor 인터페이스를 구현하여 사용한다.
인터페이스가 제공하는 메서드는 다음과 같다.

  • preHandle()
  • postHandle()
  • afterCompletion()

preHandle()
: 컨트롤러의 핸들러 메서드가 호출되기 전에 실행됩니다. false 리턴 시 컨트롤러 호출 전에 종료됩니다.
postHandle()
: 컨트롤러의 핸들러 메서드 실행 이후에 호출됩니다. 요청 처리 후 생성한 Model/View를 아직은 가공할 수 있습니다.
afterCompletion()
: 뷰 렌더링까지 완료된 후 실행됩니다.
 
각 컨트롤러 호출 전에 로그인이 되어있는지 (세션 체크)를 하는 로직이 필요할 때 공통으로 적용하기 위한 인터셉터를 예로 알아보자.

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if (session == null) {
            response.sendRedirect("/login");
            return false;  // false 리턴 시에는 로직이 여기서 멈춤니다. 컨트롤러 호출 X
        }
        return true;  // 이어서 컨트롤러 호출
    }

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

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

그러면 이제 인터셉터 작성을 했으니 등록하는 방법을 알아보자.

스프링 인터셉터 등록(설정) 방법

WebMvcConfigurer 인터페이스를 구현한 Config 파일(WebConfig라 가정)에서 addInterceptors 메서드를 오버라이딩하여 등록한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInInterceptor()) // 작성한 인터셉터 등록
                .addPathPatterns("/api/**") // 인터셉터를 적용할 경로
                .excludePathPatterns("/api/login", "/api/signup"); // 제외시킬 경로
    }
}