Spring MVC Framework란?
MVC는 Model-View-Controller의 약자로 하나의 디자인 패턴을 뜻한다. Spring MVC에 대해 이해하려면 Model, View, Controller에 대한 이해가 필수이니 해당 내용에 대해 잘 모른다면 다음을 참고하자.
Spring MVC Framework는 웹 애플리케이션을 빌드하기 위한 프레임워크이다.
다른 MVC Framework 들도 웹 어플리케이션을 빌드할 수 있다. 하지만 Spring MVC는 MVC 디자인 패턴을 따르며 Spring Framework의 특징인 의존관계 주입(DI), 제어의 역전(IoC) 등을 구현한다.
참고)
Spring MVC 구조
DispatcherServlet
다른 웹 프레임워크들에서 사용되는 Front Controller의 역할을 한다. 즉, 가장 앞단에서 클라이언트의 요청을 처리하는 Controller로써 요청부터 응답까지 전반적인 처리 과정을 통제한다.
Handler(Controller)
Spring MVC에서는 Controller=Handler(핸들러)라고 생각하면 편하다. 핸들러는 DispatcherServlet가 전달해 준 HTTP 요청을 처리하고 결과를 Model에 저장한다.
ModelAndView
ModelAndView는 controller에 의해 반환된 Model과 View가 Wrapping 된 객체이다. 말 그대로 Model과 View가 같이 들어있는 객체라고 보면 된다.
ViewResolver
ViewResolver는 ModelAndView를 처리하여 View를 그리는 역할을 한다. Model에 저장된 데이터를 사용해 View를 그리고 사용자는 View를 보게 된다.
Spring MVC 동작 구조
- 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회
- 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
- 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
- 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행한다.
- ModelAndView 반환 : 핸들러 어댑터는 핸들러가 요청을 처리하고 반환하는 정보를 ModelAndView로 변환해서 반환한다.
- viewResolver 호출 : viewResolver를 찾고 실행한다.
- View반환 : viewResolver는 View의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 View 객체를 반환한다.
- View 렌더링 : View를 통해서 View를 렌더링한다.
핸들러 매핑과 핸들러 어댑터(Handler Adapter)
핸들러 매핑은 DispatcherServlet이 요청에 맞는 핸들러를 찾는 과정이다. 핸들러 어댑터는 핸들러 매핑에서 찾은 핸들러 객체를 다룰 수 있는 어댑터이다.
핸들러 매핑에서 요청에 맞는 핸들러를 찾았으면 바로 핸들러를 호출하면 되는 게 아닌가 하는 의문이 들 수 있다.
다양한 핸들러의 return 타입은 String, ModelAndView 등 다양하며, Parameter로 들어오는 값도 HttpServletRequest로 받거나 HttpServletResponse로 받는 등 다양한 형식으로 받을 수 있다. 이처럼 다양한 핸들러 구현 방식에 맞춰 개발을 하는 것은 쉽지 않다.
따라서 이러한 요구 사항을 충족하기 위해 중간에 Adapter를 두는 어댑터 패턴을 사용하는 것이다.
만약 핸들러 어댑터를 사용하면, 핸들러에서 결괏값을 어떻게 반환하든 이를 처리해 DispatcherServlet에게 ModelAndView객체로 통일하여 응답을 전달해 줄 수 있다.
이처럼 핸들러 어댑터를 사용하면 개발자는 좀 더 비즈니스 로직 구현에 집중할 수 있기 때문에 사용하는 것이다.
다행히, Spring은 이미 필요한 핸들러 매핑과 핸들러 어댑터를 대부분 구현해 두었기 때문에 개발자가 직접 핸들러 매핑과 핸들러 어댑터를 구현하는 일은 거의 없다.
참고
1. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
(인프런 김영한 강의 - 스프링 MVC 1편)
2. https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html
'Back-End > [Spring]' 카테고리의 다른 글
[Spring] JDBC(Java Database Connectivity)란? JDBC 드라이버란? (0) | 2022.11.10 |
---|---|
[Spring] @RequestMapping, @GetMapping, @PostMapping에 대하여 (0) | 2022.08.16 |
[Spring] 스프링 패키지 구조, DAO, DTO, Entity, Repository 에 대하여, DTO를 사용하는 이유 (4) | 2022.04.11 |
[Spring] AOP(Aspect Oriented Programming)란? 스프링 AOP란? (2) | 2022.03.30 |
[Spring] 빈 스코프(Bean Scope)란? Dependency Lookup(DL)이란? (0) | 2022.03.25 |