[boostcourse] 5.6. Interceptor - BE

1. 인터셉터(Interceptor)란?

etc-image-0

1. Filter

요청이 들어오면, web.xml과 같은 파일에 등록된 필터를 거침

요청을 받아내기 전, 응답을 보내기 전 필터가 수행됨

 

2. DispatcherServlet

이후 DispatcherServlet에 넘어감

선처리 작업 후, HandlerMapping을 통해 어떤 Handler가 동작해야 하는지 찾고 실행하도록 함

Handler를 실행할 때, HandlerInterceptor를 거침

이후 View의 정보를 반환받아, ViewResolver를 통해 View를 찾고 응답함

 

인터셉터 (Interceptor)

- Interceptor는 DispatcherServlet에서 Handler(Controller)로 요청을 보낼 때, Handler에서 DispatcherServlet으로 응답을 보낼 때 동작함

 

인터셉터 작성법

org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현함

또는 org.springframework.web.servlet.handler.HandlerInterceptorAdapter 클래스를 상속 받음

-> Spring 5.3 version 이상에서는 HandlerInterceptorAdapter 대신 HandlerInterceptor를 implements해서 사용하는 방식으로 바뀜

 

이렇게 인터셉터를 만든 후,

Java Config를 사용한다면, WebMvcConfigurerAdapter가 가지고 있는 addInterceptors 메소드를 오버라이딩하고 등록하는 과정을 거침

또는 xml 설정을 사용한다면, <mvc:interceptors> 요소에 인터셉터를 등록함

 

2. 인터셉터를 이용해 Controller 공통 로직 처리하기

웹 애플리케이션에 인터셉터를 적용해 컨트롤러 메소드가 실행되기 전, 컨트롤러 메소드가 실행된 후에 콘솔에 로그를 남기는 예제 작성하기

 

#LogInterceptor.java

package com.example.guestbook.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LogInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println(handler.toString() + "를 호출했습니다.");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(handler.toString() + "가 종료되었습니다. " + modelAndView.getViewName() +"을 view로 사용합니다.");
    }
}

 

# WebMvcContextConfiguration.java

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

etc-image-1

controller 실행 전, 후로 Interceptor가 잘 작동함