Spring 웹 애플리케이션에서 클라이언트의 요청이 컨트롤러(Controller)의 핸들러 메서드에 도달하기까지는 여러 단계를 거칩니다. 필터(Filter), 인터셉터(Interceptor), Argument Resolver는 이 과정의 각기 다른 지점에서 공통적인 부가 기능을 추가하기 위해 사용되는 강력한 도구들입니다.
실행 순서: HTTP 요청 → Filter → DispatcherServlet → Interceptor → Argument Resolver → Controller
개념: 서블릿(Servlet) 컨테이너 수준에서 동작하며, DispatcherServlet에 요청이 도달하기 전/후에 다양한 전처리 및 후처리 작업을 수행합니다. Spring 프레임워크의 바깥, 즉 웹 컨테이너(Tomcat 등)의 영역에서 동작합니다.
주요 역할:
구현: jakarta.servlet.Filter 인터페이스를 구현하고, @Component 어노테이션을 붙이거나 FilterRegistrationBean을 통해 등록합니다.
@Component
public class MyLoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter: 요청 처리 시작");
// 다음 필터 또는 DispatcherServlet으로 요청을 전달
chain.doFilter(request, response);
System.out.println("Filter: 응답 처리 완료");
}
}
개념: Spring MVC 수준에서 동작하며, DispatcherServlet이 컨트롤러를 호출하기 전/후에 요청을 가로채는 역할을 합니다. 필터보다 더 정교한 제어가 가능합니다.
주요 역할:
ModelAndView 조작: 컨트롤러가 처리된 후, 뷰(View)로 전달되는 Model 객체에 공통적인 데이터를 추가할 수 있습니다.구현: HandlerInterceptor 인터페이스를 구현하고, WebMvcConfigurer를 통해 인터셉터를 등록합니다.
preHandle(): 컨트롤러 실행 전에 호출. false를 반환하면 요청 처리를 중단.postHandle(): 컨트롤러 실행 후, 뷰가 렌더링되기 전에 호출.afterCompletion(): 뷰 렌더링까지 모두 완료된 후에 호출.public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 세션 체크 로직
if (session == null) {
// 로그인 페이지로 리다이렉트
return false; // 컨트롤러 실행 중단
}
return true; // 컨트롤러 실행 계속
}
}
개념: 컨트롤러 메서드의 특정 파라미터(Argument)를 생성하고 바인딩하는 역할을 전담하는 컴포넌트입니다.
문제점: 여러 컨트롤러 메서드에서 공통적으로 사용자의 세션 정보나 특정 헤더 값을 파라미터로 받아야 할 때, 각 메서드마다 HttpServletRequest를 주입받아 정보를 꺼내는 중복 코드가 발생합니다.
해결책: HandlerMethodArgumentResolver를 구현하여, 특정 조건(e.g., 특정 어노테이션이 붙어있는 파라미터)을 만족하는 파라미터가 있을 경우, Spring이 알아서 원하는 객체를 생성하여 주입해주도록 만들 수 있습니다.
Spring Security의 @AuthenticationPrincipal: 이 어노테이션이 바로 Argument Resolver의 대표적인 활용 사례입니다. 개발자는 단순히 @AuthenticationPrincipal UserDetails user라고만 선언하면, Spring Security가 제공하는 Argument Resolver가 Security Context에서 사용자 정보를 꺼내 user 파라미터에 주입해줍니다.
HandlerMethodArgumentResolver 인터페이스를 구현합니다.supportsParameter(): 어떤 파라미터에 이 Resolver를 적용할지 조건을 정의합니다.resolveArgument(): supportsParameter()가 true를 반환했을 때, 실제로 파라미터에 주입할 객체를 생성하여 반환하는 로직을 작성합니다.WebMvcConfigurer를 통해 커스텀 Argument Resolver를 등록합니다.| 구분 | Filter | Interceptor | Argument Resolver |
|---|---|---|---|
| 동작 범위 | 서블릿 컨테이너 수준 | Spring MVC 수준 | 컨트롤러 파라미터 수준 |
| 실행 시점 | DispatcherServlet 전/후 | Controller 전/후 | Controller 파라미터 바인딩 시 |
| 주요 용도 | • 전역적인 요청/응답 처리 • 인코딩, 보안 | • 세부적인 권한 체크 • 컨트롤러 로깅 | • 공통 파라미터 주입 • 어노테이션 기반 값 바인딩 |
| 접근 가능 정보 | HttpServletRequest/Response | HttpServletRequest/Response,호출될 컨트롤러 정보( Handler) | HttpServletRequest,바인딩될 파라미터 정보 |
@AuthenticationPrincipal이 대표적인 예)