[iOS] RxSwift vs Combine
이전 블로그에서 RxSwift와 Combine에 대해 각각 공부해 보다가, RxSwift와 Combine이 거의 동일한 개념이라는 생각이 들었다.
그래서 오늘은 두 기술의 차이점을 중점으로 비교해보고자 한다.
RxSwift
[iOS] RxSwift 알아보기 (1)
개발을 하다 보면 비동기 이벤트를 많이 다루게 된다. 버튼을 눌렀을 때나,api 호출을 했을 때 응답을 받아올 때 이외에도 여러 가지 기능에서 비동기 프로그래밍이 필요하다. 이 비동기 프로
yanni13.tistory.com
RxSwift에 대한 개념설명과 예시는 따로 포스팅한 적이 있기 때문에 간략하게 이번 포스팅에서는 간략하게 알아보고 넘어가도록 하겠다.
RxSwift란 비동기 프로그래밍과 이벤트 기반 프로그래밍을 쉽게 할 수 있도록 도와주는 반응형 프레임워크이다.
iOS 8+이상 버전부터 사용이 가능하며 React Native와도 같이 사용할 수 있어서 접근성이 뛰어나다.
RxSwift에서의 핵심 개념은 Observable, Observer, Disposable, Operator가 있다.
- Observable: 데이터의 변화를 감지하여 Observer에게 전달
- Observer: Observable을 구독하여 처리하는 역할
- Disposable: 구독을 해제하고 싶을 때 dispose()를 호출하여 구독을 해제
- Operator: Observable에서 감지한(=방출된) 데이터를변환하거나필터링,결합하는데 사용
Combine
Combine에 대한 블로그도 예전에 작성해 놓은 게 있지만 설명이 부실한 거 같아서 이번 블로그에 추가로 정리해보고자 한다.
Combine이란 데이터 흐름을 비동기적으로 처리하는 반응형 프레임워크이다.
Combine의 핵심 개념이라하면 Publisher, Subscriber, Operator 가 존재한다.
- Publisher : 변경된 값을 방출하여 subscriber에게 전달한다.
- Subscriber : Publisher에게 받은 값을 처리한다.
- Operator : Publisher와 Subscriber 사이에서 데이터 변환한다.
간략하게 세개의 개념을 정리해 보면 위의 그림과 같다.
Publisher와 subsrciber의 원리를 조금 더 살펴보면, subsrciber는 Publisher를 '구독'하고 있으며 Publisher는 Subsriber에게 '구독을 만들어준다'.
여기서 구독을 만들어준다는 것은 Publisher가 Subscriber와 통신할 수 있는 연결 통로를 만들어주는 과정이라고 생각하면 될 거 같다.
이렇게 연결 통로를 만들고 나면 Subscriber가 값을 요청하면 Publisher가 Subscriber에게 값을 방출해준다.
그럼 Publisher의 값이 Subscriber에게 전달되는 과정에서 operator가 데이터를 가공하고 Subscriber가 받은 값을 처리하게 되는 것이다.
이러한 패턴은 RxSwift의 Observable - Observer 관계와 상당히 유사해 보인다.
💥 @Published도 combine이었다.
SwiftUI에서 데이터의 변화를 감지하여 데이터 바인딩을 도와주는 @Published도 Combine에 속한 애였다!
SwiftUI의 내부 동작을 보면 SwiftUI는 Combine을 import 하고 있는 것을 확인할 수 있는데 이는 SwiftUI는 기본적으로 Combine에 의존적으로 설계되었다는 것을 의미한다!
이외에도 많은 모듈들을 의존하고 있다. (UIKit, CoreData... 등등)
그래서 import SwiftUI를 통해 기본적인 Combine의 기능(@Published, @ObservedObject 등...)이 자동으로 포함되어 있어서 따로 combine을 import 해주지 않아도 SwiftUI 내에서 Combine의 일부를 사용할 수 있었던 것이었다.
하지만 SwiftUI가 Combine을 의존한다 해서 모든 기능을 다 사용할 수 있는 것은 아니고, Combine에서 지원하는 모듈들(Publisher, Subscriber, sink, Just)등을 직접 사용하려면 import Combine을 해서 사용해주어야 한다.
💡 @Published을 직접 사용하는 거랑 combine을 사용하는거랑 뭐가 다를까??
@Published는 단순히 값을 방출하는 데 초점이 있지만, Combine은 데이터 흐름을 조작하거나 비동기 작업을 연결해 준다.
따라서 Combine을 사용하면 직접적으로 데이터를 조작할 수 있는 것이 가장 큰 차이점이게 되는 것이다!
RxSwift vs Combine
RxSwift와 Combine에 대해 공부하다 보면 결국 비동기를 기반으로 하는 반응형 프레임워크라는 것을 알 수 있다.
그리고 각 프레임워크의 구독-관찰하는 패턴이 유사하기 때문에 비슷한 역할을 하는데 어떤 경우에 어떤 프레임워크를 사용해야 하는지 알아보고자 한다.
차이점
1️⃣ 접근성
RxSwift는 thrid-party 프레임워크인 반면 combine은 first-party 프레임워크이다.
First-party란 하드웨어 생산자가 직접 소프트웨어를 개발하는 경우를 First-party라고 칭하며 third-party란 하드웨어 생산자와 직접적인 관계없이 소프트웨어를 개발하는 경우를 Third-party라고 한다.
즉, combine 같은 경우 Apple에서 직접 사용자에게 제공해 주는 프레임워크기 때문에 First-party에 해당되며 RxSwift 같은 경우는 cocoapods를 통해 제 3자의 외부 라이브러리를 통하는 것이기 때문에 third-party에 해당된다.
RxSwift는 third-party 프레임워크이기 때문에 Apple에 종속적이지 않으므로 크로스 플랫폼 개발이 가능하다.
반면 combine은 apple 자체에서 만들어낸 프레임워크이기 때문에 타깃이 iOS 앱 개발이 주가 아니라면 사용하기 어려울 것이다. 따라서 크로스 플랫폼을 통한 개발이면 RxSwift를 필수적으로 사용해야 한다.
Will Combine kill RxSwift?
Combine framework was presented at WWDC2019. Let’s talk about whether something changed in our lives.
medium.com
위 블로그를 참고하면 전체 시간이나 성능이 RxSwift보다 Combine이 훨씬 좋게 나타난다.
Combine은 apple에서 자체적으로 제공하는 프레임워크이기 때문에 combine이 더 시간이 적게 걸리고 메모리 효율이 좋아서 성능이 좋다고 판단된다.
combine은 iOS 13+이상을 지원하며 RxSwift는 iOS 8+이상을 지원한다.
따라서 iOS 8~13을 지원하고 있는 프로젝트라면 기존 RxSwift 코드들을 Combine으로 마이그레션하기 어려울 테니 RxSwift로 계속 사용해야 할 것이다. RxSwift가 다양한 버전을 관리하고 크로스 플랫폼에서도 사용가능하며 UIKit이랑도 잘 사용할 수 있기 때문에 접근성 측면에서 RxSwift가 우수하다고 생각한다.
(하지만 요즘 누가 iOS 8~13을 사용할까.. 싶긴 하다.)
2️⃣ 데이터 바인딩
MVVM 아키텍처에서는 데이터 바인딩이 핵심이다. RxSwift도 Rxcocoa를 통해 데이터 바인딩을 지원해주고 있지만
SwiftUI에서는 기본적으로 Combine과 통합되어 있기 때문에 @State, @Binding, @ObservedObject등을 통해서 더 간단한 방식으로 데이터 바인딩을 지원해주고 있다.
만약 프로젝트에서 SwiftUI를 사용하는 경우 불편하게 Rxswift를 사용하지 않고 Combine을 사용하는 게 성능적인 측면에서 유리할 것이고, UIKit을 사용하는 경우도 Combine을 사용할 수 있지만 UIKit은 SwiftUI처럼 데이터 바인딩을 직접적으로 지원하지 않기 때문에 뷰와 뷰모델 간의 바인딩을 직접 구현해야 한다.
따라서 이 과정을 RxSwift를 사용하고 Rxcocoa를 통해 데이터 바인딩을 이뤄주면 되기 때문에 UIKit에서는 RxSwift를 사용하는 것이 더 편리할 수 있다.
참고
https://medium.com/@M0rtyMerr/will-combine-kill-rxswift-64780a150d89