본문 바로가기
Spring

[Spring] Filter (@Slf4j, @Order)

by 박졔삐 2024. 10. 14.

 

 

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를 활용하면, 스프링 필터에서 로깅과 실행 순서를 효과적으로 관리할 수 있어, 더욱 안정적이고 유지보수가 용이한 웹 애플리케이션을 개발할 수 있다. 필터는 웹 애플리케이션의 핵심 구성 요소로서, 요청과 응답 처리를 보다 정교하게 만들 수 있는 기능을 제공한다.

728x90
반응형

'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