[Spring] Spring MVC Framework란? Spring MVC 구조, DispatcherServlet, 핸들러 매핑, 핸들러 어댑터

Spring MVC Framework란?

 

MVC는 Model-View-Controller의 약자로 하나의 디자인 패턴을 뜻한다. Spring MVC에 대해 이해하려면 Model, View, Controller에 대한 이해가 필수이니 해당 내용에 대해 잘 모른다면 다음을 참고하자.

 

 

 

[Web] MVC 패턴이란? MVC 패턴의 등장 배경

MVC 패턴의 등장 배경 하나의 서블릿 혹은 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리한다면, 너무 많은 역할을 하게 되어 유지보수가 어렵다. 또한, UI를 일부 수정하는 일과 비즈니스

code-lab1.tistory.com

 

 

Spring MVC Framework는 웹 애플리케이션을 빌드하기 위한 프레임워크이다. 

 

다른 MVC Framework 들도 웹 어플리케이션을 빌드할 수 있다. 하지만  Spring MVC는 MVC 디자인 패턴을 따르며 Spring Framework의 특징인 의존관계 주입(DI), 제어의 역전(IoC) 등을 구현한다. 

 

참고)

 

 

[Spring] IoC,DI, 스프링 컨테이너(Container), 스프링 빈(Bean)이란?

IoC(Inversion of Control)란? IoC는 제어의 역전이라는 뜻으로 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 말한다. 이전에는 개발자가 객체를 생성하고 관리하며 프로

code-lab1.tistory.com

 

 

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 동작 구조

Spring MVC 구조
[그림 1] Spring MVC 동작 구조 ( 출처 : 인프런 김영한 강의 - 참고1 )

 

 

  1. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회
  2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
  3. 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
  4. 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행한다.
  5. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 요청을 처리하고 반환하는 정보를 ModelAndView로 변환해서 반환한다.
  6. viewResolver 호출 : viewResolver를 찾고 실행한다.
  7. View반환 : viewResolver는 View의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 View 객체를 반환한다.
  8. 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

 

3. https://kotlinworld.com/326

반응형

댓글

Designed by JB FACTORY