[Spring Boot] Spring Interceptor 란? (HandlerInterceptor)
HandlerInterceptor는 스프링 프레임워크의 인터페이스로, 특히 스프링 MVC 모듈 내에 있습니다.
이 인터페이스를 사용하면 들어오는 HTTP 요청과 나가는 HTTP 응답을 가로채고, 사전 처리 및 사후 처리 작업을 수행할 수 있습니다.
스프링 MVC 애플리케이션에서 인터셉터는 이력관리, 로깅, 인증, 권한 부여, 세션 관리 등과 같은 교차 관심사를 구현하는 데 사용됩니다.
HandlerInterceptor 인터페이스를 구현함으로써 사용자 정의 로직을 정의하여
- (preHandle 메서드) 컨트롤러가 요청을 처리하기 전
- (postHandle 메서드) 컨트롤러 로직이 실행된 후이지만 뷰가 렌더링되기 전
- (afterCompletion 메서드) 및 뷰가 렌더링된 후에 실행될 수 있습니다
여기 HandlerInterceptor 인터페이스에 정의된 메서드의 간단한 개요가 있습니다:
preHandle: 이 메서드는 컨트롤러의 실제 핸들러 메서드가 호출되기 전에 호출됩니다. 로깅, 인증 및 유효성 검사와 같은 작업에 사용될 수 있습니다. 요청을 계속 진행할지 여부를 나타내는 boolean 값을 반환합니다.
postHandle: 이 메서드는 핸들러 메서드가 호출된 후에 뷰가 렌더링되기 전에 호출됩니다. ModelAndView 객체를 렌더링하기 전에 수정할 수 있습니다. 모델에 속성을 추가하거나 뷰를 수정하는 등의 작업에 사용될 수 있습니다.
afterCompletion: 이 메서드는 뷰가 렌더링된 후에 호출됩니다. 일반적으로 리소스 해제 또는 로깅과 같은 정리 작업에 사용됩니다. 요청 처리 중에 발생할 수 있는 예외를 처리할 수 있는 Exception 매개변수를 받습니다.
스프링 MVC 애플리케이션에서 HandlerInterceptor를 사용하려면 HandlerInterceptor 인터페이스를 구현하는 클래스를 정의하고, 그런 다음 프로그래밍 방식이나 구성을 통해 InterceptorRegistry에 등록해야 합니다.
다음은 사용자 정의 HandlerInterceptor를 정의하는 방법의 예시입니다:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 사전 처리 로직
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 {
// 정리 또는 로깅 로직
}
}
그런 다음 이 인터셉터를 스프링 MVC 구성에 등록할 수 있습니다:
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
이 예시에서 MyInterceptor 클래스는 HandlerInterceptor 인터페이스를 구현하며, addInterceptors 메서드를 사용하여 모든 요청("/**")을 인터셉트하도록 등록됩니다.