Filter와 FilterChain에 대하여 알아보자
이번 포스팅에서는 Servlet Filter와 FilterChain에 대해 알아보겠습니다. 이름에서 짐작할 수 있듯이, FilterChain은 여러 개의 Filter를 체인 형태로 연결하여 순차적으로 처리하는 역할을 합니다. 어떻게 처리할 수 있는 지 알아보겠습니다.
그 전에 Filter에 대해서 가볍게 확인해보고 가겠습니다.
Filter 인터페이스
Filter 인터페이스에는 doFilter 메서드가 있습니다. 해당 메서드의 파라미터에는 요청과 응답 정보를 담고 있는 ServletRequest와 ServletResponse 객체가 포함되어 있습니다. Filter는 이를 사용해서 웹 애플리케이션의 요청과 응답을 쉽게 처리할 수 있습니다.
- doFilter 메서드에서 요청을 가로채서 필요한 처리를 수행합니다. (검증, 변형 등)
- filterChain.doFilter()를 호출하여 다음 단계로 요청을 넘깁니다.
- .....
- doFilter 메서드에서 응답을 가로채서 필요한 처리를 수행합니다.
- 최종적으로 응답이 클라이언트에게 전송됩니다.
이러한 필터는 Spring Boot에서는 FilterRegistrationBean을 사용하여 필터를 등록할 수 있습니다. 등록할 때, 순서와 urlPatterns 등을 지정할 수 있습니다.
ApplicationFilterChain

AppliationFilterChain은 FilterChain 인터페이스의 구현체입니다. Filter에서 doFilter 메서드를 호출하면 메서드 내부에서 다음 Filter로 넘어가기 위해서 filterChain.doFilter 메서드를 호출합니다.

internalDoFilter 메서드에는 n과 pos라는 변수를 사용합니다.
n은 filterChain에 등록된 필터의 개수를 의미합니다. 그리고, pos 지역 변수는 현재 필터의 인덱스를 나타냅니다.
여기서는 pos가 n보다 작다면 pos++를 수행하여 다음 필터를 실행할 수 있도록 하고, 현재 필터의 doFilter 메서드를 호출하여 실행합니다. 이 과정이 반복되어 FilterChain에 등록된 모든 필터가 실행되면, 요청은 DispatcherServlet으로 전달됩니다.
결론
Filter들은 FilterChain에 등록되며, 필터의 doFilter 메서드에서 filterChain.doFilter()를 호출하면 내부적으로 다음 필터의 doFilter 메서드가 실행됩니다.
그리고, Filter를 사용하면서 한 가지 주의해야할 것이 있습니다. 바로, return을 사용하는 것입니다.
위에서 알 수 있듯이 return을 사용하면 다음 필터가 실행되지 않습니다. 그렇게 되면 요청이 DispatcherServlet으로 전달되지 않아 Handler가 실행되지 않습니다. 따라서, 비즈니스 로직을 정상적으로 처리해야하는 경우 return을 사용하면 안 됩니다.
지금까지 Filter와 FilterChain간의 관계에 대해서 알아보았습니다. 감사합니다.