MVC 패턴에 대해서 알아보자
MVC 패턴이란?
Model-View-Controller의 약자로 애플리케이션을 세가지 역할로 구분한 디자인 패턴이다.
이용자는 Controller로 정보를 요청하고 Model을 통해 데이터를 가져와서 그 데이터를 View에게 전달하여 이용자가 화면을 통해서 정보를 확인할 수 있다.
예전에는 View에 비즈니스 코드까지 포함하여 작업이 복잡하고 길어져 유지보수가 힘든 문제점이 있었으나 MVC 모델은 비즈니스 로직과 사용자 인터페이스를 분리함으로서 이러한 문제점을 개선하였다.
MVC Model 1,2
Model 1
최초의 MVC 디자인 패턴을 Model1이라 하는데 이는 JSP에 컨트롤러와 뷰가 모두 포함이 되어있는 것이다. 그러나 JSP를 따로 컨트롤러라 부르지 않았고 디자이너들이 작업하기에 너무 복잡하고 어려워 유지보수를 용이하게 하기 위해서 Model2가 탄생한다.
Model 2
디자이너가 디자인을 변경할 때도 복잡한 자바코드들 때문에 어려움을 느낄 수밖에 없었다. 이런 Model1 아키텍처의 문제를 해결하기 위해 고안된 웹 개발 Model2 아키텍처를 보통 사람들이 생각하는 MVC 아키텍처이다.
Model
애플리케이션의 정보, 내부 비즈니스 로직을 처리하기 위한 역할이다. 모델은 컨트롤러가 호출하면 DB와 연동하여 사용자 입출력 데이터를 다루는 일과 같은 데이터와 연관된 비즈니스 로직을 수행한다.
데이터의 조회, 저장, 삭제, 수정 등의 역할을 수행한다.
즉, 사용자가 input으로 제공하는 데이터를 모두 가지고 있어야 하며 데이터의 처리를 담당한다.
- 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
- 뷰나 컨트롤러에 대해서 어떠한 정보도 알지 말아야 한다.
- 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.
View
사용자에게 보여지는 화면의 UI를 담당한다. 모델의 데이터를 사용자에게 보여준다.
- 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
- 모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 한다.
- 변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 한다.
Controller
Model과 View 사이에서 데이터 흐름을 제어한다. 사용자가 접근한 URL에 따라 적절한 비즈니스 로직을 처리하고 결과를 Model에 저장하여 View에게 전달하는 역할을 수행한다.
- 모델이나 뷰에 대해서 알고 있어야 한다.
- 모델이나 뷰의 변경을 모니터링 해야 한다.
MVC 패턴의 장단점
장점
- 비즈니스 로직과 사용자 인터페이스 UI를 분업하여 유지보수 할 수 있다.
- 기능별로 코드를 분리하여 코드의 중복을 방지하고 가독성과 코드의 재사용성을 높인다.
단점
서로의 정보를 가지지 않는 독립적인 상태이지만 Controller를 거치기에 의존성이 완전히 분리될 수 없다.
따라서 대규모 프로젝트에서는 다수의 View와 Model이 하나의 Controller를 통해 연결되기 때문에 컨트롤러가 불필요하게 커지는 현상이 발생할 수 있다.
SpringMVC
SpringMVC는 MVC 패턴을 웹 애플리케이션 개발에 적용한 프래임워크로 일반적인 MVC 패턴과 차이가 있다. Spring이 제공하는 트랜잭션 처리, DI, AOP를 손쉽게 사용할 수 있다.
Spring MVC 구조
DispatcherServlet
Spring MVC에서 가장 중요한 요소가 모든 클라이언트의 요청을 가장 먼저 받아들이는 곳이다.
클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러를 찾아 매핑하고 Model의 정보를 받아 View에 응답을 제공한다.
HandlerMapping
클라이언트의 요청을 URL에 따라 어떤 Controller가 처리할지 결정한다.
Controller
클라이언트의 요청에 대한 비즈니스 로직을 수행하고 결과로 얻어낸 Model 정보를 DisPatcherServlet에게 전달한다.
ModelAndView
Controller가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.
ViewResolver
컨트롤러의 처리 결과로 생설할 뷰를 선택한다.
View
클라이언트의 요청 결과에 대한 UI를 제공한다.
Spring MVC 주요 특징
- POJO 기반: SpringMVC는 일반적인 자바 객체(POJO)를 사용하여 컨트롤러를 개발할 수 있도록 한다. 이로써 간편한 코드 작성과 테스트 용이성을 제공한다.
- IoC(Inversion of Control) 및 의존성 주입(Dependency Injection): Spring 프레임워크의 핵심 개념인 IoC와 의존성 주입을 통해 개발자가 객체의 생성과 관리에서 자유롭게 코드를 작성할 수 있다.
- AOP(Aspect-Oriented Programming): Spring은 AOP를 지원하여 횡단 관심사(로깅, 트랜잭션 등)를 모듈화하고 중복 코드를 최소화할 수 있다.
- 유연한 구조: SpringMVC는 다양한 뷰 렌더링 기술과 통합이 가능하며, 필요에 따라 커스텀화할 수 있는 다양한 기능을 제공합니다.
- RESTful 웹 서비스 지원: SpringMVC는 RESTful 웹 서비스를 쉽게 개발할 수 있도록 지원하며, HTTP 메서드에 따라 요청을 처리하는 데 특히 강점을 가지고 있습니다.