Filter
필터(Filter)는 HTTP 요청과 응답을 가로채어 처리할 수 있는 컴포넌트이다.
웹 애플리케이션에서 필터를 사용하면 요청을 처리하기 전이나 응답을 클라이언트에게
보내기 전에 특정 작업을 수행할 수 있다.
1. 필터의 기본 개념
정의 : 필터는 javax.servlet.Filter 인터페이스를 구현하는 Java 클래스이다.
역할 : 요청 전후에 작업을 수행하여 로깅, 인증, 인가, 요청 수정 등의 기능을 구현한다.
2. 필터의 주요 메서드
init(FilterConfig filterConfig) : 필터 초기화 시 호출된다. 초기화 작업을 수행한다.
doFilter(ServletRequest request, ServletResponse response, FilterChain chain) : 요청을 처리하는 메서드이다.
이곳에서 필터의 주 로직을 구현한다. chain.doFilter(request, response)를 호출하여 다음 필터 또는 서블릿으로 요청을 전달한다.
destroy() : 필터가 소멸될 때 호출된다. 리소스를 정리하는 데 사용된다.
3. 필터 등록
@Component 또는 @Bean을 사용하여 필터를 자동으로 등록할 수 있다.
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 필터 로직
chain.doFilter(request, response);
}
}
4. 필터 체인
여러 개의 필터가 있을 때, 요청은 필터 체인을 통해 순차적으로 처리된다.
각 필터는 chain.doFilter() 호출을 통해 다음 필터로 요청을 전달한다.
5. 필터의 사용 사례
로깅: 요청 및 응답 데이터 기록.
인증 및 인가: 사용자의 인증 정보를 확인.
CORS 설정: Cross-Origin Resource Sharing을 처리.
요청 수정: 요청 파라미터를 변경하거나 추가.
6. 주의사항
필터는 요청과 응답의 전체 수명 주기에 걸쳐 작동하므로 성능에 영향을 줄 수 있다.
필터가 올바르게 체인에서 다음 필터로 요청을 전달하지 않으면, 이후의 필터나 서블릿이 호출되지 않는다.
7. 필터와 인터셉터 비교
필터 : Servlet API에 기반하며, 모든 요청에 대해 실행된다.
인터셉터 : Spring MVC에서 사용되며, 컨트롤러에 대한 접근을 가로챈다.
요청과 응답 처리 후 추가적인 로직을 구현할 수 있다.
8. 예제
다음은 요청을 로깅하는 필터의 예제이다.
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("Request URI: " + httpRequest.getRequestURI());
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
9. @Slf4j, @Order
9-1 SLF4J (Simple Logging Facade for Java)
정의 : SLF4J는 Java에서 로그를 기록하기 위한 간단한 추상화 API이다.
다양한 로깅 프레임워크(예: Log4j, Logback 등)와 함께 사용할 수 있다.
주요 특징 :
추상화 : 로그 기록을 위한 공통 인터페이스를 제공하여, 특정 로깅 구현체에 종속되지 않는다.
유연성 : 개발자는 원하는 로깅 구현체를 선택할 수 있으며, 이를 변경하는 것이 쉽다.
사용 예 : 필터나 다른 컴포넌트에서 로그를 남기기 위해 SLF4J API를 사용한다.
예시:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(MyFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
logger.info("Request received");
chain.doFilter(request, response);
logger.info("Response sent");
}
}
9-2 Order
정의 : Spring Framework에서 Ordered 인터페이스를 통해 필터의 실행 순서를 정의할 수 있다.
Order는 필터나 인터셉터의 우선순위를 설정하는 데 사용된다.
주요 특징 :
정수 값 : 숫자를 사용하여 필터의 우선순위를 설정한다. 낮은 숫자가 높은 우선순위를 가진다.
사용 예 : 여러 개의 필터가 있을 때, 특정 필터가 먼저 실행되도록 설정할 수 있다.
예시 :
import org.springframework.core.Ordered;
public class MyFilter implements Filter, Ordered {
@Override
public int getOrder() {
return 1; // 낮은 값일수록 높은 우선순위
}
}
결론
스프링에서 필터는 HTTP 요청과 응답을 가로채어 다양한 작업을 수행할 수 있는 중요한 구성 요소이다.
필터는 보안, 로깅, 요청 수정 등의 기능을 구현하는 데 사용된다.
SLF4J:
로깅 추상화 : SLF4J는 다양한 로깅 구현체와 호환되는 통일된 로깅 API를 제공하여, 필터에서 발생하는 이벤트와 오류를 효과적으로 기록할 수 있다.
유연성 : 개발자는 특정 로깅 프레임워크에 종속되지 않고, 필요에 따라 로깅 구현을 쉽게 변경할 수 있다.
Order:
실행 순서 제어 : Order 인터페이스를 구현하여 필터의 실행 순서를 지정할 수 있다.
낮은 숫자 값이 더 높은 우선순위를 가지므로, 여러 필터 간의 실행 순서를 쉽게 관리할 수 있다.
조정 가능성 : 필터의 우선순위를 조정함으로써 요청 처리 흐름을 세밀하게 제어할 수 있어, 복잡한 로직을 효과적으로 처리할 수 있다.
이처럼 SLF4J와 Order를 활용하면, 스프링 필터에서 로깅과 실행 순서를 효과적으로 관리할 수 있어, 더욱 안정적이고 유지보수가 용이한 웹 애플리케이션을 개발할 수 있다. 필터는 웹 애플리케이션의 핵심 구성 요소로서, 요청과 응답 처리를 보다 정교하게 만들 수 있는 기능을 제공한다.
'Spring' 카테고리의 다른 글
[Spring] RestTemplate (2) | 2024.10.14 |
---|---|
[Spring] AOP, 트랜잭션, @Transactional (0) | 2024.10.14 |
[Spring] JWT (1) | 2024.10.10 |
[Spring] 쿠키와 세션 (0) | 2024.10.08 |
[Spring] JPA와 Entity (0) | 2024.10.07 |