1. MVVM-C란 무엇인가?
MVVM-C는 Model-View-ViewModel-Coordinator의 약자로, MVVM 아키텍처에 Coordinator 패턴을 추가한 구조입니다.
MVVM은 View와 ViewModel의 의존성을 줄이고, 테스트 용이성을 확보하지만, 화면 전환(네비게이션) 로직이 ViewController나 ViewModel에 섞이는 문제가 있습니다.
이를 보완하기 위해 Coordinator가 화면 전환 책임을 전담하게 됩니다.
2. 구성 요소
Model
- 앱의 핵심 데이터 구조와 비즈니스 로직을 담당합니다.
- API 호출 결과나 DB에서 가져온 데이터를 저장 및 가공합니다.
View
- 사용자에게 보여지는 화면(UI)입니다.
- ViewModel을 구독하거나 바인딩하여 상태 변화를 반영합니다.
- 비즈니스 로직을 포함하지 않으며, 단순히 보여주기 역할만 합니다.
ViewModel
- View와 Model 사이의 중간 계층입니다.
- View에서 발생하는 입력 이벤트를 처리하고, Model에서 데이터를 가져와 가공 후 View에 전달합니다.
- View와는 바인딩(Binding) 혹은 RxSwift, Combine 같은 리액티브 프레임워크를 통해 연결됩니다.
- 화면 전환 로직을 포함하지 않습니다.
Coordinator
- 화면 간의 이동, 흐름 제어를 담당하는 객체입니다.
- ViewController의 생성 및 화면 전환(push, modal, present 등)을 책임집니다.
- ViewController와 ViewModel에서 네비게이션 로직을 분리하여, 더 깔끔한 구조를 유지할 수 있습니다.
3. MVVM-C의 흐름
- 앱 시작 시 AppCoordinator가 생성되어 루트 화면을 설정합니다.
- Coordinator는 ViewController와 ViewModel을 생성하고 연결합니다.
- View는 ViewModel에 바인딩되어 데이터와 이벤트를 처리합니다.
- 화면 전환이 필요할 때, ViewModel은 Coordinator에게 요청을 전달합니다(주로 Delegate나 Closures로).
- Coordinator는 새로운 ViewController를 생성하고 네비게이션을 수행합니다.
4. MVVM-C의 장점
- 관심사 분리: 화면 전환 로직이 Coordinator로 분리되어 ViewController와 ViewModel이 단순화됩니다.
- 테스트 용이성: ViewModel은 화면 전환 로직이 없으므로 독립적으로 단위 테스트가 용이합니다.
- 유지보수성 향상: 네비게이션 구조를 한 곳에서 관리할 수 있어, 플로우 변경이 쉬워집니다.
- 재사용성: Coordinator 단위로 플로우를 재사용하거나 독립적으로 관리할 수 있습니다.
5. MVVM-C의 단점
- 구조가 복잡해짐: 소규모 프로젝트에서는 Coordinator를 추가하는 것이 과할 수 있습니다.
- 보일러플레이트 코드 증가: Coordinator를 생성하고 연결하는 코드가 많아질 수 있습니다.
- 학습 곡선: 팀원이 MVVM-C 패턴을 이해하고 적용하는데 시간이 필요합니다.
6. MVVM vs MVVM-C 비교
| 구분 | MVVM | MVVM-C |
|---|
| 화면 전환 | ViewController 또는 ViewModel에 포함 | Coordinator가 전담 |
| 관심사 분리 | UI와 비즈니스 로직 분리 | UI, 비즈니스 로직, 네비게이션까지 분리 |
| 구조 단순성 | 상대적으로 단순 | 더 많은 구성 요소 필요 |
| 유지보수성 | 중간 수준 | 높은 수준 |
7. MVVM-C 적용 예시 시나리오
- LoginCoordinator: 로그인 화면과 회원가입 화면 전환 관리
- MainCoordinator: 메인 탭 화면, 상세 화면 이동 관리
- AppCoordinator: 앱 전체의 루트 플로우 관리 (로그인 → 메인)
ViewModel은 단순히 "로그인 성공 시 다음 화면으로 이동 요청" 신호만 Coordinator에 전달합니다.
Coordinator가 이 요청을 받아 실제 네비게이션(push/present)을 수행합니다.
8. 결론
MVVM-C는 중대형 프로젝트에서 화면 전환과 플로우 관리의 복잡성을 줄이고, 테스트 용이성과 유지보수성을 높이는 아키텍처입니다.
작은 프로젝트에서는 다소 무거울 수 있지만, 화면 구조가 복잡해질수록 Coordinator의 장점이 두드러집니다.