RxSwift vs Combine - 반응형 프로그래밍

iosRxSwiftCombine
avatar
2025.03.18
·
6 min read

반응형 프로그래밍(Reactive Programming)은 비동기 데이터 흐름을 처리하는 방식으로, 이벤트 기반으로 동작하는 프로그래밍 패러다임이다. UI 이벤트, 네트워크 응답, 사용자 입력 등의 변화를 효과적으로 처리할 수 있어 코드의 가독성과 유지보수성이 향상된다.

그렇다면 RxSwift와 Combine는 어떤 차이가 있을까?

RxSwift vs Combine

RxSwift

Combine

출시

2015년

2019년 (iOS 13)

개발사

오픈소스 (RxCommunity)

Apple

지원 환경

iOS 9+, macOS, tvOS, watchOS

iOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+

API 스타일

함수형, 선언적 프로그래밍

Swift 표준 API와의 자연스러운 통합

RxSwift는 오랜 기간 동안 커뮤니티에서 발전해 왔으며, RxCocoa와 함께 UIKit과의 강력한 바인딩을 제공한다. 반면 Combine은 Apple이 직접 개발한 공식 프레임워크로, 최신 iOS 시스템과의 최적화가 장점이다.

기능 비교

API 네이밍 차이

RxSwift와 Combine은 네이밍 방식에서부터 차이를 보인다. RxSwift는 Observable, Observer 등의 네이밍을 사용하며, Combine은 Publisher, Subscriber 등의 네이밍을 사용한다.

RxSwift

Combine

데이터 스트림

Observable<T>

Publisher<T, Failure>

데이터 소비자

Observer<T>

Subscriber<T>

구독 (Subscription)

subscribe()

sink(receiveValue:)

데이터 변환 연산자

map(), faltMap()

map(), faltMap()

RxSwift는 ReactiveX 패턴을 따르며, Combine은 Swift 표준 문법과 더 자연스럽게 통합된다.

Subject 비교

Subjects는 스트림을 생성하고 여러 곳에서 값을 방출할 수 있는 역할을 한다. RxSwift와 Combine은 유사한 Subject 개념을 제공하지만, 일부 차이가 있다.

RxSwift

Combine

Passthrough (단순한 값 전달)

PublishSubject

PassthroughSubject

Behavior (마지막 값 저장 후 방출)

BehaviorSubject

CurrentValueSubject

Replay (지정된 개수만큼 과거 값 저장 후 방출)

ReplaySubject

지원 없음

CurrentValueSubject는 단 하나의 최신 값만 저장하기 때문에 ReplaySubject처럼 여러 개의 과거 값을 저장하는 기능을 제공하지 않는다. 따라서 동일한 기능을 구현하려면 별도의 데이터 저장 로직(예를 들면, 배열 + Custom Publisher)이 필요하다.

메모리 관리

RxSwift와 Combine은 다른 방식으로 메모리를 관리한다.

RxSwift

Combine

구독 해제 방식

DisposeBag

AnyCancellable

수동 관리 필요 여부

필요 (dispose() 호출)

필요 없음 (자동 해제)

Combine의 AnyCancellablestore(in:)을 사용하면 자동으로 메모리를 해제하지만, 변수로 직접 저장하면 수동으로 관리해야 한다. RxSwift의 DisposeBag도 소유 객체가 해제될 때 함께 해제되므로 항상 dispose()를 수동 호출할 필요는 없다.

스케줄러 비교

RxSwift와 Combine 모두 비동기 작업을 처리하는 스케줄러 기능을 제공하지만, 네이밍이 다르다.

RxSwift

Combine

스레드 지정 (데이터 생성 위치 설정)

subscribeOn()

subscribe(on:)

스레드 지정 (데이터 소비 위치 설정)

ObserveOn()

receive(on:)

Combine은 Apple 공식 프레임워크로서 Siwft 기본 문법과 더 자연스럽게 통합되며, RxSwift는 더 다양한 연산자와 Subject를 제공하여 강력한 제어가 가능하다.

UI 바인딩

RxSwift와 Combine 모두 UI 요소와 데이터 스트림을 연결하는 기능을 제공하지만, RxSwift는 RxCocoa를 통해 보다 강력한 바인딩을 지원한다.

RxSwift

Combine

UIKit 바인딩 지원

지원함 (RxCocoa 라이브러리 제공)

지원 안 함 (직접 구현 필요)

SwiftUI 지원

지원 안 함

지원함 (@Published,ObservableObject)

RxSwift는 RxCocoa를 통해 UIKit 바인딩이 쉽고 강력한 기능을 제공한다. 반면, Combine은 SwiftUI 자연스럽게 통합되지만 UIKit 바인딩은 직접 구현해야 한다.







- 컬렉션 아티클