[Spring] MVC를 활용한 웹 애플리케이션 구성 요소
1. Model2 방식의 웹 애플리케이션 개발에 필요한 구성요소
MVC를 활용한 웹 애플리케이션의 구성은 크게 다섯 개의 클래스로 구분된다.
DispatcherServlet, HandlerMapping, HandlerAdapter, ViewResolver, View로 나뉘는데, DispatcherServlet을 제외한 다른 클래스는 모두 인터페이스 타입의 클래스이다. 각 클래스들이 어떤 일을 하는지 하나씩 살펴보도록 하자.
1. DispatcherServlet
- web.xml에서 설정하는 클래스이다. 서블릿의 대략적인 실행 순서는 아래와 같다.
- DispatcherServlet의 코드는 링크의 Child Spring Container란에서 확인 가능하다.
- 클라이언트의 모든 요청을 처리하는 클래스로, 특정 url 패턴을 지정하면 해당 url 패턴의 모든 요청을 처리한다. 기본 url은 ‘*.do’와 같은 형식으로 정의되어 있다.
- 서블릿은 요청 url을 HandlerMapping에게 전달해서, 클라이언트의 요청을 처리할 HandlerAdapter 객체를 제공받는다.
- HandlerAdapter 객체는 사용자의 요청을 처리할 적절한 컨트롤러를 찾아 요청핸들러 메소드를 실행하고, ModelAndView 객체를 DispatcherServlet에게 반환한다.
- ModelAndView 객체에는 뷰에 전달할 Model(데이터)와 String(뷰 이름: jsp 경로 혹은 리다이렉션 경로)가 포함되어 있다.
- 이 객체 안에 View 객체가 포함되어 있지 않으면 ViewResolver에게 뷰 이름을 전달해서 적절한 View를 제공받는다.
- 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의 실행 순서
- 클라이언트가 웹서버로 요청을 보낸다.
- 웹서버가 요청객체와 응답객체를 생성한다.
- 웹서버가 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에게 반환한다.
- DispatcherServlet은 ViewResolver에게 뷰 이름을 전달한다.
- VIewResolver는 뷰이름을 분석해서 JstlView나 RedirectView를 반환한다.
- DispatcherServlet은 JstlView 혹은 RedirectView의 render(model, request, response)를 실행한다.
- JstlView는 model의 값을 요청객체의 속성에 저장하고, 지정된 jsp로 내부이동해서 jsp를 실행한다.
- jsp에서 EL, JSTL을 사용해서 요청객체의 속성에 저장된 값으로 동적 HTML 컨텐츠를 생성하고, 응답으로 HTML을 보낸다.
- RedirectView는 재요청URL을 응답으로 보낸다.
- JstlView는 model의 값을 요청객체의 속성에 저장하고, 지정된 jsp로 내부이동해서 jsp를 실행한다.
- 웹서버가 요청객체와 응답객체를 폐기시킨다.