우선 MVC란
Model-View-Controller로 연결된 관계이며
MVC 패턴에서 가장 큰 핵심은 Controller가 Model과 View를 전체적으로 조작한다는 것이다.

위 그림처럼 동작하고 있다. 한 번 자세하게 들어가보자.
- Model - 애플리케이션 정보 및 데이터를 담당하며, Controller에게 받은 데이터를 조작한다.
- 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
- View, Controller에 대해 어떤 정보도 알지 말아야 한다.
- 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야 한다.
-
View - 입력값이나 체크박스같이 UI를 나타냄. Controller에게 받은 Model 데이터를 사용자에게 보여주는 역할
- Model이 가지고 있는 정보를 따로 저장해서는 안됨
- Model이나 Controller를 알고 있을 필요가 없음
- 변경이 일어나면 변경 통지에 대한 처리 방법을 구현해야 함
-
Controller - Model, View 사이 데이터 흐름을 제어함. Model, View 역할을 분리하는데 중요한 요소 (사실상 MVC패턴의 핵심이라고 봐도 무방하다)
- Model이나 View에 대해 알고 있어야 한다.
- Model이나 View의 변경을 모니터링 해야 한다.
문득 Model, View가 Controller에게 값을 전달하는 양방향이 아닌 Controller가 View, Model에게 값을 전달하는 단방향 형태다 보니 의문이 들 수 있을 것이다.
그러면 Model, View에서 변경된 값은 Controller가 어떤 식으로 알 수 있을까?
-
Model의 경우
- KVO(Key-Value Observing)를 생성해서 Controller에게 알림(Notification)을 준다.
- 이때 특정 키 값의 변화를 감지하고 Controller에게 알림을 준다.
-
View의 경우
- View에서 발생할 수 있는 action에 대해 Controller에 target을 생성해서 delegate, datasource를 통해 위임한다.
Notification의 변화
- UIKit: KVO를 활용해서 알림을 줬다.
- SwiftUI: @State, @Published, @ObservedObject, @StateObject를 활용해서 DataBinding을 하고 있다. (MVVM에서 활용하는 Notification 기법)
이렇게 대부분 Controller에게 의존하고 있는데 이때 MVC장점이 뭔지 생각을 해보자.
- Model, View, Controller를 분리하고 각자의 역할에 집중하고 있어 유지보수, 애플리케이션 확장, 유연성 증가 (서로간의 결합도가 낮아진다)가 있다.
하지만 단점도 있으니 현재 잘 사용하지 않는데 어떠한 단점이 있는지 알아보자.
MVC 단점
- 위에서 설명했지만 Controller의 비중이 매우 높으며 대규모 애플리케이션에서는 하나의 Controller로 수많은 Model, View를 조작하게 되는데 이러다 보면 Massive-View-Controller 현상이 발생할 수 있다.
Massive-View-Controller란?
MVC패턴에서 Controller 역할이 과도하게 커지고 복잡해지는 상황. 대규모 애플리케이션에서 발생활 확률이 높으며, 코드 비대화, 재사용성 및 확장성 저하, 유지보수 하락 등의 문제를 야기하고 있다.
이러한 Massive-View-Controller의 문제를 Infoq MVC pattern에서 잘 설명하고 있다.

이러한 현상이 Massive-View-Controller라고 생각하면 될 것 같다.
참고자료 출처
Iango
mdn web docs
제리의 MVC 패턴
큰돌님 글