인터셉터(Interceptor)는 스프링 프레임워크에서 제공하는 기능으로, 웹 애플리케이션에서 HTTP 요청과 응답을 가로채서 처리하는 데 사용된다. 이는 요청이 컨트롤러에 도달하기 전이나 응답이 클라이언트에게 반환되기 전에 특정 작업을 수행할 수 있게 해준다.
Spring의 interceptor는 HandlerInterceptor 인터페이스를 구현하여 생성할 수 있다. HandlerInterceptor 인터페이스를 사용하면 다음의 세 시점의 공통 기능을 넣을 수 있다.
세 가지 기능에 대해 알아보자.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 인증 및 권한 확인 로직
if (userIsNotAuthenticated) {
response.sendRedirect("/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 추가적인 모델 데이터 설정
if (modelAndView != null) {
modelAndView.addObject("additionalData", "value");
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 리소스 정리 또는 예외 처리
if (ex != null) {
logger.error("Error occurred: ", ex);
}
// 예를 들어, 열려 있는 파일이나 데이터베이스 연결 닫기
}
HandlerInterceptor와 컨트롤러의 실행 흐름을 그림으로 보면 아래 그림과 같이 정리 할 수 있다.
HandlerInterceptor를 통해 Interceptor를 생성했다면, Interceptor를 어디에 적용하지 설정해야 한다.
인터셉터를 설정하려면 WebMvcConfigurer 인터페이스를 구현하는 설정 클래스를 작성한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final MyInterceptor myInterceptor;
public WebMvcConfiguration(MyInterceptor myInterceptor) {
this.myInterceptor = myInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 모든 경로에 인터셉터 적용
.excludePathPatterns("/login", "/signup", "/css/**", "/js/**") // 특정 경로 제외
.order(1); // 인터셉터 순서 지정
registry.addInterceptor(new AnotherInterceptor())
.addPathPatterns("/admin/**") // 관리자 경로에만 적용
.order(2); // 순서 지정
}
}
작성된 Configuration 클래스에 인터셉터를 등록할 수 있다. 인터셉터 등록 시, 여러 옵션들을 설정할 수 있는데 이에 대해 알아보자.
addPathPatterns(String... patterns): 인터셉터가 적용될 URL 패턴을 지정한다. 여러 패턴을 지정할 수 있으며, /**
는 모든 요청에 대해 인터셉터를 적용하는 것을 의미한다.
excludePathPatterns(String... patterns): 인터셉터 적용에서 제외할 URL 패턴을 지정합니다. 로그인, 회원가입 등 특정 경로를 제외할 때 유용하다.
order: 인터셉터의 순서를 지정할 수 있다. 기본적으로는 인터셉터가 등록된 순서대로 적용되지만, 명시적으로 순서를 지정할 수도 있다.
이렇게 설정하면 각 요청이 지정된 패턴과 순서에 따라 인터셉터를 거치게 된다. 이를 통해 요청 전후에 필요한 로직을 유연하게 추가하고 관리할 수 있다.