현재 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
참고 및 출처:
'iOS Dev > Architecture' 카테고리의 다른 글
iOS MVC 패턴 ( MVC Pattern ) (0) | 2020.06.30 |
---|