반응형
# 목적
- Spring MVC의 주요 컴포넌트인 DispatcherServlet, HandlerMapping, HandlerAdapter, View, ViewResolver와 그에 대한 연관관계에 대해 알아보기
Spring MVC의 주요 컴포넌트
1. DispatcherServlet
- 서블릿 클래스
- MVC 패턴에서 프론트 컨트롤러의 역할을 수행한다.
- 프론트 컨트롤러는 모든 HTTP 요청을 접수받고, MVC 패턴의 전 과정이 유기적으로 실행되도록 주도적 역할을 수행한다.
2. HandlerMapping
- 인터페이스로, 다양한 구현 클래스가 존재한다.
- 개발자가 정의한 컨트롤러 클래스의 매핑정보를 분석한다.
- DispatcherServlet의 지시를 받아서 클라이언트가 요청한 요청과 매핑되는 컨트롤러, 요청핸들러 메서드를 검색한다.
- 컨트롤러 혹은 요청핸들러 메서드를 실행하는 HandlerAdapter를 제공한다.
3. HandlerAdapter
- 인터페이스로, 다양한 구현 클래스가 존재한다.
- 인터셉터와 요청핸들러 메서드를 실행한다.
- 요청핸들러 메서드 실행에 필요한 작업을 수행한다.
- 요청핸들러 메서드의 매개변수를 분석해서 적절한 객체를 제공한다.
- 뷰에 전달할 데이터를 담을 수 있는 Model 객체를 생성해서 전달한다.
public String home(Model model) { ... }
- 요청객체와 응답객체를 전달한다.
public String home(HttpServletRequest request, HttpServletResponse response) { ... }
- 세션객체를 전달한다.
public String home(HttpSession session) { ... }
- 로케일 객체를 전달한다.
public String home(Locale locale) { ... }
- 뷰에 전달할 데이터를 담을 수 있는 Model 객체를 생성해서 전달한다.
- 요청핸들러 메서드의 매개변수를 분석해서 적절한 요청 파라미터 값을 바인딩한다. (매개변수의 타입이 기본자료형 혹은 String일 때)
- 요청파라미터에서 page값을 찾아서 매개변수에 바인딩한다.
http://localhost/board/list?page=2public 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) { }
- 요청파라미터에서 page값을 찾아서 매개변수에 바인딩한다.
- 요청핸들러 메서드의 매개변수를 분석해서 적절한 폼객체를 생성하고, 요청파라미터를 저장한 다음 매개변수로 전달한다.
- 요청핸들러 메서드의 매개변수를 분석해서 적절한 객체를 제공한다.
- 요청핸들러 메서드가 반환하는 반환값을 분석해서 최종적으로 ModelAndView객체로 저장한다.
- 요청핸들러 메서드가 ModelAndView객체를 반환한다.
@GetMapping("/") public ModelAndView home() { ModelAndView mav = new ModelAndView(); mav.addObject("msg", "홈페이지 방문을 환영합니다."); mav.setViewName(); return mav; } // 요청핸들러 메서드가 반환하는 ModelAndView객체를 DispatcherServlet에게 전달한다.
- 요청핸들러 메서드가 String을 반환한다.
@GetMapping("/") public String home() { return "home"; } // ModelAndView 객체를 생성한다. // 요청핸들러 메서드가 반환하는 값을 viewName으로 저장하고, DispatcherServlet에게 전달한다. // ModelAndView // Object View <--- "home" // ModelMap model <--- null
- 요청핸들러 메서드가 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
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-MVC의-주요-컴포넌트
'BackEnd > Spring' 카테고리의 다른 글
[Spring] mybatis 쿼리 캐싱 (<cache> 태그) (0) | 2025.01.17 |
---|---|
[Spring] mybatis의 동적 쿼리 (0) | 2025.01.17 |
[Spring] 코드 작성 순서 (0) | 2025.01.17 |
[Spring] 스프링의 주요 어노테이션과 요청핸들러 메서드 (0) | 2025.01.17 |
[Spring Boot] Spring Boot로 웹 애플리케이션 프로젝트 생성하기 (기본 설정) (0) | 2025.01.17 |