반응형
MVC에서 이어서 말하자면 MVC로 작성하다보면 ViewController가 굉장히 커집니다.
🔁 해결 방향 – ViewModel의 등장
이 문제를 해결하기 위해 등장한 게 바로 MVVM입니다.
핵심은 단순합니다:
“Controller(UI)는 단순히 보여주기만 하고,
모든 데이터/로직은 ViewModel이 관리하자.”
즉, ViewController의 역할을 최대한 줄이자는 겁니다.
🧠 MVVM 구조 핵심
- Model: 데이터
- View: UI
- ViewModel: View가 표시할 데이터를 가공하고, 이벤트를 처리
UI와 ViewModel은 바인딩(binding) 으로 연결됩니다.
즉, ViewModel 값이 바뀌면 UI가 자동으로 업데이트됩니다.
구분MVCMVVM
| 핵심 역할 | Controller가 모든 걸 담당 | ViewModel이 데이터 가공 담당 |
| 의존 방향 | View ↔ Controller ↔ Model | View ↔ ViewModel ↔ Model |
| UI 업데이트 | 수동으로 updateUI() 호출 | 바인딩으로 자동 반영 |
| 테스트 용이성 | 어려움 | ViewModel만 테스트 가능 |
| 주요 도구 | UIKit, delegate | Combine, RxSwift 등 |
🧩 예시: 카운터 앱에서의 변화
MVC
@objc func increase() {
count += 1 label.text = "\(count)"
}
MVVM
viewModel.$countText
.assign(to: \.text, on: label)
.store(in: &cancellables)
👉 count 값이 바뀌면 label이 자동으로 업데이트됩니다.
이게 바로 “ViewController의 부담을 줄이는” 구조입니다.
기존의 ViewController에 다 작성하는 방식에서 ViewModel로 로직을 구현하고 Controller에서 연결하는 방식으로 작성됩니다.
하지만 MVVM도 문제가 생기는데요. MVC와 같이 Massive ViewModel이 되어버린다는 겁니다. 결국 MVC의 Controller 의 역할을 ViewModel이 대부분 가져가면서 똑같은 문제가 발생하게 됩니다.
MVC → MVVM으로 바뀐 이유
| 1️⃣ Massive ViewController | 화면 하나에 모든 로직이 몰림 |
| 2️⃣ 테스트 어려움 | UI와 비즈니스 로직이 결합 |
| 3️⃣ 데이터 반응형 업데이트 필요 | RxSwift / Combine 등 리액티브 도입 |
| 4️⃣ 역할 분리 | View는 UI, ViewModel은 데이터 로직 담당 |
반응형
'iOS > Swift' 카테고리의 다른 글
| RIBs (0) | 2025.12.11 |
|---|---|
| VIPER (0) | 2025.12.06 |
| MVC (Model - View - Controller) (0) | 2025.12.04 |
| iOS에서 UI 변경이 바로 적용되지 않는 이유 (0) | 2025.05.09 |
| ViewModel의 위치? View vs ViewController (0) | 2025.05.07 |