TIL - 20251113

juni·2025년 11월 13일

TIL

목록 보기
176/316

1113 Spring Boot 심화: Filter, Interceptor, Argument Resolver


✅ 1. 개요: 요청 처리 과정에서의 부가 기능 추가

  • Spring 웹 애플리케이션에서 클라이언트의 요청이 컨트롤러(Controller)의 핸들러 메서드에 도달하기까지는 여러 단계를 거칩니다. 필터(Filter), 인터셉터(Interceptor), Argument Resolver는 이 과정의 각기 다른 지점에서 공통적인 부가 기능을 추가하기 위해 사용되는 강력한 도구들입니다.

  • 실행 순서: HTTP 요청FilterDispatcherServletInterceptorArgument ResolverController


✅ 2. 필터 (Filter)

  • 개념: 서블릿(Servlet) 컨테이너 수준에서 동작하며, DispatcherServlet에 요청이 도달하기 전/후에 다양한 전처리 및 후처리 작업을 수행합니다. Spring 프레임워크의 바깥, 즉 웹 컨테이너(Tomcat 등)의 영역에서 동작합니다.

  • 주요 역할:

    • 인코딩 변환: 모든 요청에 대한 문자 인코딩(e.g., UTF-8)을 설정합니다.
    • 보안 및 인증: Spring Security는 필터 체인(Filter Chain)을 기반으로 동작하여, 인증/인가되지 않은 요청을 사전에 차단합니다.
    • 로깅 및 감사: 모든 요청/응답에 대한 로그를 기록합니다.
    • CORS 처리: Cross-Origin Resource Sharing 헤더를 추가합니다.
  • 구현: 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: 응답 처리 완료");
        }
    }

✅ 3. 인터셉터 (Interceptor)

  • 개념: 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; // 컨트롤러 실행 계속
        }
    }

✅ 4. Argument Resolver

  • 개념: 컨트롤러 메서드의 특정 파라미터(Argument)를 생성하고 바인딩하는 역할을 전담하는 컴포넌트입니다.

  • 문제점: 여러 컨트롤러 메서드에서 공통적으로 사용자의 세션 정보나 특정 헤더 값을 파라미터로 받아야 할 때, 각 메서드마다 HttpServletRequest를 주입받아 정보를 꺼내는 중복 코드가 발생합니다.

  • 해결책: HandlerMethodArgumentResolver를 구현하여, 특정 조건(e.g., 특정 어노테이션이 붙어있는 파라미터)을 만족하는 파라미터가 있을 경우, Spring이 알아서 원하는 객체를 생성하여 주입해주도록 만들 수 있습니다.

  • Spring Security의 @AuthenticationPrincipal: 이 어노테이션이 바로 Argument Resolver의 대표적인 활용 사례입니다. 개발자는 단순히 @AuthenticationPrincipal UserDetails user라고만 선언하면, Spring Security가 제공하는 Argument Resolver가 Security Context에서 사용자 정보를 꺼내 user 파라미터에 주입해줍니다.

➕ 커스텀 Argument Resolver 구현 흐름

  1. HandlerMethodArgumentResolver 인터페이스를 구현합니다.
  2. supportsParameter(): 어떤 파라미터에 이 Resolver를 적용할지 조건을 정의합니다.
  3. resolveArgument(): supportsParameter()true를 반환했을 때, 실제로 파라미터에 주입할 객체를 생성하여 반환하는 로직을 작성합니다.
  4. WebMvcConfigurer를 통해 커스텀 Argument Resolver를 등록합니다.

✅ 5. Filter vs Interceptor vs Argument Resolver

구분FilterInterceptorArgument Resolver
동작 범위서블릿 컨테이너 수준Spring MVC 수준컨트롤러 파라미터 수준
실행 시점DispatcherServlet 전/후Controller 전/후Controller 파라미터 바인딩 시
주요 용도• 전역적인 요청/응답 처리
• 인코딩, 보안
• 세부적인 권한 체크
• 컨트롤러 로깅
• 공통 파라미터 주입
• 어노테이션 기반 값 바인딩
접근 가능 정보HttpServletRequest/ResponseHttpServletRequest/Response,
호출될 컨트롤러 정보(Handler)
HttpServletRequest,
바인딩될 파라미터 정보

📌 요약

  • Filter는 Spring의 가장 바깥에서 동작하며, 모든 요청에 대한 전역적인 전/후처리를 담당합니다. (e.g., 인코딩, Spring Security)
  • Interceptor는 Spring MVC 내부에서 동작하며, 특정 컨트롤러의 실행 전후에 개입하여 권한 체크나 로깅과 같은 부가 기능을 수행합니다.
  • Argument Resolver는 컨트롤러 메서드의 파라미터를 만드는 과정에 개입하여, 반복적인 파라미터 준비 코드를 줄이고 공통 로직을 캡슐화합니다. (@AuthenticationPrincipal이 대표적인 예)
  • 각각의 역할과 동작 범위가 다르므로, 해결하려는 문제에 가장 적합한 도구를 선택하여 사용하는 것이 중요합니다.

0개의 댓글