2024. 4. 13. 16:36ㆍiOS Development/RxSwift
MVC 패턴과 MVVM 패턴을 비교해보고
RxSwift를 MVVM 패턴와 함께 구현하는 것이 왜 좋은지 알아 볼 수 있다.
MVC
Model, View, Controller로 구성됨
MVC 패턴에 대한 애플의 생각
- 예전 Apple “Cocoa Framework 아키텍쳐는 MVC 패턴을 기반으로 하고 있음 👌” → 그럼 MVC 패턴으로 개발해야겠군!
- 현재 Apple “MVC로 개발하는 것이 최선이 아닐 수 있음 🤦” → ? 그럼 무슨 패턴을 적용해야하지?
현실의 Cocoa MVC
UIView와 UIViewController를 완전히 분리해서 개발하기란 어려움
필연적으로 비대한 UIViewController를 만들게 되고 비즈니스 로직과 View가 혼합되기 쉬움
MVVM
Model, View, ViewModel로 구성됨
여기서 View는 UIView와 UIViewController를 포함하는 개념임
View는 각자의 ViewModel를 소유하고 바인딩된 View와 ViewModel은 데이터와 사용자 액션을 주고 받음
ViewModel은 Model을 가질 수 있고 View로부터 받은 데이터나 사용자 액션에 대해 Model을 통해 비즈니스 로직 처리가 가능하고 이를 View에 전달할 수 있음
장점
- Cocoa Framework 의존도가 낮음
- 순수한 비즈니스 로직 보존
- ViewModel은 View를 몰라도 됨
- View → ViewModel 이기 때문에 ViewModel의 재사용이 가능함
Rx와 MVVM 패턴
1. MVVM은 View → ViewModel → Model의 단방향 패턴임
- View: View의 사용자 이벤트를 ViewModel에 바인딩해주고 ViewModel에서 전달된 데이터를 어떻게 보여줄지만 정의
- 버튼탭이벤트 → 맛있는버거세트 사이에 대한 로직을 가지고 있지 않음
// ViewModel과 바인딩
버튼.rx.tap
.bind(to: viewModel.버튼탭이벤트)
.disposed(by: disposeBag)
// ViewModel 결과 표시
viewModel.맛있는버거세트
.emit(
onNext: {
print($0)
}
)
.disposed(by: disposeBag)
- ViewModel: View에서 전달받은 이벤트를 어떻게 전환하는지 나타냄
let 버튼탭이벤트 = PublishRelay<Void>()
let 맛있는버거세트 = Signal<String>
맛있는버거세트 = 버튼탭이벤트
.map { _ in
"🍔🍟🥤"
}
.asSignal(onErrorJustReturn: "")
2. Rx를 View와 ViewModel를 바인딩하는 접착제로 사용할 수 있음
View를 통해 발생하는 사용자 입력에 의해 수행되는 일련의 과정들을 Observable을 통해 구현하고 해당 View에 의해 소유된 ViewModel은 이러한 Observable을 subscribe하는 형태
ViewModel에 의한 스트림 연산은 Observable의 operator 연산을 통해 코드 양을 줄이고 가독성을 높일 수 있음
'iOS Development > RxSwift' 카테고리의 다른 글
[RxSwift] RxSwift에서는 에러 처리를 어떻게 할까? (0) | 2024.04.13 |
---|---|
[RxSwift] Cocoa Framework 판에 RxCocoa의 등장이라 (0) | 2024.04.12 |
[RxSwift] 대표적인 Operator에 대해서 알아보기 (0) | 2024.04.12 |
[RxSwift] RxSwift로 네트워크 통신 구현하기 (0) | 2024.04.12 |
[RxSwift] Observable, Trait, Subject (0) | 2024.04.12 |