# Spring MVC ๊ตฌ์กฐ
Study Repository

Spring MVC ๊ตฌ์กฐ

by rlaehddnd0422

Spring MVC ์ „์ฒด ๊ตฌ์กฐ

Spring MVC ๋Š” ์ด ์ „์— ์ง์ ‘ ๋งŒ๋“ค์—ˆ๋˜ MVC ๊ตฌ์กฐ์™€ ๋งค์šฐ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„๋งŒ ์กฐ๊ธˆ ๋‹ค๋ฅผ ๋ฟ ๊ตฌ์กฐ์™€ ๋กœ์ง์„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ๋งŒ๋“  MVC ํ”„๋ ˆ์ž„์›Œํฌ
Spring MVC

์ด๋ฆ„๋งŒ ๋ฐ”๋€Œ์—ˆ์„ ๋ฟ ๊ฐ ํด๋ž˜์Šค์˜ ์—ญํ• ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค

  • Front-Controller โžฃ DispatcherServlet
  • handlerMappingMap โžฃ HandlerMapping
  • MyhandlerAdapter โžฃ HandlerAdapter
  • ModelView โžฃ ModelAndView
  • viewResolver โžฃ ViewResolver
  • MyView โžฃ View

์ด ์ „ ํฌ์ŠคํŒ…์—์„œ ๋งŒ๋“ค์—ˆ๋˜ MVC ๊ตฌ์กฐ๋ฅผ ์ž˜ ๊ธฐ์–ตํ•˜๋ฉด์„œ ๊ฐ ํด๋ž˜์Šค๋“ค์˜ ์—ญํ• ์„ ๊ธฐ์–ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

Spring MVC ๋˜ํ•œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”๋ฐ์š”. 

Spring MVC์˜ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ DispatcherServlet์ž…๋‹ˆ๋‹ค. 

์ด ๋””์ŠคํŒจ์ณ ์„œ๋ธ”๋ฆฟ์ด ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

 

์šฐ์„  DispatcherServlet์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

DispatcherServlet ์„œ๋ธ”๋ฆฟ ๋“ฑ๋ก

 

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

HttpServlet โ–ท DispatcherServlet

์„œ๋ธ”๋ฆฟ ์ƒ์†๊ด€๊ณ„

  • DispatcherServlet โžฃ FrameworkServlet โžฃ HttpServletBean โžฃ HttpServlet 

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” DispatcherServlet์„ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ๋ชจ๋“  ๊ฒฝ๋กœ urlPatterns="/"์— ๋Œ€ํ•ด ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

 

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

  1. ์„œ๋ธ”๋ฆฟ์ด ํ˜ธ์ถœ๋˜๋ฉด HttpServlet์ด ์ œ๊ณตํ•˜๋Š” service()๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  2. ์Šคํ”„๋ง MVC๋Š” DispatcherServlet์˜ ๋ถ€๋ชจ์ธ FrameworkServlet์—์„œ service()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด๋’€์Šต๋‹ˆ๋‹ค.
  3. ๋”ฐ๋ผ์„œ FrameworkServlet.service()๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ DispatcherServlet.doDispatch()๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ธ”๋ฆฟ ํ˜ธ์ถœ โžฃ HttpServlet.service() ํ˜ธ์ถœ โžฃ FrameworkServlet.service() ํ˜ธ์ถœ โžฃ DispatcherServlet.doDispatch()   

 

DispatcherServlet.doDispatch() ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   HttpServletRequest processedRequest = request;
   HandlerExecutionChain mappedHandler = null;
   boolean multipartRequestParsed = false;

   WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

   try {
      ModelAndView mv = null;
      Exception dispatchException = null;

      try {
         processedRequest = checkMultipart(request);
         multipartRequestParsed = (processedRequest != request);

         // Determine handler for the current request.
         mappedHandler = getHandler(processedRequest);
         if (mappedHandler == null) {
            noHandlerFound(processedRequest, response);
            return;
         }

         // Determine handler adapter for the current request.
         HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

         // Process last-modified header, if supported by the handler.
         String method = request.getMethod();
         boolean isGet = "GET".equals(method);
         if (isGet || "HEAD".equals(method)) {
            long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
            if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
               return;
            }
         }

         if (!mappedHandler.applyPreHandle(processedRequest, response)) {
            return;
         }

         // Actually invoke the handler.
         mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

         if (asyncManager.isConcurrentHandlingStarted()) {
            return;
         }

         applyDefaultViewName(processedRequest, mv);
         mappedHandler.applyPostHandle(processedRequest, response, mv);
      }
      catch (Exception ex) {
         dispatchException = ex;
      }
      catch (Throwable err) {
         // As of 4.3, we're processing Errors thrown from handler methods as well,
         // making them available for @ExceptionHandler methods and other scenarios.
         dispatchException = new NestedServletException("Handler dispatch failed", err);
      }
      processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
   }
   catch (Exception ex) {
      triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
   }
   catch (Throwable err) {
      triggerAfterCompletion(processedRequest, response, mappedHandler,
            new NestedServletException("Handler processing failed", err));
   }
   finally {
      if (asyncManager.isConcurrentHandlingStarted()) {
         // Instead of postHandle and afterCompletion
         if (mappedHandler != null) {
            mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
         }
      }
      else {
         // Clean up any resources used by a multipart request.
         if (multipartRequestParsed) {
            cleanupMultipart(processedRequest);
         }
      }
   }
}

 

1. ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ

// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
   noHandlerFound(processedRequest, response);
   return;
}

request์— ๋งคํ•‘๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ)๊ฐ€ ์žˆ๋Š”์ง€ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. 

 

2. ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ

// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

1์—์„œ ์กฐํšŒํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

 

3. ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰ โžฃ ModelAndView ๋ฆฌํ„ด 

// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

 

4. ๋ฆฌํ„ด๋œ ModelAndView๋ฅผ ์ด์šฉํ•ด processDispatchResult ๋ฉ”์†Œ๋“œ ์‹คํ–‰

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

 

processDispatchResult ๋ฉ”์†Œ๋“œ โžฃ render ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ 

private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
      @Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,
      @Nullable Exception exception) throws Exception {
      
      render(mv, request, response);
  }

 

render ๋ฉ”์†Œ๋“œ

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);

}

5. ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ํ†ตํ•ด ๋ทฐ ์ฐพ๊ณ  View ๋ฐ˜ํ™˜

view = resolveViewName(viewName, mv.getModelInternal(), locale, request);

6. View ๋ Œ๋”๋ง

view.render(mv.getModelInternal(), request, response);

 

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

1. ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ : ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ํ†ตํ•ด ์š”์ฒญ URL์— ๋Œ€ํ•ด ๋งคํ•‘๋œ ์ปจํŠธ๋กค๋Ÿฌ(ํ•ธ๋“ค๋Ÿฌ) ์กฐํšŒ

2. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ : ์กฐํšŒํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ

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

4. ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ : ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ 

5. ModelAndView ๋ฐ˜ํ™˜ : ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ์ •๋ณด๋ฅผ ModelAndView์— ๋‹ด์•„ ๋ฆฌํ„ด

6. viewResolver ํ˜ธ์ถœ  :  ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ฐพ๊ณ  ์‹คํ–‰ 

 JSP์˜ ๊ฒฝ์šฐ InternalResourceViewResolver๊ฐ€ ์ž๋™ ๋“ฑ๋ก๋˜๊ณ  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋’ค์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ํŒจ์Šค

7. View ๋ฐ˜ํ™˜ : ๋ทฐ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ๋ทฐ์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ๋ฌผ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋ทฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

8. ๋ทฐ ๋ Œ๋”๋ง : ๋ทฐ๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ๋ฅผ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค.

 

 

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

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

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

 

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

  1. ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘: org.springframework.web.servlet.HandlerMapping
  2. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ: org.springframework.web.servlet.HandlerAdapter
  3. ๋ทฐ ๋ฆฌ์กธ๋ฒ„: org.springframework.web.servlet.ViewResolver
  4. ๋ทฐ: org.springframework.web.servlet.View

 

<์ •๋ฆฌ>

 

1. ์Šคํ”„๋ง MVC๋Š” ์ฝ”๋“œ ๋ถ„๋Ÿ‰์ด ๋งค์šฐ ๋งŽ๊ณ  ๋ณต์žก, ๋‚ด๋ถ€๊ตฌ์กฐ ๋‹ค ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ

2. ์Šคํ”„๋ง MVC๋Š” ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ…€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค ์ผ์€ ์—†์Œ.

3. ๊ทธ๋ž˜๋„ ํ•ต์‹ฌ๋™์ž‘ ๋ฐฉ์‹์„ ์•Œ์•„๋‘๋ฉด ๋””๋ฒ„๊น…ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅ ํฌ์ธํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์–ด๋–ค ๋ถ€๋ถ„์„ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์„ ์žก์„ ์ˆ˜ ์žˆ์Œ

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., -

www.inflearn.com

https://catsbi.oopy.io/f52511f3-1455-4a01-b8b7-f10875895d5b

 

์Šคํ”„๋ง MVC - ๊ตฌ์กฐ ์ดํ•ด

๋ชฉ์ฐจ

catsbi.oopy.io

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ