
Spring MVC Request Lifecycle์ ๊ตฌ์กฐ

Servlet Filter
- โ ์น๋ธ๋ผ์ฐ์ / API Client์๊ฒ ์์ฒญ์ ๋ฐ์
- โช ์๋ต์ ์น๋ธ๋ผ์ฐ์ / API Client์๊ฒ ์ ๋ฌํจ
DispatchServlet
- โก ์์ฒญ์ ๋ฐ์ ์๋์ ์ฒ๋ฆฌ๋ฅผ ํจ
- โข
HandlerMapping
์ ํตํด ์์ฒญ์ ๋ํ ์ฒ๋ฆฌController
ํด๋์ค๋ฅผ ์ฐพ์ - โฃ
HandlerInterceptor
์๊ฒ ์์ฒญ ์ ๋ณด์ Handler ์ ๋ณด๋ฅผ ํจ๊ป ์ ๋ฌํจ (postHandle) - + Argument Resolver ์ฒ๋ฆฌ
- + Message Converter ์ฒ๋ฆฌ
- โจ
ViewResolver
์๊ฒ view resolving์ ์์ํจ - โฉ
Filter
์๊ฒ ์๋ต
HandlerInterceptor
- โค ์์ฒญ์ ๋ํ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์งํํ์ฌ
DispatcherServlet
์๊ฒ ๋ฐํํจ (preHandle
)
- โง ์๋ต์ ๋ํ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์งํํ์ฌ
DispatcherServlet
์๊ฒ ๋ฐํํจ (postHandle
)
- 9.5 ๋ทฐ ๋ฆฌ์กธ๋น ์ดํ์ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์งํํ์ฌ
DispatcherServlet
์๊ฒ ๋ฐํํจ (afterCompletion
)
Controller
- โฅ Service Layer์ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ๋ฅผ ์์ํจ
- โฆ
HandlerInterceptor
์ view์ path ํน์ Data๋ฅผ ๋ฐํํจ
DispatcherServlet.doDispatch ๋ฉ์๋
- DispatcherServlet๋ ํ๋์ Servlet์ด๋ค.
- ๋ถ๋ชจ Servlet์ธ FrameworkServlet์ service ๋ฉ์๋๋ฅผ ์์์ผ๋ก ์ฌ๋ฌ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
- DispatcherServlet.doDispatch ์ ๋ฉ์๋๊ฐ ๊ฐ์ฅ ์ค์ํ๋ค.
- ์์ธ ์ฒ๋ฆฌ ์๋ต, ์ฃผ์ํ ๊ณผ์ ์์ฃผ๋ก ์ ๋ฆฌ
- localhost:8080 ๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์์ ํธ์ถํ ์ํฉ์ ๊ฐ์
โข ํธ๋ค๋ฌ ๋งคํ ๊ณผ์ + ํธ๋ค๋ฌ ์ด๋ํฐ ์ฐพ๊ธฐ
โข - 1
mappedHandler = this.getHandler(processedRequest);
๐ป
@Nullable protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { if (this.handlerMappings != null) { Iterator var2 = this.handlerMappings.iterator(); while(var2.hasNext()) { HandlerMapping mapping = (HandlerMapping)var2.next(); HandlerExecutionChain handler = mapping.getHandler(request); if (handler != null) { return handler; } } } return null; }
ํ๋์ ์ ์๋
List<HandlerMapping> handlerMapping
๋ฅผ ์ํํ๋ฉฐ 
์์ฒญ ์ ๋ณด๋ฅผ ํตํด ํธ๋ค๋ฌ๋ฅผ ์ฐพ์
WelcomPagehandlerMapping
์์ ParameterizableViewController
๋ผ๋ ํธ๋ค๋ฌ๊ฐ ์ฐพ์์งโข - 2
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
๐ป
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { if (this.handlerAdapters != null) { Iterator var2 = this.handlerAdapters.iterator(); while(var2.hasNext()) { HandlerAdapter adapter = (HandlerAdapter)var2.next(); if (adapter.supports(handler)) { return adapter; } } } throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"); }
๋น์ทํ๊ฒ handlerAdapters๋ฅผ ์ํํ๋ฉฐ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ์

ParameterizableViewController
๋ฅผ supportํ๋ ์ด๋ํฐ์ธ SimpleControllerhandlerAdapter
๊ฐ ์ ํ๋จ ํด๋น ์ด๋ํฐ๋ ๊ฐ๋จํ๊ณ ํธ๋ค๋ฌ๊ฐ Controller์ ์ธ์คํด์ค๋ผ๋ฉด supportํจpublic class SimpleControllerHandlerAdapter implements HandlerAdapter { ... public boolean supports(Object handler) { return handler instanceof Controller; } }
๋ค์์๋
mappedHandler.applyPreHandle(processedRequest, response)
HandlerInterceptor์
preHandle
ํธ์ถ์ด๋ํฐ๋ฅผ ํตํ ํธ๋ค๋ฌ ํธ์ถ
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
ModelAndView ๊ฒฐ๊ณผ๊ฐ

๋ค์์๋
mappedHandler.applyPostHandle(processedRequest, response, mv);
HandlerInterceptor์
postHandle
ํธ์ถ๋ง์ง๋ง์ผ๋ก ๋ทฐ ๋ฆฌ์กธ๋น
this.processDispatchResult(... )
๐ป
this.render(mv, request, response)
๐ป
view = this.resolveViewName( ... )
๋ ๋ง์ง๋ง์ผ๋ก
HandlerInterceptor์
afterCompletion
ํธ์ถFilter
, Interceptor
& AOP

์น๊ณผ ๊ด๋ จ๋ ๊ณตํต๊ด์ฌ์ฌ - ์๋ธ๋ฆฟ ํํฐ, ์ธํฐ์
ํฐ
AOP๋ Interceptor ๋ณด๋ค ๋ ์์ชฝ์์ ๋์ ํ๋ก์๋ฅผ ํ์ฉํ์ฌ ์์ฒญ ๋ฐ ์๋ต์ ๋ํ ์ ๊ทผ์ ์ด ๋ฐ ๊ธฐ๋ฅ์ถ๊ฐ๋ฅผ ๋ด๋นํจ

@) ์ฐธ๊ณ
damiano1027 - [Spring] Spring MVC Request Lifecycle - ๊ทธ๋ฆผ์ด ์ด์ํจ