[Spring Boot] OncePerRequestFilter๋?
๐ OncePerRequestFilter
๐ฝ ๊ฐ์
๐ฆ Filter์ OncePerRequestFilter ์ฐจ์ด
Filter์ ๋ํด ์ค๋ช
ํ ๋ด์ฉ์ ์ด ๊ณณ์ ํตํด ์ค๋นํด ๋์์ด์.
OncePerRequestFilter Class๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ Http Request์ ํ ๋ฒ์ ์์ฒญ์ ๋ํด ํ ๋ฒ๋ง ์คํํ๋ Filter์์.
์๋ฅผ ๋ค์ด Forwarding์ด ๋ฐ์ํ๋ฉด Filter Chain์ด ๋ค์ ๋์ํ์ฌ ์ธ์ฆ์ฒ๋ผ ๋ฑ ํ๋ฒ๋ง ํด์ผ ํ๋ Logic์ด ๋ถํ์ํ๊ฒ ์ฌ๋ฌ๋ฒ ์ํ๋ ์ ์์ด์.
๐ฆ doFilter()
doFilter()๋ ์ต์ด ์คํ ์ ServletRequest ๊ฐ์ฒด์ ์์ ์ ์ด๋ฆ๊ณผ ์ํํ์์์ ํ์๊ฐํ ์ํ Boolean์ true ๊ฐ์ ํจ๊ป ๋ฃ์ด ๋์ด์. ๊ทธ๋ฐ ๋ค doFilterInternal()์ ํตํด ์์ ์ ๊ธฐ๋ฅ์ ์ํ ํ๋ต๋๋ค.
๋ฆฌ๋ค์ด๋ ํธ ๋ฑ์ผ๋ก ๋ค์ ์คํ๋๋ ๊ฒฝ์ฐ ์ด ์ ์ํ์์ ์์ฒญ ๊ฐ์ฒด์ ๋ด์๋๋ ์ํ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฒ ๋๊ณ , ์ด๋ฏธ ์ํ๋์๋ค๊ณ ํ์๊ฐ ๋๋ฉด Filter Chain์๊ฒ ์์ฒญ๊ณผ ์๋ต ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํด์.
public abstract class OncePerRequestFilter extends GenericFilterBean {
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletResponse httpResponse = (HttpServletResponse)response;
String alreadyFilteredAttributeName = this.getAlreadyFilteredAttributeName();
boolean hasAlreadyFilteredAttribute = request.getAttribute(alreadyFilteredAttributeName) != null;
if (!this.skipDispatch(httpRequest) && !this.shouldNotFilter(httpRequest)) {
if (hasAlreadyFilteredAttribute) {
if (DispatcherType.ERROR.equals(request.getDispatcherType())) {
this.doFilterNestedErrorDispatch(httpRequest, httpResponse, filterChain);
return;
}
filterChain.doFilter(request, response);
} else {
request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);
try {
this.doFilterInternal(httpRequest, httpResponse, filterChain);
} finally {
request.removeAttribute(alreadyFilteredAttributeName);
}
}
} else {
filterChain.doFilter(request, response);
}
} else {
throw new ServletException("OncePerRequestFilter just supports HTTP requests");
}
}
}
์ฆ, ์ด๋ Filter์์ Header๋ฅผ ํ์ธ ํ ๋ค ํน์ URL๋ก Forwarding ํ๋ค๊ณ ํ ๋, ์์ธ๊ฐ ๋ฐ์ํ์ง ์์๋ค๋ฉด URL๋ก ํฌ์๋ฉ ์ํค๋ ๊ฒ ์์ฒด๊ฐ ์๋ธ๋ฆฟ ์คํ ์ค ์์ฒญ์ด ์ฌ ๊ฒ์ด์์.
OncePerRequestFilter๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์์์ ๊ฑฐ์น Filter๋ฅผ ๋ ๊ฑฐ์น๊ฒ ๋๊ณ , ์์ ๋ญ๋น๋ฅผ ํ๋ ์
์ด ๋์ด ๋ฒ๋ ค์.
์ด ๋, ๋์ผํ ์์ฒญ์์์ ํ๋ฒ๋ง Filtering ํ ์ ์๊ฒ ํด ์ฃผ๋ ๊ฒ์ด OncePerRequestFilter์ ์ญํ ์ด๋ฉฐ, ์ธ์ฆ ๋๋ ์ธ๊ฐ์ ๊ฐ์ด ํ๋ฒ๋ง ๊ฑฐ์ณ์ผ ํ๋ Logic์ ๋ง์ด ์ฌ์ฉ๋๋ต๋๋ค.
์ธ์ฆ, ์ธ๊ฐ๋ฅผ ๊ฑฐ์น๊ณ ํน์ URL๋ก ํฌ์๋ฉํ๋ฉด ์์ฒญ์ด ๋ค์ด์์ผ๋ ์ธ์ฆ, ์ธ๊ฐ Filter๋ฅผ ๋ค์ ์คํ ์์ผ์ผ ํ์ง๋ง, OncePerRequestFilter๋ฅผ ์ด์ฉํ๋ฉด ์ธ์ฆ, ์ธ๊ฐ๋ฅผ ํ๋ฒ๋ง ๊ฑฐ์น๊ณ ๋ฐ๋ก ๋ค์ Logic์ ์งํํ ์ ์๋๋ก ์ฌ์ฉํ ์ ์์ด์.