이번 글에서는 소프트웨어 디자인 패턴 중 하나인
MVC 패턴에 대해 기록해보려고 한다.
MVC 패턴이란
MVC는 Model-View-Controller의 약자로, 애플리케이션을 3가지 역할로 구분하는 디자인 패턴이다.
이렇게 역할을 분리하는 이유는 무엇일까? 화면과 데이터 처리를 분리해 코드 간의 종속성을 줄이고 구성 요소 간의 역할을 명확하게 함으로써 코드 분리가 쉽고 유지보수가 용이하기 때문이다.
이해하기 쉽도록 실생활로 예를 들어보자면, 하나의 회사에서 마케팅 업무를 하는 직원, 디자인 업무를 하는 직원, 개발 업무를 하는 직원, 기획 업무를 하는 직원이 모두 한 공간에서 작업을 진행한다고 생각해보자.
만약 특정 디자인에 수정이 필요할 때, 그 복잡한 환경에서 해당 디자인 업무를 담당하는 직원들을 찾아 전달하는 것은 어려울 것이다.
즉, 유지보수가 좋지 않은 환경인 것이다.
각 업무 별로 부서를 나눠 체계화하면 담당 업무를 하는 직원을 찾는 것이 용이해 질 것이고, 이것이 MVC 패턴이 탄생한 이유라고 볼 수 있다.
MVC의 각 컴포넌트의 역할
Model(모델)
데이터와 관련된 책임을 담당하는 레이어로, 내부 비즈니스 로직을 수행한다.
DB와 연동하여 데이터를 추출하거나 저장, 삭제, 변경 등의 작업을 수행한다. 특히 여러 개의 데이터 변경 작업을 하나의 작업으로 묶은 트랜잭션을 다루는 일도 한다.
Model은 다른 컴포넌트들에 대해 알지 못한다. 자기 자신이 무엇을 수행하는지만 알고 있다.
View(뷰)
사용자에게 보여질 사용자 인터페이스를 담당하는 레이어로, Controller로 부터 받은 Model의 값을 가지고 출력할 화면을 만든다.
상황과 도메인에 따라 동적으로 달라지는 값을 가져와야 하는 경우에만 Model에서 받아온다.
View는 다른 컴포넌트들에 대해 알지 못한다. 자기 자신이 무엇을 수행하는지만 알고 있다.
Controller(컨트롤러)
Model과 View를 연결해주는 레이어로, 사용자 요청을 처리할 수 있는 Model과 View를 결정한다.
Controller는 클라이언트 요청을 받으면 해당 요청을 수행할 수 있는 Model을 호출한다.
또한 클라이언트가 보낸 데이터가 있으면, Model에 전달하기 쉽도록 데이터를 가공한다.
Model이 업무 수행을 완료하면 그 결과를 가지고 화면을 생성하도록 View에 전달한다.
Controller는 다른 컴포넌트들에 대해 알고 있다. 자기 자신 외의 Model과 View가 무엇을 수행하는지 알고 있다.
사용자가 요청을 보내면, Controller는 해당 요청을 수행할 수 있는 Model을 호출해 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달한다.
MVC 규칙을 지키면서 코딩하는 방법
- 모델은 컨트롤러나 뷰에 의존하면 안된다.
- 뷰는 모델에만 의존해야 하고, 컨트롤러에는 의존하면 안된다.
- 뷰가 모델로부터 데이터를 받을 때는 사용자마다 다르게 보여주어야 하는 데이터에 한해서만 받아야 한다.
- 컨트롤러는 모델과 뷰에 의존해도 된다.
- 뷰가 모델로부터 데이터를 받을 때는 반드시 컨트롤러를 통해 받아야 한다.
MVC 패턴의 한계점
MVC 패턴의 한계점으로 이야기 되는 것들은 다음과 같다.
Model과 View의 의존성을 완전히 분리시킬 수 없다.
View는 Controller와 연결되어 화면을 구성하기 때문에 Controller는 여러 개의 View를 가질수 있게 된다.
이때 Model은 Controller를 통해서 View와 연결된다.
즉, Controller에 의해 하나의 View에 연결되는 Model도 여러개가 될 수 있다.
결국 복잡한 구조의 애플리케이션일수록 하나의 Controller에 다수의 View와 Model이 복잡하게 연결되어 서로 간의 의존성이 커지는 상황이 발생할 수 있다.
컨트롤러의 비중이 높아져 부담이 커진다면 Massive-View-Controller 현상이 발생한다.
Massice-View-Controller(대규모 MVC 애플리케이션) 현상은 MVC 패턴에서 컨트롤러의 역할이 과도하게 커지고 복잡해지는 상황ㅇ르 의미한다. 주로 대규모 애플리케이션에서 발생할 수 있으며, 하나의 Controller에도 수많은 View와 Model이 연결되어 다양한 side-effect를 불러오는 문제를 야기할 수 있다.
이러한 MVC 패턴의 문제를 해결하기 위한 대안으로 MVVM, MVP 등 다양한 패턴들이 등장했다.
Reference
'🕹️ Programming > 개발상식' 카테고리의 다른 글
MVC를 지키면서 코딩하는 방법 (0) | 2022.11.15 |
---|---|
JWT (Json Web Token) (5) | 2022.08.24 |
Cookie & Session 그리고 Cache? (0) | 2022.08.23 |
Authentication & Authorization (0) | 2022.04.04 |