Spring์์๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด ๊ณตํต์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์ ๋ฌด๋ฅผ ์ํํ๊ธฐ ์ํ ๋ช๊ฐ์ง์ ๊ธฐ๋ฅ๋ค์ ์ง์ํ๋ค.
- Filter (ํํฐ)
- Interceptor(์ธํฐ์ ํฐ)
- AOP(๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ)
์์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๋ชจ๋ํํ์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ค.
AOP๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ฑธ์ณ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ์ง์ํ๋ค๋ฉด, Filter์ Interceptor๋ ์ฃผ๋ก Controller ๋ ์ด์ด์์ ์ฌ์ฉ๋๋ฉฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
Filter์ Interceptor์ ์ฐจ์ด์ ์ ์ค์ ์ ์ผ๋ก ์ ๋ฆฌํด๋ณด์.
Filter
J2EE ํ์ค ์คํ ๊ธฐ๋ฅ์ผ๋ก ๋์คํจ์ฒ ์๋ธ๋ฆฟ(Dispatcher Servlet)์ ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ /ํ์ url ํจํด์ ๋ง๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ๋ถ๊ฐ์ ์ธ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
(J2EE๋ ์๋ฐ ๊ธฐ์ ๋ก ๊ธฐ์ ํ๊ฒฝ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋๋ฐ ํ์ํ ์คํ๋ค์ ๋ชจ์๋ ์คํ ์งํฉ์ด๋ผ๊ณ ํฉ๋๋ค)
์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋ ํฐ์บฃ๊ณผ ๊ฐ์ ์น ์ปจํ ์ด๋(์๋ธ๋ฆฟ ์ปจํ ์ด๋)์ ์ํด ๊ด๋ฆฌ ๋๋ค. ๋๋ฌธ์ ํํฐ๋ ์คํ๋ง์์ ์ฒ๋ฆฌํด์ฃผ๋ ๋ด์ฉ์ ์ ์ฉ๋ฐ์ ์ ์์ผ๋ฉฐ ์คํ๋ง์ ์ํ ์์ธ์ฒ๋ฆฌ๊ฐ ๋์ง์๋๋ค. ๋ฐ๋ผ์ ์์ธ๋ฅผ ํธ๋ค๋งํ๊ธฐ ์ํด์ ๋ณ๋์ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
ํํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด javax.servlet์ Filter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
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() {}
}
doFilter ๋ฉ์๋
url ํจํด์ ๋ง๋ ๋ชจ๋ HTTP ์์ฒญ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌ๋๊ธฐ์ ์ ์น ์ปจํ ์ด๋์ ์ํด ์คํ๋๋ ํจ์์ด๋ค. doFilter์ ํ๋ผ๋ฏธํฐ๋ก FilterChain์ด ์๋๋ฐ, FilterChain์ doFilter๋ฅผ ํตํด ๋ค์ ๋์์ผ๋ก ์์ฒญ์ ์ ๋ฌํ๊ฒ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ์ํ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ฃ์ด์ค์ผ๋ก์จ ์ํ๋ ์ฒ๋ฆฌ๋ฅผ ์งํ ํ ์์๋ค.
์ด๋ ํํฐ๊ฐ ๋ค์ ํํฐ๋ฅผ ํธ์ถํ๊ธฐ ์ํด ํํฐ ์ฒด์ด๋์ ํด์ค๋, Requst์ Response ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ฏ๋ก ์ธ๋ฆฌ๋ ํด๋น ์์ฒญ๊ณผ ์๋ต์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ฐ๋์น๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค.
public TestFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ request์ response๋ฅผ ๋ฃ์ด์ค ์ ์์
chain.doFilter(new MockHttpServletRequest(), new MockHttpServletResponse());
}
}
์ฆ, ์์ฒญ์ ์๋ต ๊ฐ์ฒด๋ฅผ ์กฐ์ํ ์ ์๋ค.
Spring Security๋ฅผ ํตํด Filter๋ฅผ ์ต์ํ๊ฒ ์ ํ ์ ์๋๋ฐ, Spring Security๊ฐ Spring MVC์ ์ข ์์ ์ด์ง ์๋๋ค๋ ํน์ง์ ๊ฐ๋ ์ด์ ๊ฐ ํํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
Interceptor
ํํฐ์ ๋ฌ๋ฆฌ Spring์์ ์ ๊ณตํ๋ ๊ธฐ์ ๋ก, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ /ํ์ ์์ฒญ๊ณผ ์๋ต์ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ฆ, ์ธํฐ์ ํฐ๋ ์คํ๋ง ์ปจํ ์คํธ์์ ๋์ํ๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ก ์์ฒญํ๋๋ฐ, ๊ทธ ๊ฒฐ๊ณผ๋ก HandlerExecutionChain(์คํ ์ฒด์ธ)์ ๋๋ ค์ค๋ค. ์ด ์คํ ์ฒด์ธ์ 1๊ฐ ์ด์์ ์ธํฐ์ ํฐ๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด ์์ฐจ์ ์ผ๋ก ์ธํฐ์ ํฐ๋ค์ ๊ฑฐ์ณ ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋๋๋ก ํ๊ณ , ์ธํฐ์ ํฐ๊ฐ ์์ผ๋ฉด ๋ฐ๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ๋ค.
(์ธํฐ์ ํฐ๊ฐ ์ปดํธ๋กค๋ฌ์๊ฒ ์์ฒญ์ ์์ํ๋ ๊ฒ์ ์๋๋ฉฐ ์ ๊ทธ๋ฆผ์ ์ฒ๋ฆฌ ์์๋ฅผ ๋์ํํ ๊ฒ์ด๋ค.)
์ธํฐ์ ํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด์๋ org.springframework.web.servlet์ HandlerInterceptor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํ๋ค.
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 {
}
}
preHandler ๋ฉ์๋
์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์คํ๋์ด ์ปจํธ๋กค๋ฌ ์ด์ ์ด ์ฒ๋ฆฌํด์ผํ๋ ์ ์ฒ๋ฆฌ ์์ ์ด๋ ์์ฒญ ์ ๋ณด๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
handler ํ๋ผ๋ฏธํฐ๋ ํธ๋ค๋ฌ ๋งคํ์ด ์ฐพ์์ค ์ปจํธ๋กค๋ฌ ๋น์ ๋งคํ๋๋ HandlerMethod๋ผ๋ ํ์
์ ๊ฐ์ฒด๋ก, @RequestMapping์ด ๋ถ์ ๋ฉ์๋์ ์ ๋ณด๋ฅผ ์ถ์ํํ ๊ฐ์ฒด์ด๋ค. (๋ฌด์จ๋ง์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค)
boolean ํ์ ์ ๋ฐํํ๋ฉฐ ๋ฐํ๊ฐ์ด true์ด๋ฉด ๋ค์ ๋จ๊ณ๋ก ์งํ๋์ง๋ง, false๋ผ๋ฉด ์์ ์ด ์ค๋จ๋๋ฉฐ ์ดํ ์์ ์ ์งํ๋์ง ์๋๋ค.
์ด๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์ฌ๋ฌ ์ธํฐ์ ํฐ ๋ชฉ๋ก์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, for๋ฌธ์ ํตํด ์์ฐจ์ ์ผ๋ก ์คํ์ํจ๋ค. boolean ํ์ ์ ๋ฐํํ์ฌ ๋ค์ ์ธํฐ์ ํฐ์ ์คํ ์ ๋ฌด๋ฅผ ์๋ ค์ค๋ฟ Request์ Response ๊ฐ์ฒด๋ ๋๊ฒจ์ค ์ ์๊ธฐ๋๋ฌธ์ ํํฐ์ ๋ฌ๋ฆฌ ์์ฒญ, ์๋ต์ ๊ฐ๊ณตํ ์์๋ค. (๊ฐ์ฒด ์์ฒด๋ฅผ ์กฐ์ํ ์๋ ์์ผ๋ ๋ด๋ถ์ ์ผ๋ก ๊ฐ๋ ๊ฐ์ ์กฐ์์ด ๊ฐ๋ฅํ๋ค. ๊ฐ๊ณต ๊ฐ๋ฅ)
public class TestInterceptor implements HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// Request/Response๋ฅผ ๊ต์ฒดํ ์ ์๊ณ boolean ๊ฐ๋ง ๋ฐํํ ์ ์๋ค.
return true;
}
}
postHandler ๋ฉ์๋
์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ ํ์ ์คํ๋๋ค. ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํํ๋ ModelAndView ํ์ ์ด ์ ๋ณด๊ฐ ์ ๊ณต๋๋๋ฐ, ์ต๊ทผ์๋ Json ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ RestAPI ๊ธฐ๋ฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค๋ฉด์ ์์ฃผ ์ฌ์ฉ๋์ง ์๋๋ค.
afterCompletion ๋ฉ์๋
๋ชจ๋ ๋ทฐ์์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ์ผ์ ๋ชจํจํด ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ํ์ ์คํํ๊ฒ ๋๋ค. postHandler์ ๋ฌ๋ฆฌ ์ปจํธ๋กค๋ฌ ํ์ ๊ณ์ธต์์ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ํด๋น ๋ฉ์๋๋ ๋ฐ๋์ ํธ์ถ๋๋ค.
โ๏ธ ์ปจํธ๋กค๋ฌ์ ์ ์ฉํ ๋ถ๊ฐ๊ธฐ๋ฅ์ AOP๊ฐ ์๋ ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์
→ ์ปจํธ๋กค๋ฌ๋ ํ์ ์ด ์ผ์ ํ์ง ์๊ณ ํธ์ถ ํจํด๋ ์ ๊ฐ๊ฐ์ด๋ผ ์ปจํธ๋กค๋ฌ์ AOP๋ฅผ ์ ์ฉํ๋ ค๋ฉด ๋ฒ๊ฑฐ๋ก์ด ๋ถ๊ฐ์์ ๋ค์ด ์๊ธด๋ค.
→ AOP์์๋ HttpServletRequest/Response ๊ฐ์ฒด๋ฅผ ์ป๊ธฐ ์ด๋ ต๋ค.
์ฌ์ฉ๋ชฉ์
Filter
ํํฐ๋ Spring๊ณผ ๋ฌด๊ดํ๊ฒ ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผํ๋ ์์ ๋ค์ ์ฒ๋ฆฌํ ์ ์๋ค. ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์ ํฉ.
์ธํฐ์ ํฐ๋ณด๋ค ์๋จ์์ ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ํ์ฌ ์ฌ๋ฐ๋ฅธ ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ ์ฐจ๋จํ ์ ์๋ค. ์คํ๋ง ์ปจํ ์ด๋๊น์ง ์์ฒญ์ด ์ ๋ฌ๋์ง ๋ชปํ๊ณ ์ฐจ๋จ๋๋ฏ๋ก ์์ ์ฑ์ ๋์ฑ ๋์ผ ์ ์๋ค.
- ๋ณด์ ๋ฐ ์ธ์ฆ/์ธ๊ฐ ์์
- ๋ชจ๋ ์์ฒญ์ ๋ํ ๋ก๊น , ๊ฒ์ฌ
- ์ด๋ฏธ์ง, ๋ฐ์ดํฐ ์์ถ
- ํค๋ ์ถ๊ฐ ๋ฐ ์ธ์ฝ๋ฉ ๋ณ๊ฒฝ
- Spring๊ณผ ๋ถ๋ฆฌ๋์ด์ผํ๋ ๊ธฐ๋ฅ
Interceptor
ํด๋ผ์ด์ธํธ์ ์์ฒญ๊ณผ ๊ด๋ จ๋์ด ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ๋๋ ์์ ๋ค. Controller๋ก ๋์ด๊ฐ๊ธฐ์ ์ ์ธ๋ถ์ ์ธ ๊ฒ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ ์ ํฉํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ด๋ จ๋ ์์ ์ ์ํํ ์ ์๋ค.
ํํฐ์ ๋ฌ๋ฆฌ ๊ฐ์ฒด ์์ฒด๋ฅผ ์กฐ์ํ ์ ์์ง๋ง ๋์ ๊ฐ์ฒด๊ฐ ๋ด๋ถ์ ์ผ๋ก ๊ฐ๋ ๊ฐ์ ์กฐ์ํ ์ ์์ผ๋ฏ๋ก ์ปจํธ๋กค๋ฌ๋ก ๋๊ฒจ์ฃผ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณตํ๊ธฐ ์ฉ์ดํ๋ค.
- ์ธ๋ถ์ ์ธ ๋ณด์ ๋ฐ ์ธ์ฆ/์ธ๊ฐ ๊ณตํต ์์
- API ํธ์ถ์ ๋ํ ๋ก๊น , ํต๊ณ
- Controller๋ก ๋๊ฒจ์ฃผ๋ ์ ๋ณด๋ฅผ ๊ฐ๊ณต
์ ๋ฆฌ
Filter | Interceptor | |
๋์ ์์น | ์น ์ปจํ ์คํธ | ์คํ๋ง ์ปจํ ์คํธ |
์คํ๋ง์ ์์ธ์ฒ๋ฆฌ | X | O |
์๋ต, ์์ฒญ ๊ฐ์ ์กฐ์ | O | X |
โ ํ์ค ์ ๋ฆฌ?!
Filter์ Interceptor๋ ๋ชจ๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๋ชจ๋ํ์ฌ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค. Filter๋ ์น ์ปจํ ์ด๋์ ์์นํ๋ฉฐ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ ํ์ ๋์ํ๋ฉฐ Interceptor๋ ์คํ๋ง์ปจํ ์คํธ์์ ๋์ํ๋ฉฐ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ ํ์ ๋์ํฉ๋๋ค. ๋๋ฌธ์ Filter์ ๊ฒฝ์ฐ Spring๊ณผ ๋ฌด๊ดํ ์์ (์ธ์ฆ/์ธ๊ฐ, ๋ฐ์ดํฐ ์์ถ, ์ธ์ฝ๋ฉ)์ ์ฒ๋ฆฌํ๊ณ Interceptor์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ด๋ จ๋ ์ธ๋ถ์ ์ธ ๊ฒ์ฌ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
reference.
https://mangkyu.tistory.com/173
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋๊ธ์ ํตํด ์๋ ค์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Security์์ ๋ฐ์ํ ์์ธ๊ฐ ControllerAdvice์์ ํธ๋ค๋ง๋๋ ๋ฌธ์ (2) | 2024.04.25 |
---|---|
[Spring] OpenFeign์ ์ด์ฉํ์ฌ API ํต์ ํด๋ณด๊ธฐ (feat. ๊ณ ์์ด ์ฌ์ง ๊ฒ์) (2) | 2023.04.25 |
[JPA] ์ปค์ ๊ธฐ๋ฐ pagenation ๊ตฌํํ๊ธฐ (8) | 2023.03.01 |
[JPA] ์คํ์ ๊ธฐ๋ฐ Pagenation ๊ตฌํํ๊ธฐ (0) | 2023.03.01 |
[Spring] Spring MVC (0) | 2023.02.18 |
๋๊ธ