๊ฐ์
์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๋ฉด ํน์ ๋จ๊ณ์์ ์๋ํ๊ฑฐ๋, ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๋ณต๋๋ ๋ก์ง์ ๊ณตํต์ผ๋ก ๊ด๋ฆฌํด์ผ ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด Filter , Interceptor, AOP ์
๋๋ค.
๋ชจ๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ์ฝ๋๊ฐ ์๋ค๋ฉด ์ค๋ณต์ด ๋์ด๋๊ณ , ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋๋ค. ์ด ์ธ ๊ธฐ์ ์ ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต์์ ์ค๋ณต๋๋ ๋ก์ง์ ์ ๊ฑฐํ๊ณ , ํน์ ๋จ๊ณ์์์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ก์ฑ๊ฑฐ๋ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๊ธ์์๋ ์ด ์ธ ๊ฐ์ง ๊ธฐ์ ์ ์ ์์ ํน์ง, ๊ฐ ์ฌ์ฉ ์ผ์ด์ค๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
์คํ ์์
์์ฒญ์ด ๋ค์ด์ค๋ฉด Request → Filter → Servlet → Interceptor → AOP → Controller ์์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ Filter๋ Spring๊ณผ ๋ฌด๊ดํ Web Context์ ์ํ๋ฉฐ Interceptor์ AOP๋ Spring Context์ ์ํ๊ฒ ๋ฉ๋๋ค.
์๋ต์ ์ญ์์ธ Controller → AOP → Interceptor → Filter → Response ์์ผ๋ก ์งํ๋ฉ๋๋ค.
Filter
๊ฐ๋
Filter๋ Spring ์ปจํ
์ด๋์ ๋ฌด๊ดํ ์น ์ปจํ
์ด๋๊ฐ ๊ด๋ฆฌํ๋ฉฐ, DispatcherServlet ์ ํ๋ก ์ฒ๋ฆฌ ์์
์ ์ง์ํฉ๋๋ค.
๊ตฌํ
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
public default void destroy() {}
}
init
: ํํฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ณ ์๋น์ค์ ์ถ๊ฐํ๋ ๋ฉ์๋
doFilter
: DispatcherServlet์ ์ ๋ฌ๋๊ธฐ ์ ์น ์ปจํ
์ด๋์ ์ํด ์คํ, ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ FilterChain์ doFilter๋ฅผ ํตํด ๋ค์ ๋์์ผ๋ก ์์ฒญ์ ์ ๋ฌ
destory
: ํํฐ ๊ฐ์ฒด ์ญ์ , ์์ ๋ฐํ
์ฌ์ฉ
Spring๊ณผ ๋ฌด๊ดํ๊ฒ ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์์
์์ปจ๋, ์ธ์ฆ ๋ฐ ์ธ๊ฐ ๋ฑ์ ์์
์์ ์ฌ์ฉ๋๋ค.
Interceptor
๊ฐ๋
DistpatcherServlet์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ /ํ๋ก ์์ฒญ๊ณผ ์๋ต์ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
DistpatcherServlet์๋ N๊ฐ์ Interceptor๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค. ํ ๊ฐ ์ด์์ Interceptor๊ฐ ๋ฑ๋ก๋์ด ์๋ ๊ฒฝ์ฐ ์์ฒญ์ Interceptor๋ฅผ ๊ฑฐ์ณ ์ปจํธ๋กค๋ฌ์ ์ ๋ฌ๋๋ฉฐ, Interceptor๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ฆ์ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ด ์ ๋ฌ๋ฉ๋๋ค.
๊ตฌํ
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 {
}
}
preHandle
: ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์คํ๋๋ฉฐ, ํด๋ผ์ด์ธํธ์ ๊ด๋ จ๋์ด ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์์
์์ปจ๋, ์ธ์ฆ ๋ฐ ์ธ๊ฐ, ์ปจํธ๋กค๋ฌ๋ก ๋๊ฒจ์ง๋ ์ ๋ณด ๊ฐ๊ณต, ๋ก๊ทธ ํ์ธ ๋ฑ์ ์์
์์ ์ฌ์ฉ๋ฉ๋๋ค.
AOP(Aspect-Oriented Programming)
๊ฐ๋
AOP๋ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํตํด ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ , ๋ชจ๋ํ๋ฅผ ํฅ์์ํค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์
๋๋ค.
์ฉ๋
๋ฉ์๋๋ ์ปจํธ๋กค๋ฌ์์ ์ ์ฒด ๊ณตํต ์์๋ ์๋์ง๋ง, ๋ถ๋ถ์ ๊ณตํต์์์ผ ๊ฒฝ์ฐ ๋๋, ๋น์ฆ๋์ค ๋ก์ง ์์์ ์ข ๋ ์ธ๋ฐํ๊ฒ ๊ณตํต ์์๋ฅผ ์ฒ๋ฆฌํด์ผํ๋ ์์ปจ๋, ๋ก๊น
, ํธ๋์ญ์
, ์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค.
Interceptor/Filter๋ ์ฃผ์๋ก ๋์์ ๊ตฌ๋ถํ๋ ๋ฐ๋ฉด, AOP๋ PointCut์ด ์ง์ํ๋ ๋ฐฉ์(ex. ์ฃผ์, ํ๋ผ๋ฏธํฐ, ์ ๋
ธํ
์ด์
)์ผ๋ก ๋์์ ์ง์ ํ ์ ์์ต๋๋ค.
์ฃผ์ ๊ฐ๋
- PointCut : Aspect๋ฅผ ์ ์ฉํ ํ๊น ๋ฉ์๋ ์ง์ ์
- JoinPoint : Aspect๋ฅผ ์ง์ ํ ์ ์๋ ๋ชจ๋ ์์น
- Advice : PointCut์ ์ ์ฉํ ๋ก์ง
- Aspect : Advice ๋ชจ์ + PointCut ๋ชจ์
๋ง๋ฌด๋ฆฌ
Filter๋ ์น ์ปจํ
์ด๋ ์์ญ์์ ๋์ํ๋ฉฐ ์์ฒญ์ด DispatcherServlet์ ๋๋ฌํ๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค. ์๋ต ์ /ํ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ฉฐ ๋ํ์ ์ผ๋ก ๋ก๊น
, ์ธ์ฝ๋ฉ, ๋ณด์(CORS ์ค์ , ์ธ์ฆ ํ์ธ) ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
Interceptor๋ ํ๋ ์์ํฌ ๋ ๋ฒจ์์ ์์ฒญ์ด ์ปจํธ๋กค๋ฌ์ ๋์ฐฉํ๊ธฐ ์ ์ ํน์ ๋ก์ง, ์์ปจ๋ ์ธ๊ฐ, ๋ก๊น
๋ฑ์ ์ฌ์ฉ๋๋ค. URL ํจํด ๊ธฐ๋ฐ์ผ๋ก ํน์ ์์ฒญ์ ๋ํด์๋ง ๋์์ํฌ ์ ์๋ค๋ ํน์ง์ด ์์ต๋๋ค.
AOP๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ ๊ฑธ์น ๊ณตํต์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋ค. Interceptor์ Filter๋ URL๋ก ๋์์ ๊ตฌ๋ถํ์ง๋ง, AOP๋ ํ๋ผ๋ฏธํฐ, ์ ๋
ธํ
์ด์
๋ฑ์ผ๋ก ๋์์ ์ง์ ํ ์ ์์ต๋๋ค.