iOS/Swift

MVVM (Model-View-ViewModel)

ywangnon 2025. 12. 5. 23:34
반응형

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