Spring

[Spring] Filter | Filter Interface

kimslab01 2024. 8. 29. 15:09

 

 

 

 

Filter란?

 

서블릿 필터(Servlet Filter)는 Java 웹 애플리케이션에서 클라이언트의 요청(request)과 응답(response)을 가로채서 처리할 수 있는 강력한 매커니즘입니다.

필터는 요청이 특정 서블릿에 도달하기 전 또는 응답이 클라이언트에게 전달되기 전에 실행됩니다.

이를 통해 요청/응답 데이터를 조작하거나, 접근을 제어하고, 로깅을 수행하는 등의 작업을 할 수 있습니다.

 

 

 

Filter Interface

 

서블릿 필터 인터페이스는 jakarta.servlet.filter 인터페이스를 구현하여 작성됩니다.

이 인터베이스는 서블릿 요청을 가로채어 처리할 수 있도록 하는 메서드들을 제공합니다.

 

예시

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.logging.Logger;

@WebFilter(urlPatterns = "/*")  // 모든 요청에 대해 필터 적용
public class ExampleFilter implements Filter {

    private final Logger logger = Logger.getLogger(ExampleFilter.class.getName());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 필터 초기화 작업 (필요시)
        logger.info("ExampleFilter initialized");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 요청 처리 전
        logger.info("ExampleFilter: Request processing started");

        // 다음 필터로 요청을 전달하거나 서블릿에 전달
        chain.doFilter(request, response);

        // 응답 처리 후
        logger.info("ExampleFilter: Response processing completed");
    }

    @Override
    public void destroy() {
        // 필터 종료 작업 (필요시)
        logger.info("ExampleFilter destroyed");
    }
}

 

 

 

주요 메서드 설명

 

1. init(FilterConfig filterConfig)

  • 필터가 초기화될 때 호출됩니다.
  • FilterConfig 객체를 통해 필터 초기화 매개변수를 읽어올 수 있습니다.
  • 이 메서드는 필터 인스턴스가 생성된 후 딱 한 번 호출됩니다.

 

2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

  • 필터의 핵심 메서드로, 각 요청이 들어올 때마다 호출됩니다.
  • ServletRequest와 ServletResponse 객체를 사용하여 요쳥과 응답을 처리할 수 있습니다.
  • FilterChain의 doFilter() 메서드를 호출함으로써, 다음 필터나 최종 대상(서블릿)으로 요청을 전달합니다.
  • doFilter() 호출 전후에 추가 작업을 할 수 있습니다. (로깅, 인증 검사 등)

 

3. destroy()

  • 필터가 서비스에서 제거될 때 호출됩니다.
  • 리소스를 해체하거나 종료 작업을 수행할 때 유용합니다.

 

 

 

필터 적용 대상 지정

  • @WebFilter(urlPatterns = "/*) 이 어노테이션을 통해 필터가 적용될 URL 패턴을 지정할 수 있게 됩니다. 위 예시에서는 모든 요청(/*)에 대해 필터가 적용됩니다.
  • 특정 URL 패턴에만 필터를 적용하고 싶다면 urlPatterns 속성을 변경하면 됩니다.

 

 

 

동작 과정

  • 요청 전 처리: doFilter() 메서드의 chain.doFilter() 호출 이전에 요청을 처리하거나 가로챌 수 있습니다.
  • 응답 후 처리: chain.doFilter() 호출 이후에 응답을 처리하거나 수정할 수 있습니다.

 

 

 

결론

 

이 필터는 모든 요청을 로깅하며, 로그를 통해 요쳥과 응답이 어떻게 처리되는지 확인할 수 있게 합니다.

Logger를 사용하여 콘솔에 로그 메세지를 출력하며, doFilter 메서드를 이용하여 요청을 다음 필터로 전달하거나 서블릿으로 전달합니다.