[Spring] Filter (2)

이연우·2025년 7월 28일

TIL

목록 보기
63/100

🔌 Filter Interface란?

  • Java Servlet의 기본 스펙에서 제공하는 인터페이스로,
    HTTP 요청과 응답을 가로채고 사전/후처리 로직을 수행할 수 있게 해 줌

📦 jakarta.servlet.Filter

특징설명
🔗 InterfaceServlet Filter를 만들기 위해 반드시 구현해야 함
🛠️ 구현 후 등록Bean으로 등록하여 사용 (Spring에서 관리)
♻️ Lifecycle서블릿 컨테이너가 싱글톤으로 생성 및 관리

⚙️ 주요 메서드

메서드설명
init()필터 초기화 시 호출 (컨테이너 생성 시 1회)
doFilter()🔥 핵심 로직 처리 메서드
모든 HTTP 요청마다 실행
destroy()필터 종료 시 호출 (컨테이너 종료 시 1회)

init()destroy()default 메서드이기 때문에 꼭 구현하지 않아도 됨

🔁 doFilter() 메서드 핵심 이해

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  • request, response: 요청/응답 객체

  • ⛓️ chain.doFilter(): 다음 필터로 넘김 or Servlet 호출

  • 💡 필터 체인의 흐름을 여기서 직접 제어할 수 있음


🛠️ Servlet Filter 구현

🧪 요청 URL 로깅 필터

@Slf4j
public class CustomFilter implements Filter {
    @Override
    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain
    ) throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURI = httpRequest.getRequestURI();

        log.info("request URI={}", requestURI);

        chain.doFilter(request, response); // 다음 필터 or Servlet 호출
    }
}

💡 ServletRequest는 기능이 제한적이므로
HttpServletRequest로 다운캐스팅하여 사용함

🧾 Filter 등록 방법 (Spring Boot 방식)

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public FilterRegistrationBean customFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();

        filterRegistrationBean.setFilter(new CustomFilter()); // 필터 등록
        filterRegistrationBean.setOrder(1); // 실행 순서 (낮을수록 먼저)
        filterRegistrationBean.addUrlPatterns("/*"); // URL 패턴 지정

        return filterRegistrationBean;
    }
}

🔧 주요 설정 옵션

메서드설명
setFilter()적용할 Filter 객체 등록
setOrder()실행 우선순위 설정 (숫자가 작을수록 먼저 실행)
addUrlPatterns()필터 적용 대상 URL 설정 (ex. /api/*, /*)

💡 addUrlPatterns("/*") → 모든 요청에 필터 적용

⏱️ Filter의 동작 확인

🧪 Postman 요청 예시

  • GET /test 요청 시, Controller가 없어도
  • 콘솔에 로그 출력: request URI=/test

📌 이유: FilterController보다 먼저 실행되기 때문

⛓️ FilterChain 구조 & 흐름

  • Filter체인 방식으로 연결
  • doFilter()직접 다음 필터 호출
  • 마지막 필터 다음 → DispatcherServletController 호출

❗ Servlet Filter 정리

순서설명
1️⃣Filter 인터페이스를 구현
2️⃣구현한 필터를 Spring Bean으로 등록
3️⃣요청 발생 시 → doFilter() 실행
4️⃣ServletRequestHttpServletRequest로 다운캐스팅하여 사용
5️⃣chain.doFilter() 호출해야 다음 필터 또는 Servlet으로 진행됨
6️⃣Spring Boot에선 FilterRegistrationBean으로 등록/순서/경로 설정
7️⃣URL 패턴은 Servlet URL 패턴과 동일, 필터를 모든 요청에 적용 가능

📝 마무리 팁

항목내용
🔁 모든 요청에 적용addUrlPatterns("/*")
🧠 순서 지정setOrder(1) 등으로 우선순위 조절
⛔ 주의chain.doFilter() 호출하지 않으면 흐름 멈춤
@WebFilter 사용은 권장 XSpring Boot 환경에선 순서 제어 어려움

0개의 댓글