SpringMVC ๊ตฌ์กฐ
DispatcherServlet ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ
์คํ๋ง MVC์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐ๋ก ๋์คํจ์ฒ ์๋ธ๋ฆฟ(DispatcherServlet)์ด๋ค.
์คํ๋ง ๋ถํธ๋ DispacherServlet ์ ์๋ธ๋ฆฟ์ผ๋ก ์๋์ผ๋ก ๋ฑ๋กํ๋ฉด์ ๋ชจ๋ ๊ฒฝ๋ก( urlPatterns="/" )์ ๋ํด์ ๋งคํํ๋ค.
์๋ธ๋ฆฟ์ด ํธ์ถ๋๋ฉด FrameworkServlet.service() ๋ฅผ ์์์ผ๋ก
์ฌ๋ฌ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด์ DispacherServlet.doDispatch() ๊ฐ ํธ์ถ๋๋ค.
1. ํธ๋ค๋ฌ ์กฐํ
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
2. ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ - ํธ๋ค๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ด๋ํฐ
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
3. ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ -> 4. ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด ํธ๋ค๋ฌ ์คํ -> 5. ModelAndView ๋ฐํ
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
๋์ ์์
ํธ๋ค๋ฌ ์กฐํ: ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์์ฒญ URL์ ๋งคํ๋ ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)๋ฅผ ์กฐํํ๋ค.
ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ: ํธ๋ค๋ฌ๋ฅผ ์คํํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์กฐํํ๋ค.
ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ: ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์คํํ๋ค.
ํธ๋ค๋ฌ ์คํ: ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ์ค์ ํธ๋ค๋ฌ๋ฅผ ์คํํ๋ค.
ModelAndView ๋ฐํ: ํธ๋ค๋ฌ ์ด๋ํฐ๋ ํธ๋ค๋ฌ๊ฐ ๋ฐํํ๋ ์ ๋ณด๋ฅผ ModelAndView๋ก ๋ณํํด์ ๋ฐํํ๋ค.
viewResolver ํธ์ถ: ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ฐพ๊ณ ์คํํ๋ค.
JSP์ ๊ฒฝ์ฐ: InternalResourceViewResolver ๊ฐ ์๋ ๋ฑ๋ก๋๊ณ , ์ฌ์ฉ๋๋ค.
View๋ฐํ: ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ ๋ทฐ์ ๋ ผ๋ฆฌ ์ด๋ฆ์ ๋ฌผ๋ฆฌ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ๊ณ , ๋ ๋๋ง ์ญํ ์ ๋ด๋นํ๋ ๋ทฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
JSP์ ๊ฒฝ์ฐ InternalResourceView(JstlView) ๋ฅผ ๋ฐํํ๋๋ฐ, ๋ด๋ถ์ forward() ๋ก์ง์ด ์๋ค.
๋ทฐ ๋ ๋๋ง: ๋ทฐ๋ฅผ ํตํด์ ๋ทฐ๋ฅผ ๋ ๋๋ง ํ๋ค.
ํธ๋ค๋ฌ ๋งคํ๊ณผ ํธ๋ค๋ฌ ์ด๋ํฐ
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handleRequest");
return null;
}
}
์ด ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๋ ค๋ฉด ๋ค์ 2๊ฐ์ง๊ฐ ํ์ํ๋ค.
HandlerMapping(ํธ๋ค๋ฌ ๋งคํ)
ํธ๋ค๋ฌ ๋งคํ์์ ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์ ์์ด์ผ ํ๋ค.
@Component("/springmvc/old-controller")
์ฌ๊ธฐ์๋ ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ ์ ์๋ ํธ๋ค๋ฌ ๋งคํ์ด ํ์ํ๋ค.
๋น์ ์ด๋ฆ์ผ๋ก URL์ ๋งคํํ ๊ฒ์ด๋ค.
HandlerAdapter(ํธ๋ค๋ฌ ์ด๋ํฐ)
ํธ๋ค๋ฌ ๋งคํ์ ํตํด์ ์ฐพ์ ํธ๋ค๋ฌ๋ฅผ ์คํํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ํ์ํ๋ค.
public class OldController implements Controller
์) Controller ์ธํฐํ์ด์ค๋ฅผ ์คํํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ๊ณ ์คํํด์ผ ํ๋ค.
ํธ๋ค๋ฌ ๋งคํ๋, ํธ๋ค๋ฌ ์ด๋ํฐ๋ ๋ชจ๋ ์์๋๋ก ์ฐพ๊ณ ๋ง์ฝ ์์ผ๋ฉด ๋ค์ ์์๋ก ๋์ด๊ฐ๋ค.
1. ํธ๋ค๋ฌ ๋งคํ์ผ๋ก ํธ๋ค๋ฌ ์กฐํ
HandlerMapping ์ ์์๋๋ก ์คํํด์, ํธ๋ค๋ฌ๋ฅผ ์ฐพ๋๋ค.
์ด๊ฒฝ์ฐ ๋น์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ผํ๊ธฐ ๋๋ฌธ์ ์ด๋ฆ ๊ทธ๋๋ก ๋น์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ฃผ๋
BeanNameUrlHandlerMapping ๊ฐ ์คํ์ ์ฑ๊ณตํ๊ณ ํธ๋ค๋ฌ์ธ OldController ๋ฅผ ๋ฐํํ๋ค.
2. ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ
HandlerAdapter ์ supports() ๋ฅผ ์์๋๋ก ํธ์ถํ๋ค.
SimpleControllerHandlerAdapter ๊ฐ Controller ์ธํฐํ์ด์ค๋ฅผ ์ง์ํ๋ฏ๋ก ๋์์ด ๋๋ค.
3. ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์กฐํํ SimpleControllerHandlerAdapter ๋ฅผ ์คํํ๋ฉด์ ํธ๋ค๋ฌ ์ ๋ณด๋ ํจ๊ป ๋๊ฒจ์ค๋ค.
SimpleControllerHandlerAdapter ๋ ํธ๋ค๋ฌ์ธ OldController ๋ฅผ ๋ด๋ถ์์ ์คํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
HttpRequestHandler
ํธ๋ค๋ฌ ๋งคํ๊ณผ, ์ด๋ํฐ๋ฅผ ๋ ์ ์ดํดํ๊ธฐ ์ํด Controller ์ธํฐํ์ด์ค๊ฐ ์๋ ๋ค๋ฅธ ํธ๋ค๋ฌ๋ฅผ ์์๋ณด์.
@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyHttpRequestHandler.handleRequest");
}
}
1. ํธ๋ค๋ฌ ๋งคํ์ผ๋ก ํธ๋ค๋ฌ ์กฐํ
HandlerMapping ์ ์์๋๋ก ์คํํด์, ํธ๋ค๋ฌ๋ฅผ ์ฐพ๋๋ค.
์ด๊ฒฝ์ฐ ๋น์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ผํ๊ธฐ ๋๋ฌธ์ ์ด๋ฆ ๊ทธ๋๋ก ๋น์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์์ฃผ๋
BeanNameUrlHandlerMapping ๊ฐ ์คํ์ ์ฑ๊ณตํ๊ณ ํธ๋ค๋ฌ์ธ MyHttpRequestHandler ๋ฅผ ๋ฐํํ๋ค.
2. ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ
HandlerAdapter ์ supports() ๋ฅผ ์์๋๋ก ํธ์ถํ๋ค.
HttpRequestHandlerAdapter ๊ฐ HttpRequestHandler ์ธํฐํ์ด์ค๋ฅผ ์ง์ํ๋ฏ๋ก ๋์์ด ๋๋ค.
3. ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์กฐํํ HttpRequestHandlerAdapter ๋ฅผ ์คํํ๋ฉด์ ํธ๋ค๋ฌ ์ ๋ณด๋ ํจ๊ป ๋๊ฒจ์ค๋ค.
HttpRequestHandlerAdapter ๋ ํธ๋ค๋ฌ์ธ MyHttpRequestHandler ๋ฅผ ๋ด๋ถ์์ ์คํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
๋ทฐ ๋ฆฌ์กธ๋ฒ
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
application.properties ์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์
์คํ๋ง ๋ถํธ๋ InternalResourceViewResolver ๋ผ๋ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ๋๋ฐ,
์ด๋ application.properties ์ ๋ฑ๋กํ spring.mvc.view.prefix , spring.mvc.view.suffix ์ค์ ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ๋ฑ๋กํ๋ค.
1. ํธ๋ค๋ฌ ์ด๋ํฐ ํธ์ถ
ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด new-form ์ด๋ผ๋ ๋
ผ๋ฆฌ ๋ทฐ ์ด๋ฆ์ ํ๋ํ๋ค.
2. ViewResolver ํธ์ถ
new-form ์ด๋ผ๋ ๋ทฐ ์ด๋ฆ์ผ๋ก viewResolver๋ฅผ ์์๋๋ก ํธ์ถํ๋ค.
BeanNameViewResolver ๋ new-form ์ด๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ ๋ทฐ๋ฅผ ์ฐพ์์ผ ํ๋๋ฐ ์๋ค.
InternalResourceViewResolver ๊ฐ ํธ์ถ๋๋ค.
3. InternalResourceViewResolver
์ด ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ InternalResourceView ๋ฅผ ๋ฐํํ๋ค.
4. ๋ทฐ - InternalResourceView
InternalResourceView ๋ JSP์ฒ๋ผ ํฌ์๋ forward() ๋ฅผ ํธ์ถํด์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
5. view.render()
view.render() ๊ฐ ํธ์ถ๋๊ณ InternalResourceView ๋ forward() ๋ฅผ ์ฌ์ฉํด์ JSP๋ฅผ ์คํํ๋ค.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring > Spring MVC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง MVC] - 12. ๋ก๊ทธ / SLF4J / Logback (0) | 2023.02.16 |
---|---|
[์คํ๋ง MVC] - 11. @Controller / @RequestMapping (0) | 2023.02.15 |
[์คํ๋ง MVC] - 9. ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - ์ด๋ํฐ (0) | 2023.02.15 |
[์คํ๋ง MVC] - 8. ํ๋ก ํธ ์ปจํธ๋กค๋ฌ - ModelView (0) | 2023.02.14 |
[์คํ๋ง MVC] - 7. ํ๋ก ํธ ์ปจํธ๋กค๋ฌ (0) | 2023.02.14 |