๐ก Spring framework์ ๋ด๋ถ ๋์์ ๋ํด์ ๊ณต๋ถํ๋ค๋ณด๋ฉด Filter์ Interceptor๋ ๋บด๋์ ์ ์๋ ์์์ ๋๋ค. ์ ๋ด๋ถ ๋ก์ง์ Filter๋ Interceptor๋ฅผ ๋์๊น?๋ฅผ ์๊ณ ์ด๋ฅผ ํ์ฉํ ์ค ์์์ผ ์์ค ๋์ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ ์ ์์ ๊ฒ์ ๋๋ค. ๋จ์ํ ์ Filter๋ Interceptor๊ฐ ์๊ตฌ๋ ํ๊ณ ๋์ด๊ฐ๋ฉด Filter์ Interceptor์ ์กด์ฌ์์ ๋์ค๋ ์ฅ์ ๋ค์ ๋์น ์ฑ ๊ฐ๋ฐ์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ Filter์ Interceptor๋ฅผ ๋์๊น, ๋ฌด์จ ์ญํ ์ ํ ๊น, ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น์ ๋ํด์ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊น ํฉ๋๋ค. โ๏ธ
์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค๋ณด๋ฉด ์๊ตฌ์ฌํญ์ ๋ง๋ API ๊ฐ๋ฐ๋ฟ๋ง ์๋๋ผ ํ์์ ์ผ๋ก ๊ฐ๋ฐํด์ผ ๋๋ ์์๋ค์ด ์์ต๋๋ค.
API์ URL์ ๋ฐ๋ผ ์์ดํ ๋์์ ์๊ตฌํ ์ ์๊ฒ ์ง๋ง, ๊ฐ์ ๋์์ด๋ ๋ค๋ฅธ ๋์์ด๋ ๊ณตํต์ ์ผ๋ก ๋ชจ๋ API์ ํ์๋ก ์ ์ฉ๋์ด์ผ ํ๋ ์์๋ค์ ๋๋ค.
์ ๋ด์ฉ์ ์ธ๊ธํ ์ด์ ๋ ๋ค๋ค ๋์น์ฑ๋ค์ํผ Filter์ Interceptor๊ฐ ์ ์์๋ค์ ๋ํ ์ฑ ์ ๋ฐ ๊ตฌํ์ ์ญํ ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์ ์ญํ ๋ค์ ํ๊ธฐ ์ํด ์ 2๊ฐ์ง ๊ฐ๋ ์ด ํ์ํ๊ณ ๋ง๋ค์ด์ง๊ฒ ๋์์๊น์?
์์ ๋๋ฅผ ์๊ฐํ๋ฉด ์ฌ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ 2๊ฐ์ง layer๊ฐ ์์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํด Controller, Service Layer์์ ์ ๋์๋ค์ ์ฒ๋ฆฌํ ์ ๋ฐ์ ์์ต๋๋ค. ์ ์์๋ค์ ๋ชจ๋ API์ ๋ํด ๊ณตํต์ ์ผ๋ก ์ํ๋์ด์ผ ํ๋ ๊ฒ๋ค์ธ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก ์ฝ๋์ ์์ ๋ฐฉ๋ํด์ง๊ณ , ์ค๋ณต๋์ด์ง๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌด๊ฑฐ์์ง ์ ๋ฐ์ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ์ ์ฐ๋ฆฌ๋ ์์ ์ ๋ฐ๋ผ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์์ต๋๋ค. ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ๋ค์ ๊ณ ์ค๋ํ ์ป์ ์ ์๋๋ฐ์,
๊ทธ๋ฌ๋ฉด ์ด๋ค ์์ ์ ๋ฐ๋ผ ๋ถ๋ฆฌํ์ฌ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์์๊น์?
Spring MVC ๋ด๋ถ ๋์
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ ๊ทผํ๊ธฐ ์ (1)
์์ฒญ์ด DispatcherServlet์ผ๋ก ๋ถํฐ Controller๋ก ์ ๊ทผํ๊ธฐ ์ (2)
Controller์์ Service - Repository ~ (3)
+์ถ๊ฐ) DispatcherServlet์ด๋?
DispatcherServlet์ด๋ ํด๋ผ์ด์ธํธ๋ก ๋ค์ด์จ HTTP ์์ฒญ์ Controller๋ก ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. Controller๋ณด๋ค ์๋จ์์ ์์ฒญ์ ์ ๋ฌ๋ฐ๊ธฐ ๋๋ฌธ์ Front Controller๋ผ๊ณ ๋ ํฉ๋๋ค. ์ ๋ ์๋ Filter์ Interceptor์ ํ์ ๋ฐฐ๊ฒฝ๊ณผ ๋น์ทํ ๋ถ๋ถ์ด ์๋๋ฐ์, DispatcherServlet์ด ๋ฑ์ฅํ๊ธฐ ์ ์ HTTP ์์ฒญ์ ํ๋ API์ ๋ง๋ ์๋ธ๋ฆฟ์ ์ผ์ผ์ด ๊ตฌํํด์ผ๋ง ํ๊ณ ๊ฐ๊ฐ์ ์๋ธ๋ฆฟ์ ๋ง๋ Controller์ ๋งคํ์ ํด์ผ๋ง ํ์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด DispatcherServlet์ด ๋ฑ์ฅํ์๋๋ฐ์,
DispatcherServlet์ ํ๋์ ์๋ธ๋ฆฟ ๊ฐ๋ ์ผ๋ก ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ์ ๋ค, ์์ฒญ์ ๋ํ ๊ณตํต์ ์์ ์ ์ํ(ex, ํ๊ธ/์์ด ์ธ์ฝ๋ฉ)ํ๊ณ ์ด๋ฅผ Controller์ ๋ฟ๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
๋ํ DispatcherServlet๋ resources ํด๋์ ์๋ ์ ์ ๋ฆฌ์์ค(์ด๋ฏธ์ง, ํ์ผ, html)์ ์์ฒญ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฒญ๊ณผ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ๋ ์ํํ๋๋ฐ์, ์์ฒญ์ด ๋ค์ด์ค๋ฉด controller(์ ํ๋ฆฌ์ผ์ด์
)์ ํด๋น ์์ฒญ์ ๋ํ ๋งคํ์ด ์๋์ง ํ์ํ๊ณ ์์ ์, resources ๋ก ์ ๊ทผํ๋ ๋ก์ง์ ํตํด ์ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
์ ๊ทธ๋ฆผ์ ํตํด 3๊ฐ์ง๋ก ๋ถ๋ฆฌํ ์์ ์ ๋ํด ์ ์ดํดํด ๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
(1) ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์คํ๋ง ์ปจํ ์ด๋์ ์ ๊ทผํ๊ธฐ ์ : Filter์ ์ญํ
ServletContainer ์ DispatcherServlet์ผ๋ก ์์ฒญ์ ๋๋ฌํ๊ธฐ ์ ๊ณผ DispatcherServlet์ผ๋ก ๋ถํฐ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ํด๋ผ์ด์ธํธ๋ก ๊ฐ๊ธฐ ์ ์ ๋ฐ์ดํฐ์ ๋ํ ์์ ์ Filter๊ฐ ์ํํ๊ฒ ๋ฉ๋๋ค. ๋ณดํต ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ ์ญ์ผ๋ก ์ฒ๋ฆฌ๋๋ ์์ ๋ค(ex) ๋ณด์ ์ฒ๋ฆฌ)์ ์ํํ๊ฒ ๋๋๋ฐ์,
๋ณด์๊ณผ ๊ด๋ จ๋ ์์ ์ธ์๋ ์๋์ ๊ฐ์ ์์ ๋ ์ํํฉ๋๋ค.
(2) ์์ฒญ์ด DispatcherServlet์ผ๋ก ๋ถํฐ Controller๋ก ์ ๊ทผํ๊ธฐ ์ : Interceptor์ ์ญํ
์ 2๊ฐ์ง ๊ณผ์ ์ฌ์ด์์ Interceptor๊ฐ ์์ ์ ์ํํฉ๋๋ค. ๋ณดํต ๊ถํ ๊ฒ์ฌ(์ธ๊ฐ), View ๋ ๋๋ง ์ ์ถ๊ฐ ์์ ๋ฑ์ ์ํํฉ๋๋ค.
(3)Controller์์ Service - Repository ~
์์์ ๋ค๋ฃฌ Filter, Interceptor์ ์ญํ ์ ๋๋ถ์ App์์ ๋ถ๋ฆฌ๋์ด์ง๋ Controller - Service - Repository ๊ณ์ธต์ ๊ฐ๊ฐ์ ์ญํ ๊ณผ ์ฑ ์์ ์ง์คํ ์ ์์ต๋๋ค.
๋ญ๊ฐ ์ข์์ง๊ฑฐ์ง? ๐ฏ๏ธ
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
์์์ ์คํ ์์ ์ด ๋ค๋ฅด๊ณ , ํ๋ ์ญํ ์ด ๋ค๋ฅธ ๊ฒ์ ๋ค๋ค๋ณด์๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ 2๊ฐ์ง ์ฐจ์ด์ ์ ๋ํด ๋ค๋ค๋ณด๊ณ ์ถ์ต๋๋ค.
์คํ๋ง์์ ์์ธ์ฒ๋ฆฌ๋ ๋ฐ์ ์์น์ ๋ฐ๋ผ 2๊ฐ์ง๋ก ๋ถ๋ฆฌ๋์ด์ง ์ ์์ต๋๋ค.
Filter ์์๋ ServletRequest, ServletResponse ๊ฐ์ฒด๋ก ์์ฒญ/์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต๋ฐ๊ธฐ ๋๋ฌธ์ ๋ํ ์กฐ์์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ฉด์ Interceptor์์๋ HttpServletRequest, HttpServletResponse ๊ฐ์ฒด๋ก ์์ฒญ/์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต๋ฐ๊ธฐ ๋๋ฌธ์ ์กฐ์์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ ๊ธฐ์ Filter์์ ๋๊ฐ ์ด๋ฏธ์ง ๋ฐ ๋ฐ์ดํฐ ์์ถ์ ์ํํ๋ฉฐ Interceptor์์๋ ๊ฐ์ฒด ๋ด๋ถ ๊ฐ์ ํตํด ์ปจํธ๋กค๋ฌ๊ฐ ์๊ตฌํ๋ ํ์์ ๋ฐ์ดํฐ ๊ฐ๊ณต์ ์ํํฉ๋๋ค.
์ฌ์ค ํฌ์คํ ์ ๊ฒฐ์ ํ๋ ๊ฑด Spring Security๋ฅผ ํตํด ์ฌ๋ฌ Filter์ ๊ณต๋ถํ๊ฒ ๋์๊ณ , Spring์์ Filter์ Interceptor๊ฐ ์ค์ํ ์ญํ ์ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฒ ํฌ์คํ ์ ์์ฑํ๋ฉด์ Spring Security์์ ์ ์๊พธ ์ฌ๋ฌ๊ฐ์ง Filter๋ฅผ ์ฌ์ฉํ๋ฉด์ Secureํ ์์ ๋ค์ ์ํํ๋์ง ์๊ฒ ๋์ด Spring Security๋ฅผ ์ ์ฉํ๊ณ ํ์ตํ ๋ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์ ํฌ์คํ ์ผ๋ก Spring Security์์์ Filter์ ํ๋ก์ ํธ์์ ๋งก์๋ CorsFilter ์ ์ฉ์ ๋ํด์ ์์ฑํด๋ณด๊ณ , ์ 2๊ฐ์ง ๊ฐ๋ ๊ณผ ๋น์ทํ AOP ์ ๋ํด์๋ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค ๐คญ
[Spring] ํํฐ(Filter) vs ์ธํฐ์ ํฐ(Interceptor) ์ฐจ์ด ๋ฐ ์ฉ๋
(Spring)Filter์ Interceptor์ ์ฐจ์ด
Spring Filter, Interceptor ๊ทธ๋ฆฌ๊ณ AOP
[Spring] Filter, Interceptor, AOP ์ฐจ์ด ๋ฐ ์ ๋ฆฌ
[์นด์นด์ค ๋ฉด์ ] Spring Filter, Interceptor, AOP
Filter ์ Interceptor์ ์ฐจ์ด๋?
[Java][Spring] Filter์ Interceptor
Spring Interceptor๋ ๋ฌด์์ธ๊ฐ. ํํฐ์ ์ธํฐ์ ํฐ์ ์ฐจ์ด
[Spring]Dispatcher-Servlet(๋์คํจ์ฒ ์๋ธ๋ฆฟ)์ด๋?