์๋
ํ์ธ์, ์ค๋์ Filter์ Interceptor์ ์ฐจ์ด์ ๋ํด์ ์์ธํ ์์๋ณด๊ณ ์ ํฉ๋๋ค, ์ต๊ทผ ํฌ์คํ
ํ ๊ธ๋ค ์ค์์ AOP ๊ธฐ์ ์ ์ ์ฉํด์ ArgumentResolver๋ Interceptor๋ฅผ ๋ง๋ ์ ์ด ์๋๋ฐ์, ๊ทผ๋ฐ ๊ณผ๊ฑฐ ํ๋ก์ ํธ์์ OAuth2.0์ผ๋ก ๋ก๊ทธ์ธ ํ๋ ๊ณผ์ ์์ Filter๋ ์ฌ์ฉํ ์ ์ด ์๋๋ฐ, ๊ทธ๋๋ ๊ตฌํ์ด ์๊ธํ ์ํฉ์ด์๋์ง๋ผ ์ ๋๋ก ์ฐจ์ด๋ฅผ ์ธ์งํ๊ณ ๋ง๋ค์ง๋ ์์์.. ์ด๋ฒ ๊ธฐํ์ ์ ๋๋ก ์์๋ณด๊ณ ์ ํฉ๋๋ค ~ !

์ผ๋จ Filter์ Interceptor๊ฐ ์ฐจ์ด์ ์ด ์๋ ๊ธฐ๋ฅ์ด๋ผ๋ ์ฌ์ค์ ์๊ณ ์์์ต๋๋ค, ํ์ง๋ง ๋ ๊ธฐ๋ฅ์ ์ฐจ์ด์ ์ ์์ฃผ ๊ฐ๋ตํ๊ฒ ์๊ณ ์๋ค๋ ์ ์ด ๋ฌธ์ ์ธ๋ฐ์, ์ง๊ธ๋ถํฐ ์ ๊ฐ ์ด๋์ ๋ ๊น์ง ์๊ณ ์๋์ง ํ์ธํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๊ฒ ์ต๋๋ค.
๊ทผ๋ฐ ์ฌ์ฉ๋๋ ์์ญ์ด ๊ตณ์ด ์ ๋ค๋ฅธ๊ฑธ๊น?
-> ๊ทธ๊ฑฐ์ ๋ํด์ ์ง๊ธ๋ถํฐ ์์๋ณด์.

ํํฐ๋ Servlet API์์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ๋ก, Servlet Container ๋ด๋ถ์์ ๋์ํ๋ฉฐ ์์ฒญ์ ์ ์ฒ๋ฆฌ ๋ฐ ํ์ฒ๋ฆฌ ์์ ์ ์ํํฉ๋๋ค, ์ฆ DispatcherServlet์ ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ ํ์ URI ํจํด์ ๋ง๋ ๋ชจ๋ ์์ฒญ์ ๋ํ ์ถ๊ฐ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฆ DispatcherServlet์ Spring Context์์ ๊ฐ์ฅ ์ฒ์์ผ๋ก ์กด์ฌํ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ธ๋ฐ, Filter๋ ์ด๋ฌํ DispatcherServlet ์ ํ์ ๋์ํ๊ธฐ์ Spring Context ์ธ๋ถ์์ ๋์ํ๋ค, ์ด๋ Filter๋ Servelt Container ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ฉฐ ์์ธํ ๊ณผ์ ์ ์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.


init()
: Filter ๊ฐ์ฒด๊ฐ ์ต์ด๋ก ์์ฑ๋ ๋ ํธ์ถ๋ฉ๋๋ค, ์ด ๋ฉ์๋๋ฅผ ํตํด ํํฐ ์ด๊ธฐํ ์์
์ ์ํํ๋ฉฐ ์ฃผ๋ก ํ์ํ ์์์ ๋ก๋ํ๊ฑฐ๋ ์ค์ ์ ์ด๊ธฐํํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CustomFilter initialized");
}
doFilter()
: ์ด ๋ฉ์๋๊ฐ ์ค์ ํํฐ๋ง ์์
์ ์ํํฉ๋๋ค, ๋ชจ๋ HTTP ์์ฒญ์ด ์ด ๋ฉ์๋๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ฉฐ, ์์ฒญ ์ ์ฒ๋ฆฌ๋ ํ์ฒ๋ฆฌ ์์
์ ์ฌ๊ธฐ์ ์ํํ๊ฒ ๋ฉ๋๋ค.
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain
) throws IOException, ServletException {
// ์์ฒญ ์ ์ฒ๋ฆฌ ์์
์ํ
System.out.println("Before doFilter() in Filter");
// ๋ค์ ํํฐ๋ก ์์ฒญ ์ ๋ฌ
chain.doFilter(request, response);
// ์๋ต ํ์ฒ๋ฆฌ ์์
์ํ
System.out.println("After doFilter() in Filter");
}
destroy()
: Filter ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๊ธฐ ์ง์ ์ ํธ์ถ๋ฉ๋๋ค, ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํํฐ์์ ์ฌ์ฉํ ์์์ ์ ๋ฆฌํ๊ฑฐ๋ ํด์ฒดํ ์ ์์ต๋๋ค.
public void destroy() {
// ํํฐ ํด์ ์์
์ํ
System.out.println("CustomFilter destroyed");
}

์ธํฐ์ ํฐ๋ Spring MVC์์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ๋ก, DispatcherServlet์ด Controller๋ก ์์ฒญ์ ์ ๋ฌ ๋ฐ ์๋ต์ ํธ์ถํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ DispatcherServlet์ด HandlerMapping์ ํตํ์ฌ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ก ์์ฒญํ๋๋ฐ ๊ทธ ๊ณผ์ ์์ Interceptor๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด ์์ฐจ์ ์ผ๋ก Interceptor๋ฅผ ๊ฑฐ์ณ ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋๋๋ก ํฉ๋๋ค.
์ฆ ์ธํฐ์
ํฐ๋ ์คํ๋ง ์ปจํ
์ด๋ ๋ด์์ ๋์ํ๋ฉฐ ์์ฒญ -> Filter -> DispatcherServlet -> HandlerMapping -> Interceptor(PreHandle) -> HandlerAdapter -> Controller -> Service -> Repository -> Interceptor(postHandle) -> ์๋ต ์์ผ๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค, ์๋ ๊ทธ๋ฆผ์ ํตํด ๋์์ ๋ ์ดํดํ์ค ์ ์์ต๋๋ค.

preHandle()public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler
) throws Exception {
// ํธ๋ค๋ฌ ์คํ ์ ์ ์คํ๋ ์์
์ํ
System.out.println("Before preHandle() in Interceptor");
return true; // ํธ๋ค๋ฌ ์คํ ํ์ฉ
}postHandle() public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler, ModelAndView modelAndView
) throws Exception {
// ํธ๋ค๋ฌ ์คํ ํ, View๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ์คํ๋ ์์
์ํ
System.out.println("After postHandle() in Interceptor");
}afterCompletion()public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex
) throws Exception {
// ํธ๋ค๋ฌ ์คํ ํ, View๊ฐ ๋ ๋๋ง๋ ํ์ ์คํ๋ ์์
์ํ
System.out.println("After afterCompletion() in Interceptor");
}
์ฐ์ Filter์ Interceptor๋ฅผ ๋๋๋ ์ด์ ๋ ๊ฐ์์ ์ญํ ๊ณผ ์ฑ ์์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๊ณ , ๋ค์ํ ์๊ตฌ ์ฌํญ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํจ์ธ๋ฐ์, ๊ตฌ์ฒด์ ์ธ ์ด์ ๋ก๋ ์๋ ๋ด์ฉ์ ํ์ธํ์๋ฉด ๋ฉ๋๋ค.
FilterInterceptorFilterInterceptorFilterInterceptor๊ทธ๋ฆฌ๊ณ ์๋ ๊ทธ๋ฆผ์ ํตํ์ฌ ๋ ์ดํดํ์ค ์ ์์ต๋๋ค.

์ค๋์ ์ด๋ ๊ฒ Filter์ Interceptor์ ์ฐจ์ด์ ๋ํด์ ์์๋ณด์๋๋ฐ์, ์ ๋ฆฌํ์๋ฉด Filter๋ ๋งค์ฐ ํฐ, ์ ์ญ์ ์ธ ์์ ์ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, Filter์์ ๋ชจ๋ ๊ฒ์ฆ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ Interceptor๋ฅผ ํตํ์ฌ ์ถ๊ฐ๋ก ํ์ํ ๋ถ๊ฐ์์ ์ ์ด์ด์ ํด์ค์ผ๋ก์จ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ฌ์ค๋ค๊ณ ๋ณด์ค ์ ์์ต๋๋ค.
๋ฐ๋ผ์, Filter์ Interceptor๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๊ฐ๊ธฐ ๋ค๋ฅธ ์์ค์์ ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ ์ฒ๋ฆฌ ๊ณผ์ ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.

๊ฐ์ฌํฉ๋๋ค.
์ฐธ๊ณ
https://mangkyu.tistory.com/173
https://docs.spring.io/spring-security/site/docs/5.3.2.RELEASE/reference/html5/#servlet-architecture