본문 바로가기

Back-end/Spring

MVC 핵심 구성 요소

본문 내용은 초보 웹 개발자를 위한 스프링5 프로그래밍 입문(최범균)을 참고하고 있습니다.


https://pangtrue.tistory.com/83

<<spring bean>>이라고 표시한 것은 스프링 빈으로 등록해야 하는 것을 의미한다.


Spring Mvc 핵심 구성요소 4가지

  1. HandlerMapping - 컨트롤러 검색
  2. HandlerAdapter - 컨트롤러 실행
  3. ViewResolver - 컨트롤러의 실행 결과를 보여줄 View 객체 검색
  4. View - View 객체를 실행하여 응답 결과 JSP 페이지를 생성

1번 과정 (DispatcherServlet)

  • 모든 연결을 담당한다.
  • 웹 브라우저로부터 요청이 들어오면 DispatcherServlet은 요청을 처리하기 위한 컨트롤러 객체를 검색한다.
  • 이때 DispatcherServlet은 직접 컨트롤러를 검색하지 않고 HandlerMapping이라는 빈 객체에게 컨트롤러 검색을 요청한다.(2번 과정에 해당)

2번 과정 (HandlerMapping)

  • 클라이언트의 요청 경로를 이용해서 이를 처리할 컨트롤러 빈 객체를 DispatcherServlet에 전달한다.
  • ex) 웹 요청 경로가 '/hello'라면 등록된 컨트롤러 빈 중에서 '/hello' 요청 경로를 처리할 컨트롤러를 리턴한다.

3번 과정

  • DispatcherServlet은 HandlerMapping이 찾아준 컨트롤러 객체를 처리할 수 있는 HandlerAdapter 빈에게 요청 처리를 위임한다.

4~5번 과정

  • HandlerAdapter는 컨트롤러의 알맞은 메소드를 호출해서 요청을 처리한다.

6번 과정

  • 4~5번 과정의 결과를 DispatcherServlet에 리턴한다.
  • 이 때 HandlerAdapter는 컨트롤러의 처리 결과를 ModelAndView라는 객체로 변환해서 DispatcherServlet에 리턴한다.

7번 과정

  • HandlerAdapter로부터 컨트롤러의 요청 처리 결과를 ModelAndView로 받으면 DispatcherServlet은 결과를 보여줄 뷰를 찾기 위해 ViewResolver 빈 객체를 사용한다.

8번 과정

  • DispatcherServlet은 ViewResolver가 리턴한 View 객체에게 응답 결과 생성을 요청한다.

9번 과정

  • JSP를 사용하는 경우 View 객체는 JSP를 실행함으로써 웹 브라우저에 전송할 응답 결과를 생성하고 이로써 모든 과정이 끝난다.

HandlerAdapter

  • 컨트롤러를 바로 실행시키지 않고 HandlerAdapter를 쓰는 이유 : 컨트롤러를 구현하는 방법이 1가지가 아닌 3가지이기 때문이다.
  • 위에서 언급한 3가지 @Controller, Controller Interface, HttpRequestHandler Interface를 동일한 방식으로 처리하기 위해 중간에 사용되는 것이 바로 HandlerAdapter 빈이다.
  • 컨트롤러 실행 결과를 ModelAndView 객체타입으로 리턴한다.

ModelAndView

  • 컨트롤러가 리턴한 뷰 이름을 담고 있다.

ViewResolver

  • 컨트롤러의 요청 처리 결과를 ModelAndView로 받으면 DispatcherServlet은 결과를 보여줄 뷰 객체를 검색하기 위해 ViewResolver 빈 객체를 사용한다.
  • ModelAndView가 담고 있는 뷰 이름에 해당하는 view 객체를 찾거나 생성해서 리턴한다.
  • 응답을 생성하기 위해 JSP를 사용하며 매번 새로운 View 객체를 생성해서 DispatcherServlet에 리턴한다.

'Back-end > Spring' 카테고리의 다른 글

MVC란? (Spring MVC)  (0) 2021.10.05
AOP 프로그래밍 (학습필요)  (0) 2021.10.01
빈 라이프 사이클과 범위  (0) 2021.10.01
컴포넌트 스캔(@Component, @ComponentScan) - 학습필요  (0) 2021.10.01
의존 자동 주입  (0) 2021.10.01