[Spring] 5.์Šคํ”„๋ง MVC - ๊ตฌ์กฐ ์ดํ•ด

 

1. ์Šคํ”„๋ง MVC ์ „์ฒด ๊ตฌ์กฐ

Spring MVC ๊ตฌ์กฐ

FrontController -> DispatcherServlet
handlerMappingMap -> HandlerMapping
MyHandlerAdapter -> HandlerAdapter
ModelView -> ModelAndView
viewResolver -> ViewResolver

MyView -> View

 

DispatcherServlet ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

ใ„ด org.springframework.web.servlet.DispatcherServlet

 

DispatcherServlet ๋“ฑ๋ก

- 'DispatcherServlet'๋„ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ 'HttpServlet'์„ ์ƒ์†๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๊ณ  , ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋™์ž‘

   DispatcherServlet -> FrameworkdServlet -> HttpServletBean -> HttpServlet

- ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” 'DispatcherServelt'์„ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋ฉด์„œ ๋ชจ๋“  ๊ฒฝ๋กœ ( urlPatterns"/")์— ๋Œ€ํ•ด์„œ ๋งตํ•‘

  ๋” ์ž์„ธํ•œ ๊ฒฝ๋กœ๊ฐ€ ์šฐ์„ ์ˆœ์œ„ ๋†’์Œ (๊ธฐ์กด ๋“ฑ๋กํ•œ ์„œ๋ธ”๋ฆฟ๋„ ํ•จ๊ป˜ ๋™์ž‘)

 

์š”์ฒญ ํ๋ฆ„

- ์„œ๋ธ”๋ฆฟ์ด ํ˜ธ์ถœ๋˜๋ฉด HttpServlet์ด ์ œ๊ณตํ•˜๋Š” service()๊ฐ€ ํ˜ธ์ถœ๋จ

- ์Šคํ”„๋ง MVC๋Š” DispatcherServlet์˜ ๋ถ€๋ชจ์ธ FrameworkServlet์—์„œ service()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด๋‘ 

- FrameworkServlet.service()๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ DispatcherServlet.doDispatch()๊ฐ€ ํ˜ธ์ถœ๋จ

 

DispatcherServlet์˜ ํ•ต์‹ฌ์ธ doDispatch()* ์˜ˆ์™ธ์ฒ˜๋ฆฌ, ์ธํ„ฐ์…‰ํ„ฐ ๊ธฐ๋Šฅ ์ œ์™ธ

 

DispatcherServlet.doDispatch(); = ํ•ต์‹ฌ ์ฝ”๋“œ

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
  HttpServletRequest processedRequest = request;
  HandlerExecutionChain mappedHandler = null;
  ModelAndView mv = null;

  // 1. ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ
  mappedHandler = getHandler(processedRequest); 
  if (mappedHandler == null) {
    noHandlerFound(processedRequest, response);
    return; 
  }
  
  //2.ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ-ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋Œ‘ํ„ฐ
  HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

  // 3. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰ -> 4. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ํ†ตํ•ด ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ -> 5. ModelAndView ๋ฐ˜ํ™˜ 
  mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
  processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}

private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, 
                     ModelAndView mv, 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(); 
  
  //6. ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ ์ฐพ๊ธฐ,7.View ๋ฐ˜ํ™˜
  view = resolveViewName(viewName, mv.getModelInternal(), locale, request);

  // 8. ๋ทฐ ๋ Œ๋”๋ง
  view.render(mv.getModelInternal(), request, response);
 }

 

๋™์ž‘ ์ˆœ์„œ

1. ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ : ํ•ธ๋“ค๋Ÿฌ ๋งตํ•‘์„ ํ†ตํ•ด ์š”์ฒญ URL์— ๋งตํ•‘๋œ ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ) ์กฐํšŒ
2. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ : ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ
3. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰ : ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‹คํ–‰
4. ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ : ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์‹ค์ œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰
5. ModelAndView ๋ฐ˜ํ™˜ : ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋Š” ํ•ธ๋“œ๋Ÿด๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •๋ณด๋ฅผ ModelAndView๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜
6. viewResolver ํ˜ธ์ถœ : ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ฐพ๊ณ  ์‹คํ–‰
    JSP์˜ ๊ฒฝ์šฐ InternationalResourceViewResolver๊ฐ€ ์ž๋™ ๋“ฑ๋ก๋˜๊ณ  ์‚ฌ์šฉ๋จ
7. View ๋ฐ˜ํ™˜ : ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋Š” ๋ทฐ์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ๋ฌผ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ตฌ๊ณ  ๋ Œ๋”๋ง ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ทฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
    JSP์˜ ๊ฒฝ์šฐ InternalResourceView(JstlView)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ๋‚ด๋ถ€์— forward()๋กœ์ง์ด ์žˆ๋‹ค
8. ๋ทฐ ๋ Œ๋”๋ง : ๋ทฐ๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ๋ฅผ ๋ Œ๋”๋ง

 

์ธํ„ฐํŽ˜์ด์Šค ์‚ดํŽด๋ณด๊ธฐ

- ์Šคํ”„๋ง MVC ๊ฐ•์  : DispatcherServlet ์ฝ”๋“œ ๋ณ€๊ฒฝ์—†์ด ์›ํ•œ๋Š ๊ธฐ๋Šฅ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ™•์žฅ ๊ฐ€๋Šฅ

- ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ DispatcherServlet์— ๋“ฑ๋กํ•˜๋ฉด ์ž์‹ ๋งŒ์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ (์ด๋Ÿด ์ผ์€ ๊ฑฐ์˜ ์—†์Œ)

 

์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชฉ๋ก

์ •๋ฆฌ

์Šคํ”„๋ง MVC๋Š” ์ฝ”๋“œ ๋ถ„๋Ÿ‰ ๋งŽ์•„์„œ ๋‚ด๋ถ€ ํŒŒ์•… ์–ด๋ ค์›€

๋Œ€๋ถ€๋ถ„ ๊ธฐ๋Šฅ ๊ตฌํ˜„๋˜์–ด์žˆ์Œ


2. ํ•ธ๋“ค๋Ÿฌ ๋งตํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ

์Šคํ”„๋ง์€ ํ•ธ๋“ค๋Ÿฌ ๋งตํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋Œ€๋ถ€๋ถ„ ๊ตฌํ˜„ํ•ด๋‘์—ˆ์Œ

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•ธ๋“ค๋Ÿฌ ๋งตํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ผ์€ ๊ฒƒ์˜ ์—†์Œ

 

HandlerMapping ์šฐ์„ ์ˆœ์œ„

0 = RequestMappingHandlerMapping  :   ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ์ธ @RequestMapping์—์„œ ์‚ฌ์šฉ
1 = BeanNameUrlHandlerMapping        :   ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์Œ (url๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น url ์ด๋ฆ„๊ณผ ๋˜‘๊ฐ™์€ ์ด๋ฆ„์˜ ์Šคํ”„๋ง ๋นˆ ์ฐพ์Œ)

HandleAdapter ์šฐ์„ ์ˆœ์œ„

0 = RequestMappingHandlerAdapter   :   ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ์ธ @RequestMapping ์ด์šฉ
1 = HttpRequestHandlerAdapter           :   HttpRequestHandler ์ฒ˜๋ฆฌ
2 = SimpleControllerHandlerAdapter    :   Controller ์ธํ„ฐํŽ˜์ด์Šค (์• ๋…ธํ…Œ์ด์…˜ X, ๊ณผ๊ฑฐ์— ์‚ฌ์šฉ) ์ฒ˜๋ฆฌ

 

์ˆœ์„œ)

1. ํ•ธ๋“ค๋Ÿฌ ๋งตํ•‘์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ

- HandlerMapping์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ด์„œ ํ•ธ๋“ค๋Ÿฌ ์ฐพ์Œ

- ์ด ๊ฒฝ์šฐ ๋นˆ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋นˆ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” BeanNameUrlHandlerMapping๊ฐ€ ์‹คํ–‰์— ์„ฑ๊ณตํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ์ธ OldController๋ฅผ ๋ฐ˜ํ™˜

 

2. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ

- HandlerAdapter์˜ supports()๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ

- SimpleControllerHandlerAdapter๊ฐ€ Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๋Œ€์ƒ์ด ๋จ

 

3. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰

- DispatcherServlet์ด ์กฐํšŒํ•œ SimpleControllerHandlerAdapter๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด๋„ ํ•จ๊ป˜ ๋„˜๊ฒจ์คŒ

- SCHA๋Š” ํ•ธ๋“ค๋Ÿฌ์ธ OldController๋ฅผ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

 

HttpRequestHandler

- ์„œ๋ธ”๋ฆฟ๊ณผ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์˜ ํ•ธ๋“ค๋Ÿฌ

 

์‹คํ–‰ ์ˆœ์„œ

1. ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ
HandlerMapping ์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ด์„œ, ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

์ด๊ฒฝ์šฐ๋นˆ์ด๋ฆ„์œผ๋กœํ•ธ๋“ค๋Ÿฌ๋ฅผ์ฐพ์•„์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์—์ด๋ฆ„๊ทธ๋Œ€๋กœ๋นˆ์ด๋ฆ„์œผ๋กœํ•ธ๋“ค๋Ÿฌ๋ฅผ์ฐพ์•„์ฃผ๋Š” BeanNameUrlHandlerMapping ๊ฐ€ ์‹คํ–‰์— ์„ฑ๊ณตํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ์ธ MyHttpRequestHandler ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ
HandlerAdapter ์˜ supports() ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
HttpRequestHandlerAdapter ๊ฐ€ HttpRequestHandler ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๋Œ€์ƒ์ด ๋œ๋‹ค.

3. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰
๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์กฐํšŒํ•œ HttpRequestHandlerAdapter ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด๋„ ํ•จ๊ป˜ ๋„˜๊ฒจ์ค€๋‹ค.

HttpRequestHandlerAdapter ๋Š” ํ•ธ๋“ค๋Ÿฌ์ธ MyHttpRequestHandler ๋ฅผ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

--> ๋‘˜ ๋‹ค ์ž˜์•ˆ์”€

 

@RequestMapping

- ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ•ธ๋“ค๋Ÿฌ ๋งตํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋Š” RequestMappingHandlerMapping, RequestMappingHandlerAdapter

- ์‹ค๋ฌด์—์„œ ์ฃผ๋กœ ์ด ๋ฐฉ์‹์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•จ


3. ๋ทฐ ๋ฆฌ์กธ๋ฒ„

application.properties์— ๋‹ค์Œ ์ฝ”๋“œ ์ถ”๊ฐ€

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” InternalResourceViewResolver ๋ผ๋Š” ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋Š”๋ฐ,
์ด๋•Œ application.properties ์— ๋“ฑ๋กํ•œ spring.mvc.view.prefix , spring.mvc.view.suffix ์„ค์ • ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋“ฑ๋กํ•œ๋‹ค.


์ฐธ๊ณ ๋กœ ๊ถŒ์žฅํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์„ค์ • ์—†์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์ฃผ์–ด๋„ ๋™์ž‘ํ•˜๊ธฐ๋Š” ํ•œ๋‹ค
.
return new ModelAndView("/WEB-INF/views/new-form.jsp");
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๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
์ฐธ๊ณ 
> InternalResourceViewResolver ๋Š” ๋งŒ์•ฝ JSTL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด InternalResourceView ๋ฅผ
์ƒ์†๋ฐ›์€ JstlView ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
JstlView ๋Š” JSTL ํƒœ๊ทธ ์‚ฌ์šฉ์‹œ ์•ฝ๊ฐ„์˜ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ๋‹ค.


์ฐธ๊ณ 
> ๋‹ค๋ฅธ ๋ทฐ๋Š” ์‹ค์ œ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜์ง€๋งŒ, JSP์˜ ๊ฒฝ์šฐ forward() ํ†ตํ•ด์„œ ํ•ด๋‹น JSP๋กœ ์ด๋™(์‹คํ–‰)ํ•ด์•ผ ๋ Œ๋”๋ง์ด
๋œ๋‹ค.
JSP
๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ทฐ ํ…œํ”Œ๋ฆฟ๋“ค์€ forward() ๊ณผ์ • ์—†์ด ๋ฐ”๋กœ ๋ Œ๋”๋ง ๋œ๋‹ค.


์ฐธ๊ณ 
> Thymeleaf ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ThymeleafViewResolver ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.
์ตœ๊ทผ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ
์ถ”๊ฐ€ํ•˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ด๋Ÿฐ ์ž‘์—…๋„ ๋ชจ๋‘ ์ž๋™ํ™”ํ•ด์ค€๋‹ค.

4. ์Šคํ”„๋งMVC - ์‹œ์ž‘ํ•˜๊ธฐ

- ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ (์œ ์—ฐํ•˜๊ณ  ์‹ค์šฉ์ )

 

@RequestMapping

- RequestMappingHandlerMapping -> ์ปจํŠธ๋กค๋Ÿฌ ์ฐพ์•„์คŒ        (๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ)

- RequestMappingHandlerAdapter   -> ์ฐพ์€ ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰  (๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ)

 

ํšŒ์› ๋“ฑ๋ก ํผ

@Controller
public class SpringMemberFormControllerV1 {
  
  @RequestMapping("/springmvc/v1/members/new-form")
  public ModelAndView process() {
    return new ModelAndView("new-form");
  }
}

@Controller

- @Component ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ๋นˆ ๋“ฑ๋กํ•˜๊ณ  ComponentScan ๋Œ€์ƒ์ด ๋จ

- ์Šคํ”„๋ง MVC์—์„œ ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ธ์‹ (RequestMappingHandlerMapping์—์„œ ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด ๋Œ€์ƒ์ด๋จ)


@RequestMapping

- ์š”์ฒญ์ •๋ณด ๋งตํ•‘ / ํ•ด๋‹น URL์ด ํ˜ธ์ถœ๋˜๋ฉด ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋จ

- ์• ๋…ธํ…Œ์ด์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์€ ์ž„์˜๋กœ ์ง€์œผ๋ฉด ๋จ

 

ModelAndView

- ๋ชจ๋ธ๊ณผ ๋ทฐ ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋จ

 

ServletApplication

//์Šคํ”„๋ง ๋นˆ ์ง์ ‘ ๋“ฑ๋ก
@Bean
SpringMemberFormControllerV1 springMemberFormControllerV1() {
  return new SpringMemberFormControllerV1();
}

 

ํšŒ์› ์ •๋ณด ์ €์žฅ

@Controller
public class SpringMemberSaveControllerV1 {
  
  private MemberRepository memberRepository = MemberRepository.getInstance();

  @RequestMapping("/springmvc/v1/members/save")
  public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
    String username = request.getParameter("username");
    int age = Integer.parseInt(request.getParameter("age"));
    Member member = new Member(username, age);
        
    memberRepository.save(member);
    
    ModelAndView mv = new ModelAndView("save-result");
    mv.addObject("member", member);
    return mv;
  }
}

mv.addObject("member", member); 

ใ„ด Model ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€


5. ์Šคํ”„๋งMVC - ํ†ตํ•ฉ 

@RequestMapping์„ ์ž˜ ๋ณด๋ฉด ํด๋ž˜์Šค ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฉ”์„œ๋“œ ๋‹จ์œ„์— ์ ์šฉ๋œ ๊ฒƒ์„ ํ™•์ธ

๋”ฐ๋ผ์„œ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ ๊ฐ€๋Šฅ

 

@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
  
  private MemberRepository memberRepository = MemberRepository.getInstance();
  
  @RequestMapping("/new-form")
  public ModelAndView newForm() {
    return new ModelAndView("new-form");
  }
     
  @RequestMapping("/save")
  public ModelAndView save(HttpServletRequest request, HttpServletResponse response) {
    String username = request.getParameter("username");
    int age = Integer.parseInt(request.getParameter("age"));
    Member member = new Member(username, age);
    memberRepository.save(member);
    ModelAndView mav = new ModelAndView("save-result");
    mav.addObject("member", member);
    return mav;
  }
  
  @RequestMapping
  public ModelAndView members() {
    List<Member> members = memberRepository.findAll();
    ModelAndView mav = new ModelAndView("members");
    mav.addObject("members", members);
    return mav;
  } 
}

@RequestMapping("/springmvc/v2/members") + @RequestMapping("/new-form")

ํด๋ž˜์Šค ๋ ˆ๋ฒจ + ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ ์กฐํ•ฉ


6. ์Šคํ”„๋งMVC - ์‹ค์šฉ์ ์ธ ๋ฐฉ์‹

์Šคํ”„๋ง MVC๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜๋งŽ์€ ํŽธ์˜๊ธฐ๋Šฅ ์ œ๊ณต์‹ค๋ฌด์—์„œ๋Š” ์ง€๊ธˆ๋ถ€ํ„ฐ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉ

 

Controller

/**
* v3
* Model ๋„์ž…
* ViewName ์ง์ ‘ ๋ฐ˜ํ™˜
* @RequestParam ์‚ฌ์šฉ
* @RequestMapping -> @GetMapping, @PostMapping 
*/
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
  
  private MemberRepository memberRepository = MemberRepository.getInstance();
  
  @GetMapping("/new-form")
  public String newForm() {
    return "new-form";
  }
  
  @PostMapping("/save")
  public String save( @RequestParam("username") String username, @RequestParam("age") int age, Model model) {
    Member member = new Member(username, age);
    memberRepository.save(member);
    model.addAttribute("member", member);
    return "save-result";
  }
  
  @GetMapping
  public String members(Model model) {
    List<Member> members = memberRepository.findAll();
    model.addAttribute("members", members);
    return "members";
  }
}

- Model์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ ๋ฐ”๋กœ ์ €์žฅ

- View์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„ ๋ฐ˜ํ™˜

- @RequestParam ์‚ฌ์šฉ (GET POST ๋ชจ๋‘ ์ง€์›)

- @RequestMapping -> @GetMapping, @PostMapping

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ