스프링에서 제공하는 공통처리 기능
Filter와 매우 유사한 형태로 존재한다.
Filter와 차이점은
Filter는 Web Application에 등록되고
Interceptor는 Spring Context에 등록 된다는 점이다.
실제 매핑된 Handler 정보 확인 가능
조금 더 상세한 조건식과,
세부적인 스펙(pre, post, after)을 통해 구체적인 시점에 구체적인 동작이 가능하다.
AOP와 유사한 기능을 제공할 수 있으며,
AOP와 비교한다면
AOP는 인터셉터보다 더 구체적인 조건( 어노테이션, 파라미터, 주소 등 )과
동작 위치(After Throwing 등)을 갖는다.
logging을 하는데에 사용되기도 하지만 , 주로 인증 단계
를 처리한다.
이를 선/후 처리 함으로써 Service business logic과 분리 시킨다.
컨트롤러(Controller)의 메서드 실행 전후에 특정한 작업을 수행할 수 있게 해준다.
컨트롤러의 메서드가 실행되기 전에 호출
된다.
preHandler()을 사용하여 요청의 전처리 작업
을 수행할 수 있다.
예를 들어, 특정한 조건을 검사하거나 인증/인가 절차를 수행할 수 있다.
이 메서드가 false를 반환하면 요청의 처리가 중단되고 컨트롤러 메서드는 실행되지 않는다.
컨트롤러의 메서드 실행 후
, 뷰(View)가 렌더링 되기 전
에 호출된다.
해당 메서드를 사용하여 응답 데이터를 가공
하거나 로깅
등의 후처리 작업
을 수행할 수 있다.
뷰가 렌더링 된 후
에 호출된다.
해당 메서드를 사용하여 리소스 해제
나 로깅
등의 마무리 작업
을 수행할 수 있다.
이 메서드는 요청의 처리가 완료된 후 항상 호출되
며, 예외 발생 여부와 상관없이 실행
된다.
스프링 MVC의 구성(config)을 커스터마이징하기 위해 사용되는 인터페이스이다.
이 인터페이스에서 제공하는 addInterceptors
메서드를 사용해서
인터셉터(HandlerInterceptor)를 등록하고, 요청 전후에 수행할 작업을 정의할 수 있다.
HandlerInterceptor
인스턴스를 상속받고,
@Component
어노테이션을 붙여준다.
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 요청 url 확인
String url = request.getRequestURI();
log.info("request url : {}", url);
// 반환값이 false 이면, 해당 요청 경로의 controller 실행이 안됨
return true;
}
}
작성한 interceptor를
WebMvcConfigurer에 등록해주어야 동작을 한다.
WebMvcConfigurer
인터페이스를 상속받고, @Configuration
어노테이션을 붙여준다음
addInterceptors
메서드를 오버라이드 하여
작성했던 interceptor 파일을 등록해준다.
@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {
private final AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addInterceptor만 작성하면 모든 경로에서 인터셉터가 동작하며,
registry.addInterceptor(authInterceptor)
// addPathPatterns()를 붙여주면 특정 uri에만 인터셉터를 동작시킨다.
.addPathPatterns("/users", "/login")
// excludePathPatterns()를 붙여주면 특정 uri는 제외하고 인터셉터가 동작한다.
.excludePathPatterns("/join");
}
}