1. Model2 방식의 웹 애플리케이션 개발에 필요한 구성요소

MVC를 활용한 웹 애플리케이션의 구성은 크게 다섯 개의 클래스로 구분된다.
DispatcherServlet, HandlerMapping, HandlerAdapter, ViewResolver, View로 나뉘는데, DispatcherServlet을 제외한 다른 클래스는 모두 인터페이스 타입의 클래스이다. 각 클래스들이 어떤 일을 하는지 하나씩 살펴보도록 하자.

1. DispatcherServlet

  • web.xml에서 설정하는 클래스이다. 서블릿의 대략적인 실행 순서는 아래와 같다.
    • DispatcherServlet의 코드는 링크의 Child Spring Container란에서 확인 가능하다.
  1. 클라이언트의 모든 요청을 처리하는 클래스로, 특정 url 패턴을 지정하면 해당 url 패턴의 모든 요청을 처리한다. 기본 url은 ‘*.do’와 같은 형식으로 정의되어 있다.
  2. 서블릿은 요청 url을 HandlerMapping에게 전달해서, 클라이언트의 요청을 처리할 HandlerAdapter 객체를 제공받는다.
  3. HandlerAdapter 객체는 사용자의 요청을 처리할 적절한 컨트롤러를 찾아 요청핸들러 메소드를 실행하고, ModelAndView 객체를 DispatcherServlet에게 반환한다.
    • ModelAndView 객체에는 뷰에 전달할 Model(데이터)와 String(뷰 이름: jsp 경로 혹은 리다이렉션 경로)가 포함되어 있다.
    • 이 객체 안에 View 객체가 포함되어 있지 않으면 ViewResolver에게 뷰 이름을 전달해서 적절한 View를 제공받는다.
  4. DispatcherServlet은 View 객체의 render(model, request, response) 메소드를 실행해 클라이언트에게 응답컨텐츠를 보낸다.

2. HandlerMapping

  • 컨트롤러의 어노테이션 정보를 분석해서 DispatcherServlet으로 받은 요청 uri와 요청핸들러 메소드의 매핑정보를 알아내는 인터페이스 클래스이다.
    • 주 어노테이션: @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping
  • HandlerMapping은 HandlerAdapter를 반환하는데, 이 객체가 컨트롤러의 요청을 실질적으로 처리한다.

3. HandlerAdapter

  • 요청핸들러 메소드(컨트롤러)를 실행하는 객체이다.
  • 요청파라미터를 분석해서 요청파라미터값, 폼입력값, 요청메세지를 매개변수에 제공한다.
  • 요청핸들러 메소드가 반환하는 값을 분석해 ModelAndView 객체에 저장하고, ModelAndView를 DispatcherServlet에게 반환한다.

4. ModelAndView

  • 데이터, 뷰 이름, 뷰 객체를 저장하는 객체이다.
  • 요청핸들러 메소드 안에서 Model 객체에 저장한 데이터가 ModelAndView 객체의 데이터로 저장된다.
    (model.addAttribute("name", Object);
    
  • 메소드가 반환한 jsp 페이지 경로, 혹은 리다이렉션 경로가 뷰이름으로 저장된다.

5. viewResolver

  • HandlerAdapter가 반환한 ModelAndView 객체에 View가 없을 때, 뷰이름을 전달받아서 적절한 View 객체를 반환하는 객체다.
    • 즉 view 객체가 있으면 바로 render 메소드를 실행하고, 없으면 ViewResolver가 실행된다.
  • internalResourceView, RedirectView, JstlView 중에 하나를 반환한다.
  • 뷰 이름이 “redirect”로 시작하면 RedirectView를 반환하고, jstl 태그를 사용한 jsp는 JstlView를 반환한다.

6. View

  • 클라이언트에게 응답컨텐츠를 제공하는 객체이다.
  • void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) 메소드를 재정의해서 model로 전달받은 데이터를 다양한 컨텐츠 타입의 응답을 생성해서 클라이언트에게 보낸다.

2. Spring MVC의 실행 순서

  1. 클라이언트가 웹서버로 요청을 보낸다.
  2. 웹서버가 요청객체와 응답객체를 생성한다.
  3. 웹서버가 DispatcherServlet의 service(request, response) 메소드를 실행한다.
    • HandlerMapping에게 요청URL을 보낸다.
    • HandlerMapping은 요청URL을 분석해서 요청URL과 매핑된 요청핸들러메소드(컨트롤러)를 실행할 HandlerAdapter 객체를 반환한다.
    • DispatcherServlet은 HandlerAdapter의 handle(request, response, handler) 메소드를 실행한다.
    • HandlerAdapter는 Interceptor를 실행해서 요청핸들러 메소드 실행 전 처리를 수행한다.
    • HandlerAdapter는 ArgumentResolver를 실행해서 요청핸들러 메소드의 매개변수를 분석하고, 적절한 값 혹은 객체를 생성한다.
    • HandlerAdapter는 요청핸들러 메소드를 실행한다. 생성한 값 혹은 객체를 요청핸들러 메소드의 매개변수로 전달한다.
    • 사용자가 정의한 요청핸들러 메소드에서 클라이언트의 요청을 처리한다.
      • 뷰페이지에 전달한 데이터는 Model객체에 저장한다.
      • 뷰페이지의 이름을 반환한다.
    • HandlerAdapter는 ModelAndView 객체를 생성해서, ModelAndView에 데이터와 뷰페이지 이름을 저장한다.
    • HandlerAdapter는 이 객체를 DispatcherServlet에게 반환한다.
  4. DispatcherServlet은 ViewResolver에게 뷰 이름을 전달한다.
    • VIewResolver는 뷰이름을 분석해서 JstlView나 RedirectView를 반환한다.
  5. DispatcherServlet은 JstlView 혹은 RedirectView의 render(model, request, response)를 실행한다.
    • JstlView는 model의 값을 요청객체의 속성에 저장하고, 지정된 jsp로 내부이동해서 jsp를 실행한다.
      • jsp에서 EL, JSTL을 사용해서 요청객체의 속성에 저장된 값으로 동적 HTML 컨텐츠를 생성하고, 응답으로 HTML을 보낸다.
    • RedirectView는 재요청URL을 응답으로 보낸다.
  6. 웹서버가 요청객체와 응답객체를 폐기시킨다.