OncePerRequestFilter

정명진·2023년 1월 3일
0

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개의 공통점은 매 서블릿 마다 호출이 된다는 사실이다.

쉽게 말하자면

  1. 서블릿이 요청을 받는다.
  2. 서블릿을 생성해 메모리에 저장한다.
  3. 만약 다음에 같은 클라이언트로부터 동일한 요청을 받으면 생성해둔 서블릿 객체를 재활용해 처리한다.

그런데 이때 해당 서블릿이 다른 서블릿으로 dispatch 되면??

대표적으로 Spring Security의 인증과 접근 제어 기능이 Filter로 구현되어있다.
RequestDispatcher에 의해 다른 서블릿으로 dispatch 되게 되는데 이 때 목적 서블릿에 도달하기 전에 다시 한번 filter chain을 거친다. 이러면서 filter가 두 번 실행되는 현상이 생길 수 있다. 이때 이러한 문제를 해결하고 일관성 있는 요청을 처리하게 해주는게 바로 OncePerRequestFilter 다!!

profile
개발자로 입사했지만 정체성을 잃어가는중... 다시 준비 시작이다..

0개의 댓글