현재 MVVM + HelperClass 로 구현된 프로젝트를 RxSwift 로 리팩토링하는 작업을 진행하고 있는데,
작업에 참고할 best practices 를 찾는 과정에서 서로 다른 구현 방식들을 보게 되었습니다.
이를 통해 MVVM 은 적은 코드로 각 컴포넌트들을 쉽게 분리할 수 있다는 장점이 있지만
개발자의 관점에 따라서 구현에 차이점이 있다는 것을 알게 되었습니다.
( 특히 MVVM은 마이크로소프트에서 특정 플랫폼에서 사용되도록 고안된 디자인 패턴으로,
각자 iOS 프레임워크 환경에 맞게 적용하는 단계에서 차이가 발생했다고 생각했습니다. )
이번 게시글에서는 iOS 에서 각 회사, 단체에서 어떻게 MVVM 구현하였는지 정리하고자 합니다.
데이터 바인딩 종류
1. RxSwift 를 이용한 바인딩
View ( ViewController )
ViewModel
Input / Output 방식
- AnyObservable / Observable
- Observable / Observable
- Observable / Driver
- Driver / Driver ... 등등
* 필자가 사용 중인 구성
Input / Output
- Signal / Driver or Signal
Relay 를 사용하여 스트림이 끊기지 않도록 하였고,
RxSwift 모델 방식에 따라 Output 스트림을 구분지었습니다.
- Event ( 알림 창, 화면 전환 ) -> Signal
- State ( UI 상태 값 ) -> Driver
참고: https://github.com/ReactiveX/RxSwift/pull/1769#issuecomment-429733057
장점: 비동기 처리를 간단하게 작업할 수 있고, 통일된 방식으로 UI 바인딩과 이벤트에도 사용할 수 있습니다.
단점: RX 러닝 커브가 높습니다. 또한 어디까지 RX 로 작업할지 팀 내에서 협의가 필요합니다. ( ViewLifeCycle, Delegate, Coordinator... 등등 )
2. Helper Class 를 이용한 바인딩
View ( ViewController )
ViewModel
Input / Output 방식
- Method / Closure
장점: 간단한 헬퍼 클래스 구현으로 쉽게 바인딩 할 수 있습니다.
단점: 여러개의 연속적인 네트워크 호출이 발생할 경우 클로저 depth 가 깊어지는 문제가 있습니다.
( 다른 비동기 라이브러리로 해결 가능합니다. promise, combine, rx .... )
3. 그외 방식
- Combine
- Reactive Swift
- Notification Center
- Observer Pattern ... 등등
MVVM Data 바인딩 방법에 대해 기술한 게시글
참고: https://medium.com/flawless-app-stories/data-binding-in-mvvm-on-ios-714eb15e3913
Input & Output 구현 방식
1. input, ouput 을 Protocol 로 정의한 형태 ( POP )
출처: kickstarter
예시는 Helper Class 를 이용하여 바인딩 하였음
프로토콜로 Input 과 Output 을 정의하고, ViewModelType 을 통해 의존성 역전을 가능하게 하는 구성입니다.
( 의존성 역전에 대해서는 필자가 더 학습이 필요합니다. )
테스트 코드와 VC 에서 뷰 모델 주입시 모두 ViewModelType 프로토콜을 주입하는 것이 특징입니다.
2. input, ouput 을 Nested Struct 로 정의한 형태
예시는 RxSwift 를 이용하여 바인딩 하였음
Nested Struct 로 Input 과 Output 을 정의하는 방식입니다. 가장 적은 코드로 쉽게 분리할 수 있다는 것이
장점이고 개인적으로 프로토콜 방식보다 코드 가독성이 좋다고 생각했습니다.
추가로 고려하면 좋을 점들
MVVM 각 컴포넌트의 역할 및 적용 방식
곰튀김님 : "도대체 어떻게 하는 것이 MVVM 인것이냐? 오늘 결론 내립니다."
https://www.youtube.com/watch?v=M58LqynqQHc&t=1283s
참고 및 출처:
The Model-View-ViewModel Pattern - Xamarin
This chapter explains how the eShopOnContainers mobile app uses the MVVM pattern to cleanly separate the business and presentation logic of the app from its user interface.
docs.microsoft.com
GitHub - kickstarter/ios-oss: Kickstarter for iOS. Bring new ideas to life, anywhere.
Kickstarter for iOS. Bring new ideas to life, anywhere. - GitHub - kickstarter/ios-oss: Kickstarter for iOS. Bring new ideas to life, anywhere.
github.com
Data Binding in MVVM on iOS
You’ve come to realize your View Controller in your new project has become very huge…
medium.com
'iOS Dev > Architecture' 카테고리의 다른 글
iOS MVC 패턴 ( MVC Pattern ) (0) | 2020.06.30 |
---|