우당탕 개발일지

OncePerRequestFilter 와 Filter 의 차이 본문

기술/Java

OncePerRequestFilter 와 Filter 의 차이

럽모네 2024. 2. 10. 22:56

Spring 을 사용하는 개발자라면 익히 Filter 에 대해서 들었을 것입니다.

Filter 는 jakarta.servlet 에서 제공되는 인터페이스로 서블릿 컨테이너에서 Http 요청을 인터셉트 하여 필터 체인을 통해 인증, 로깅, 압축 보안 등의 공통 작업을 처리하여 서비스의 보안을 높여주는 기능을 수행합니다.

 

그런데 이런 Filter 가 중복으로 호출 되는 경우가 있습니다.

  1. 여러개의 Filter 가 동일한 Url 패턴으로 등록되어 있고 모두 filter chain 이 포함되어 있는 경우 filter 가 순서대로 호출되어 중복 호출이 발생하는 경우
  2. forwarding : forwarding 은 현재의 요청을 다른 servlet 이나 jsp 로 전달을 하게 되는데 이 때 요청/응답에 대해 동일한 작업을 수행하여 중복호출이 발생. 이 말이 좀 어려운데 dispatcher servlet 이 요청을 받아 controller 까지 결과를 생성한 후 forward method 를 사용해서 다른 서블릿으로 결과를 전달하는 경우가 있습니다. 이 말은 결국 forwarding 을 통해 이전에 전달한 요청을 다시 한번 filter 에 보내 중복으로 처리한다는 의미입니다.

이런 동일한 필터가 여러번 호출되는 경우를 방지하기 위해서 사용하는 것이 OncePerRequestFilter 입니다.

OncePerRequestFilter 는 Spring 에서 전달한 요청을 한번만 실행되도록 보장해줍니다.

 

@Component
@RequiredArgsConstructor
public class CustomWebFilter extends OncePerRequestFilter {

  @Override
  protected void doFilterInternal(
      HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException {
      
        System.out.println("--- CustomWebFilter START ---");
        filterChain.doFilter(request, response);
        System.out.println("--- CustomWebFilter END ---");
 	}
 }

 

동기 요청에 대해서는 doFilterInternal method 를 오버라이드 해서 사용할 수 있지만 비동기 요청에 대해서는 기본적으로 제공되지 않기 때문에 내부에 있는 shouldNotFilterAsyncDispatch , shouldNotFilterErrorDispatch 를 재정의 해서 사용해야 합니다.

 

[OncePerRequestFilter 내용 중 shouldNotFilterAsyncDispatch , shouldNotFilterErrorDispatch method]

 

참고 Url : https://www.baeldung.com/spring-onceperrequestfilter