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 메서드를 이용하여 요청을 다음 필터로 전달하거나 서블릿으로 전달합니다.
'Spring' 카테고리의 다른 글
[Spring] 스프링 예외처리 통일 | 스프링 HttpStatus 반환 통일 | 스프링 에러 통일 (3) | 2024.09.05 |
---|---|
[Spring] JWT 인증 처리 로직 클래스 설계 (0) | 2024.08.29 |
[Spring] 1대N 관계 | N대1 관계 | N대M | 양방향, 단방향 관계 정리 (0) | 2024.08.28 |
[Spring] 3 Layer Architecture | Spring 3 Layer (0) | 2024.08.21 |
[Spring] Spring MVC | Spring MVC의 개념 (0) | 2024.08.20 |