본문 바로가기

Spring

MVC 패턴 및 Spring MVC 🌱


MVC 패턴

MVC 패턴은 소프트웨어 개발 디자인 패턴중 하나로 Model, View, Controller로 컴포넌트를 나누어 개발하는 패턴이다.
각각의 컴포넌트를 독립적으로 개발할 수 있고, 데이터 플로우의 규칙이 있기 때문에 유지보수와 확장, 재사용성에 용이하다는 장점이 있다. Web Application에는 Spring MVC, ASP.NET MVC 등 으로 사용된다.

Model

MVC 중 Model은 Application의 데이터와 비즈니스 로직을 담당한다. Controller의 요청에 따른 데이터 처리 및 DB와의 데이터 통신을 담당한다.

VIEW

MVC 중 View는 Aplication의 상태 및 사용자에게 정보를 표시한다. UI를 구성하며 데이터를 사용자에게 보여주는 역할을 한다. HTML, CSS를 사용하여 데이터를 사용자에게 보여주고 요청을 받으며, Front Framework인 React, Vue, Angular를 사용하여 데이터를 바인딩하거나 Template Engine인 JSP, Thymeleaf 등을 사용하기도 한다.

Controller

MVC 중 Controller는 Model 과 View를 이어주는 역할을 한다. View에서 전달된 사용자의 요청을 Model로 업데이트하고 Model에서 처리된 데이터를 View로 전달하는 역할을 한다.

MVC 패턴의 원칙

MVC 패턴의 5가지 원칙은 컴포넌트들의 독립성을 유지시키고 결합도를 낮추는것에 초점이 맞춰져 있다.

Model은 View와 Controller에 의존하지 않아야 한다.
Model은 데이터를 저장하는 DTO와 비즈니스 로직을 처리하는 Service, DB와의 연결 객체인 DAO로 나뉘게 되는데 이때 DTO, DAO, Service에는 View 와 Controller와 관련된 코드가 없어야한다. 이는 의존성을 최소화 하여 코드 변경에 따른 유지보수 비용을 줄이는 역할을 한다.

  • View는 Model에만 의존해야하고, Controller에는 의존하면 안된다.
    View는 Model에만 의존함으로써 관심사의 분리로 코드 가독성과 유지보수가 용이해진다. 또한 Model에 대한 의존성만을 가지고 있기 때문에 확장과 다른 모델로의 이식이 간편해진다.

  • View 가 Model 로부터 데이터를 받을 때 사용자마다 다르게 보여주어야하는 데이터만 받아야 한다.
    예를들어 네이게이터나 UI와 같은 공통적으로 보이는 부분은 Model로부터 데이터를 받아 처리하는것이 아닌 View에서 처리하는것이 성능 및 유지보수 향상에 이점이 있다.

  • Controller는 Model과 View에 의존해도 된다.
    Controller는 Model과 View를 이어주므로 해당 하는 코드가 있어도 된다.

  • View가 Model로부터 데이터를 받을 때, 반드시 Controller를 통해서 받아야 한다.
    View에 Model로부터 직접적으로 데이터를 받지 않음으로 인해서 컴포넌트간의 결합도를 낮추고 Model과 View의 의존관계 형성을 예방한다.

MVC1과 MVC2

프로젝트 규모에 따라 효율적 설계를 위한 MVC1과 MVC2로 나뉘게 된다.

  • MVC1
    View가 Controller의 역할을 모두 수행한다. View + Controller, Model 로 구성되며 하나의 컴포넌트가 두개의 역할을 하기 때문에 소스코드가 복잡하여 유지보수 비용 증가와 같은 단점이 있고, 소규모의 프로젝트를 진행시 구현이 빠르다는 장점이 있다.
  • MVC2
    Model, View, Controller가 독립적으로 나누어진 형태. 각각의 컴포넌트를 독립적으로 구성함에 따라 유지보수가 수월해지고 확장에도 유연해진다. 상대적으로 규모가 큰 프로젝트에 사용되며 개발속도가 느리다는 단점을 가지고 있다.

Spring MVC

Spring에서 지원하는 Web Application 개발을 위한 프레임워크다.
Front Controller 패턴 아키텍처를 사용하며 DispatcherServlet, ViewResolver와 같은 Web Application 구현에 도움이 되는 클래스, 인터페이스를 제공한다.

Front Controller 패턴 아키텍처.

SprimgMVC는 Front Controller 패턴의 아키텍처를 탑재하고 있다.
Front Controller 패턴의 아키텍처란 클라이언트와 어플리케이션 Controller가 직접 연결되는게 아닌 Front Controller가 모든 요청을 받고 해당 요청에 맞는 Controller에게 전달하여 중앙집중 분산처리가 되게 설계 되어있다.
과거에는 JAVA 만으로 구성된 Web Application은 Servlet을 통해 Front Controller를 구현했지만 Spring의 경우 기본 탑재된 DispatcherServlet을 통해 모든 요청을 받고 HandlerMapping을 통해 Controller로 분배하며 ViewResolver로 적절한 View를 선택한다.

SpringMVC의 동작 순서

  1. DispatcherServlet에서 클라이언트의 요청을 받는다.
  2. HandlerMapping에서 URL과 요청 정보를 기준으로 요청을 처리할 Controller를 찾는다.

선택된 Controller로 클라이언트의 요청을 전달한다.

  1. 요청이 처리된 결과를 View의 이름과 함께 ModelAndView객체에 담아 DispatcherServlet으로 전달한다.
  2. 데이터를 받은 DispatcherServlet은 View의 이름을 기반으로 ViewResolver를 통해 View 파일을 찾는다.
  3. 찾은 View 파일을 클라이언트에게로 보내준다.