Spring은 Filter를 확장하여 GenericFilterBean을 제공한다.
GenericFilterBean은 기존 Filter에서 얻어올 수 없는 정보였던 Spring의 설정 정보를 가져올 수 있게 확장된 추상 클래스다.
public abstract class GenericFilterBean implements Filter, BeanNameAware, EnvironmentAware,
EnvironmentCapable, ServletContextAware, InitializingBean, DisposableBean {
/** Logger available to subclasses. */
protected final Log logger = LogFactory.getLog(getClass());
@Nullable
private String beanName;
@Nullable
private Environment environment;
@Nullable
private ServletContext servletContext;
@Nullable
private FilterConfig filterConfig;
private final Set<String> requiredProperties = new HashSet<>(4);
--- 생략 ---
이 2개의 공통점은 매 서블릿 마다 호출이 된다는 사실이다.
쉽게 말하자면
그런데 이때 해당 서블릿이 다른 서블릿으로 dispatch 되면??
대표적으로 Spring Security의 인증과 접근 제어 기능이 Filter로 구현되어있다.
RequestDispatcher에 의해 다른 서블릿으로 dispatch 되게 되는데 이 때 목적 서블릿에 도달하기 전에 다시 한번 filter chain을 거친다. 이러면서 filter가 두 번 실행되는 현상이 생길 수 있다. 이때 이러한 문제를 해결하고 일관성 있는 요청을 처리하게 해주는게 바로 OncePerRequestFilter 다!!