Back_End/Spring

Filter와 Interceptor 이해하기

10Biliion 2024. 11. 29. 11:03

 

 

웹 애플리케이션에서 요청/응답 처리를 더 세부적으로 제어하려면 FilterInterceptor를 활용합니다. 이 두 가지는 비슷한 역할을 하지만, 사용하는 환경과 적용 시점에서 차이가 있습니다.


Filter란?

Filter는 Servlet 스펙에서 제공하는 기능으로, 클라이언트 요청이 서블릿에 도달하기 전후에 특정 작업을 수행할 수 있게 해줍니다.

Filter의 주요 역할

  1. 요청/응답 변환: 요청 데이터 가공 또는 응답 데이터 수정.
  2. 보안 처리: 인증, 인가 로직 추가.
  3. 로깅: 요청/응답의 세부 정보 기록.

Filter 동작 흐름

  1. 클라이언트 요청이 들어옴.
  2. Filter가 요청을 가로채고 필요한 작업을 수행.
  3. 서블릿으로 요청 전달 또는 요청 차단.
  4. 서블릿 처리 후 응답이 다시 Filter를 거침.

간단한 Filter 코드 예시

import java.io.*;
import javax.servlet.*;

public class LoggingFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Request received at: " + new java.util.Date());
        chain.doFilter(request, response); // 다음 필터 또는 서블릿 호출
    }
}

위 코드는 요청이 들어올 때마다 로그를 출력하는 Filter입니다.


Interceptor란?

Interceptor는 Spring Framework에서 제공하는 기능으로, Dispatcher Servlet을 통해 컨트롤러로 요청이 전달되기 전후에 작업을 수행할 수 있습니다.

Interceptor의 주요 역할

  1. 컨트롤러 전/후 작업 처리: 인증, 데이터 검증.
  2. 비즈니스 로직 적용: 요청 처리 전에 공통 로직 실행.
  3. 응답 후 처리: 리소스 해제, 후속 작업 수행.

Interceptor 동작 흐름

  1. Dispatcher Servlet이 요청을 수신.
  2. Interceptor의 preHandle 메서드 실행.
  3. 컨트롤러에서 요청 처리.
  4. Interceptor의 postHandleafterCompletion 메서드 실행.

간단한 Interceptor 코드 예시

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.*;

public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("PreHandle: 인증 확인");
        return true; // true이면 요청 계속 진행
    }
}

위 코드는 컨트롤러 실행 전에 인증 여부를 확인하는 Interceptor입니다.


Filter와 Interceptor 비교

특징 Filter Interceptor
적용 레벨 Servlet 스펙 기반 (전체 요청/응답 처리) Spring MVC 레벨 (컨트롤러 전/후 처리)
주요 목적 요청/응답 전반적 처리 컨트롤러 전후의 작업 처리
의존성 Spring에 의존하지 않음 Spring Framework의 일부
사용 시점 서블릿 호출 전후 Dispatcher Servlet 호출 전후