๐ง ์๋ก
์ด์ ๊ธ์์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ํ์ตํ๋ฉฐ ๊ฐ๋จํ ์น ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ๊ทธ๋ ๋ง๋ค์ด ๋์๋ ๊ตฌ์กฐ์ ์ค์ ์คํ๋ง MVC์ ๊ตฌ์กฐ๋ฅผ ๋น๊ตํด๋ณด๋ฉฐ, ์คํ๋ง MVC์ ๊ตฌ์กฐ์ ๋ํ์ฌ ์ดํดํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง ์คํ๋ง MVC์ ์ ์ฒด ๊ตฌ์กฐ
์ด์ ์ ์ ํฌ๊ฐ ๋ง๋ค์๋ ํ๋ ์์ํฌ์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(์ฌ์ง์ ๊น์ํ ์ ์๋์ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ ์ ์๋ฃ์์ ๋ฐ์ทํ์์ต๋๋ค.)
์คํ๋ง MVC๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
๋งค์ฐ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ์ง๋๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋๋ฐ, ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
FrontController -> DispatcherServlet
์ด๋ฆ๋ง ๋ฌ๋ผ์ก์ ๋ฟ, DispatcherServlet ์ญ์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ์ญํ ์ ์ํํฉ๋๋ค.
Map<String, Object> handlerMappingMap -> HandlerMapping
MyHandlerAdapter -> HandlerAdapter ์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
ModelView -> ModelAndView
viewResolver() -> ViewResolver
MyView -> View
๐ง DispatcherServlet
์คํ๋ง MVC์์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ์ญํ ์ ๋ด๋นํฉ๋๋ค.
์คํ๋ง ๋ถํธ๋ DispatcherServlet์ ์๋ธ๋ฆฟ์ผ๋ก ๋ฑ๋กํ๋๋ฐ, ์ด๋ ๋ชจ๋ ๊ฒฝ๋ก (urlPatterns="/")์ ๋ํด์ ๋งคํํ๋๋ก ํฉ๋๋ค.
์ด๋ฅผ ํตํด ๋ชจ๋ ์์ฒญ์ ๋ํ์ฌ ๋งจ ์ฒ์ DispatcherServlet์ด ํธ์ถ๋ฉ๋๋ค.
์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ํ๋ฆ์ ์๋์ ๊ฐ์ต๋๋ค.
HttpServlet.sevice() ->
FrameworkServlet.service()-> FrameworkServlet.processRequest() ->
DispatcherServlet.doService() -> DispatcherServlet.doDispatch()
๐ ์ฝ๋๋ก ๋ณด๊ธฐ
DispatcherServlet์ ๋ชจ๋ ์์ฒญ์ ๋ํด doDispatch()๋ฅผ ์ต์ข ์ ์ผ๋ก ํธ์ถํฉ๋๋ค.
doDispatch๋ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
public class DispatcherServlet extends FrameworkServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ์๋ต
// ์์ฒญ ์ ๋ณด์ ๋งคํ๋๋ ํธ๋ค๋ฌ ์กฐํ
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
// ์กฐํ๋ ํธ๋ค๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// ์๋ต
// ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ -> ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด ํธ๋ค๋ฌ ์คํ -> ModelAndView ๋ฐํ
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
// ์๋ต
}
}
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
// HandlerMapping์ ์์ฒญ ์ ๋ณด - ํธ๋ค๋ฌ์ ๋์ ๊ด๊ณ ํ๋๋ฅผ ๊ฐ์ง๋๋ค.
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
HandlerExcepcutionChain์ ์ดํ์ ๋ฐฐ์ธ HandlerInterceptor๋ค๊ณผ, ์ค์ Handler๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
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");
}
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,
@Nullable Exception exception) throws Exception {
// ์๋ต
// ๋ทฐ ๋ ๋๋ง
render(mv, request, response);
// ์๋ต
}
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
// ์๋ต
View view;
String viewName = mv.getViewName();
view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
view.render(mv.getModelInternal(), request, response);
// ์๋ต
}
๐ doDispatch() ๋์ ์์ ์ ๋ฆฌ
doDispatch์ ๋์ ์์๋ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
1. ํธ๋ค๋ฌ ์กฐํ: HandlerMapping๋ค์ ํตํด์ ์์ฒญ URL์ ๋งคํ๋ ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)๋ฅผ ์กฐํํฉ๋๋ค.
2. ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ: ์กฐํ๋ ํธ๋ค๋ฌ๋ฅผ ์คํํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์กฐํํฉ๋๋ค.
3. ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ
4. ํธ๋ค๋ฌ ์คํ: ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ์ค์ ํธ๋ค๋ฌ๋ฅผ ์คํํฉ๋๋ค.
5. ModelAndView ๋ฐํ
6. ViewResolver ํธ์ถ
7. View ๋ฐํ
8. ๋ทฐ ๋๋๋ง
'๐๏ธ Spring > Web MVC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MVC] ์์ฒญ ๋งคํ (@RequestMapping, PathVariable) (0) | 2021.12.29 |
---|---|
[MVC] HandlerMapping๊ณผ HandlerAdapter (0) | 2021.12.29 |
[MVC] ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด (0) | 2021.12.26 |
[MVC] ์๋ธ๋ฆฟ - HttpServletResponse (0) | 2021.12.25 |
[MVC] ์๋ธ๋ฆฟ - HttpServletRequest (0) | 2021.12.25 |