[Spring] Spring MVC의 주요 컴포넌트(Model, View 전달 과정)

류넹·2024년 2월 27일
1

Spring

목록 보기
16/50

# 목적

  • Spring MVC의 주요 컴포넌트인 DispatcherServlet, HandlerMapping, HandlerAdapter, View, ViewResolver와 그에 대한 연관관계에 대해 알아보기




Spring MVC의 주요 컴포넌트

1. DispatcherServlet

  • 서블릿 클래스
  • MVC 패턴에서 프론트 컨트롤러의 역할을 수행한다.
  • 프론트 컨트롤러는 모든 HTTP 요청을 접수받고, MVC 패턴의 전 과정이 유기적으로 실행되도록 주도적 역할을 수행한다.



2. HandlerMapping

  • 인터페이스로, 다양한 구현 클래스가 존재한다.
  • 개발자가 정의한 컨트롤러 클래스의 매핑정보를 분석한다.
  • DispatcherServlet의 지시를 받아서 클라이언트가 요청한 요청과 매핑되는 컨트롤러, 요청핸들러 메서드를 검색한다.
  • 컨트롤러 혹은 요청핸들러 메서드를 실행하는 HandlerAdapter를 제공한다.



3. HandlerAdapter

  • 인터페이스로, 다양한 구현 클래스가 존재한다.
  • 인터셉터와 요청핸들러 메서드를 실행한다.
  • 요청핸들러 메서드 실행에 필요한 작업을 수행한다.
    1. 요청핸들러 메서드의 매개변수를 분석해서 적절한 객체를 제공한다.
      • 뷰에 전달할 데이터를 담을 수 있는 Model 객체를 생성해서 전달한다.
        public String home(Model model) { ... }
      • 요청객체와 응답객체를 전달한다.
        public String home(HttpServletRequest request, HttpServletResponse response) { ... }
      • 세션객체를 전달한다.
        public String home(HttpSession session) { ... }
      • 로케일 객체를 전달한다.
        public String home(Locale locale) { ... }

    2. 요청핸들러 메서드의 매개변수를 분석해서 적절한 요청 파라미터 값을 바인딩한다. (매개변수의 타입이 기본자료형 혹은 String일 때)
      • 요청파라미터에서 page값을 찾아서 매개변수에 바인딩한다.
        http://localhost/board/list?page=2
        public String list(int page) { }
      • 로그인폼의 입력필드에서 입력한 정보로 전달된 요청파라미터값을 id와 password 매개변수에 바인딩한다.
        <form method="post" action="login"
            <input type="text" name="id">
            <input type="password" name="password">
            <button type="submit">로그인</button>
         </form>
        @PostMapping("/login")
        public String login(String id, String password) { }

    3. 요청핸들러 메서드의 매개변수를 분석해서 적절한 폼객체를 생성하고, 요청파라미터를 저장한 다음 매개변수로 전달한다.

  • 요청핸들러 메서드가 반환하는 반환값을 분석해서 최종적으로 ModelAndView객체로 저장한다.
    1. 요청핸들러 메서드가 ModelAndView객체를 반환한다.
    @GetMapping("/")
    public ModelAndView home() {
    	ModelAndView mav = new ModelAndView();
      	mav.addObject("msg", "홈페이지 방문을 환영합니다.");
      	mav.setViewName();
          
          return mav;
    }
    // 요청핸들러 메서드가 반환하는 ModelAndView객체를 DispatcherServlet에게 전달한다.
    1. 요청핸들러 메서드가 String을 반환한다.
    @GetMapping("/")
    public String home() {
    	return "home";
    }
    // ModelAndView 객체를 생성한다.
    // 요청핸들러 메서드가 반환하는 값을 viewName으로 저장하고, DispatcherServlet에게 전달한다.
    // ModelAndView
        // Object View    <--- "home"
        // ModelMap model <--- null
    1. 요청핸들러 메서드가 Model객체를 매개변수로 전달받고, String을 반환한다.
    @GetMapping("/")
    public String home(Model model) {
    	model.addAttribute("msg", "홈페이지 방문을 환영합니다.");
      	return "home";
    }
    // 요청핸들러 메서드 호출 전에 미리 Model 객체를 생성하고, 요청핸들러 메서드의 매개변수로 전달한다.
    // ModelAndView 객체를 생성한다.
    // 미리 생성해둔 Model객체를 ModelAndView에 저장한다.
    // 요청핸들러 메서드가 반환하는 값을 viewName으로 저장하고, DispatcherServlet에게 전달한다.
    // ModelAndView
        // Object View    <--- "home"
        // ModelMap model <--- Model - {msg:"홈페이지 방문을 환영합니다."}



4. View

  • 인터페이스로, 다양한 구현 클래스가 존재한다.
  • Model에 저장된 데이터를 특정 컨텐츠 타입(HTML, JSON, XML...)으로 변환해서 응답으로 제공하는 기능을 담당한다.
  • DispatcherServlet은 컨트롤러를 실행해서 최종적으로 획득한 ModelAndView에서 View객체를 꺼내고, 그 View객체의 메서드를 실행해서 클라이언트에게 응답을 제공한다.
    • ModelAndView에는 View객체가 들어있거나 뷰이름이 들어있을 수 있다.
    • ModelAndView에 뷰이름이 들어있는 경우에는 View객체를 획득하기 위해서 ViewResolver의 도움을 받는다.
  • View 인터페이스를 구현한 다양한 View객체를 활용하면 클라이언트에게
    • 모델의 데이터가 표현된 HTML / XML / JSON 응답을 보낼 수 있다.
    • 모델의 데이터로 엑셀시트를 생성 / PDF문서를 작성해서 응답을 보낼 수 있다.
    • 모델의 데이터에 파일정보가 포함되어 있다면 파일 다운로드 응답을 보낼 수 있다.
  • Spring MVC는 JSP 페이지를 뷰템플릿으로 사용하는 웹 애플리케이션에서 사용할 수 있는 InternalResourceView, JstlView, RedirectView를 제공한다.



5. ViewResolver

  • 인터페이스로, 다양한 구현 클래스가 존재한다.
  • 뷰이름에 맞는 뷰 객체를 반환한다.
  • JSP 페이지를 뷰템플릿으로 사용하는 웹 애플리케이션에서의
    기본 뷰리졸버 : InternalResourceViewResolver
  • InternalResourceViewResolver는 뷰이름을 분석해서 InternalResourceView, JstlView, RedirectView 중 하나를 반환한다.





🔎 View Resolver 아키텍처 (View 객체 변환 과정)

  • Model에 있는 Data를 View가 특정 컨텐츠 타입으로 변환해서 응답으로 보내줌
  • Model에는 모든 요청에 대해서 JSP로 내부이동시키는 뷰가 있어야 함

Model(Data) ---> View ---> HTML, JSON, XML...






🔎 Spring MVC 아키텍처 (View 실행 전체 과정)





📌 Spring mvc의 전체 사이클

---------> 탐색(호출)
                         ┍ HandlerAdapter ┑                       ┍ MapperProxy ┑
DispatcherServlet    --->    Controller    --->    Service    --->    Mapper
              └ HandlerMapping ┘
<--------- 값 전달(매개변수를 통해)
DispatcherServlet    <---    Controller    <---    Service    <---    Mapper
                             └ Model 객체 생성 ┘
└ ViewResolver ┘ └ ModelAndView ┘

위 과정을 거쳐 DispatcherServlet이 View를 실행
Model에 저장된 정보를 요청객체의 속성으로 저장하고 JSP로 내부이동하게 된다.
최종적으로 JSP에서 EL, JSTL을 통해 값을 획득할 수 있다.




💡 참고 이미지)

  • eGovFrame에서 제공되는 교육용 이미지

Spring MVC 컴포넌트 간의 관계와 흐름

Spring MVC Architecture

profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글