인터셉터 사용하기

인터셉터란?
스프링의 인터셉터는 어떠한 URI를 호출했을 때 해당 요청의 컨트롤러가 처리 되기 전 또는 후에 작업을 하기 위해서 사용된다.
이러한 역할은 필터(Filter)와 인터셉터(Interceptor)로 수행할 수 있다.
기능적인 면에서는 필터와 인터셉터가 상당히 비슷해 보이지만 차이점이 있다.
자세한 차이점은 https://mangkyu.tistory.com/173 를 참고.
일반적으로 문자열 인코딩과 같은 웹 전반에서 사용되는 기능은 필터로 구현을 하고, 클라이언트 요청과 관련이 있는 여러 가지 처리(예를 들어 로그인 이나 인증, 권한 등)는 인터셉터로 처리한다.
HandlerInterceptorAdapter로 인터셉터 구현하기
메서드 | 역할 | |
preHandle | 컨트롤러 실행 전에 수행 | |
postHandle | 컨트롤러 수행 후 결과를 뷰로 보내기 전에 수행 | |
afterCompletion | 뷰의 작업까지 완료된 후 수행 |
interceptor 생성
board\src\main\java\board\interceptor\LoggerInterceptor.java 생성
package board.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@Slf4j
public class LoggerInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.debug("====================================== START ======================================");
log.debug(" Request URI \t: " + request.getRequestURI());
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("====================================== END ======================================\n");
}
}
11: HandlerInterceptorAdapter 를 상속받아서 LoggerInterceptor를 구현한다.
15~17: 컨트롤러가 실행되기 전 수행된다.
22: 컨트롤러가 정상적으로 실행된 후 수행된다.
Interceptor 등록하기
앞서 만든 LoggerInterceptor를 스프링 빈으로 등록한다. 스프링 3.x 버전에서는 스프링에 관련된 설정을 xml에 했지만 스프링4.0 이상에는 자바 기반의 설정을 지원하기 때문에 xml을 사용하지 않고 자바 설정을 이용해 인터셉터를 등록할 수 있다. configuration 패키지 안에 WebMvcConfiguration 클래스를 생성
board\src\main\java\board\configuration\WebMvcConfiguration.java
package board.configuration;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import board.interceptor.LoggerInterceptor;
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggerInterceptor());
}
}
14: 인터셉터를 등록한다. addPathPatterns() 메서드와 excludPathPatterns() 메서드를 이용하여 요청 주소의 패턴과 제외할 요청 주소의 패턴을 지정하여 선택적으로 적용할 수 있다. 여기서는 모든 요청에 대해서 인터셉터를 적용하기 때문에 특별한 패턴은 지정하지 않았다.
실행결과 확인.
