DailyCode
RxSwift 기본 개념 본문
ReactiveX (Rx)는 Observer 패턴, Iterator 패턴, 그리고 함수형 프로그래밍의 개념을 결합한 프로그래밍 패러다임으로, Swift 언어로 구현된 버전이 RxSwift이다.
이를 통해 개발자는 "어떻게"가 아닌 "무엇을" 하는지에 집중할 수 있게 되고, 결과적으로 코드가 간결하고 이해하기 쉬워지는 특징이 있다.
RxSwift는 Observable 시퀀스를 구독하는 Observer를 통해 동작을 정의하며, 비동기 동작을 추상화하여 쉽게 컴포즈 가능한 연산으로 만든다.
⏰ Observable
Observable은 시간에 따라 변하는 데이터의 시퀀스를 나타낸다. 이 시퀀스는 세 가지 타입의 이벤트를 방출할 수 있다.
- Next 이벤트: Observable이 새로운 데이터를 생성하였음을 알리는 이벤트. Observable은 시간에 따라 여러 번의 Next 이벤트를 방출할 수 있으며, 이 이벤트는 구독자에게 새로운 데이터를 전달하는 주요 수단이다.
- Error 이벤트: Observable이 어떠한 오류를 만났을 때 방출되는 이벤트. 오류 이벤트가 발생하면, Observable의 수명 주기가 종료되고 더 이상 이벤트를 방출하지 않는다.
- Completed 이벤트: Observable이 모든 데이터의 방출을 완료했음을 알리는 이벤트. Completed 이벤트가 발생하면, Observable의 수명 주기가 종료되고 더 이상 어떠한 이벤트도 방출하지 않는다.
⚠️ Error와 Completed 이벤트를 Observable에서 수신하게 되면, 해당 Observable 스트림은 더 이상 이벤트를 처리할 수 없게 되며, 스트림을 이어서 작업이 필요한 경우 별도의 후처리가 필요하다.
👀 Observer
Observer는 Observable을 구독하고 이벤트를 수신하는 역할을 한다. Observer는 Observable에서 전달되는 이벤트를 처리하고 반응한다. RxSwift에서는 이를 통해 비동기 작업에 대한 처리를 정의하게 된다.
Observer는 일반적으로 Observable의 subscribe
메소드를 호출하여 생성된다. subscribe
메소드는 클로저를 통해 이벤트를 처리하는 방식을 정의하며, 이 클로저 안에서는 onNext
, onError
, onCompleted
등의 이벤트에 대한 처리를 정의할 수 있다.
Observer 예제
let observable = Observable.from([1, 2, 3, 4, 5])
let observer = observable.subscribe { event in
switch event {
case .next(let value):
print("Next value: \(value)")
case .error(let error):
print("Error: \(error)")
case .completed:
print("Completed")
}
}
해당 예제는 [1,2,3,4,5] 배열을 이용한 Observable을 생성하고, 이 Observable을 구독하는 Observer를 생성했다.
Observer는 각각의 이벤트가 발생할 때 마다, 작업을 수행하며 해당 이벤트는 1,2,3,4,5를 전부 방출한 후에 completed되는 예제이다.
Next value: 1
Next value: 2
Next value: 3
Next value: 4
Next value: 5
Completed
🗑️ Disposable
RxSwift는 메모리 누수를 방지하기 위해 DisposeBag을 제공한다. Observer가 Observable을 구독하게 되면, DisposeBag을 통해 관리할 수 있다. DisposeBag이 deallocate되면 그 안의 모든 구독이 자동으로 해제되며 메모리에서 제거된다.
🛠️ 주요 구성요소
RxSwift의 주요 구성요소로는 Observable
, Observer
, Operator
, Scheduler
, Subject
, Disposable
등이 있다. 이들 각각은 비동기 동작을 구성하고 제어하는 데 필요한 역할을 한다.
주요 구성요소를 한줄로 요약하면 다음과 같다.
- Observable: 데이터 시퀀스를 생성하는 역할을 한다.
- Observer: Observable이 생성한 데이터 시퀀스를 구독하고 처리하는 역할을 한다.
- Operator: Observable 시퀀스에 적용되는 함수. 데이터 시퀀스를 필터링하거나 변환하는 등의 작업을 한다.
- Scheduler: 비동기 동작이 어떤 스레드에서 수행될지 결정하는 역할을 한다.
- Subject: Observable과 Observer의 역할을 동시에 수행할 수 있는 특별한 형태의 Observable.
- Disposable: Observable 구독을 해제하는 역할을 한다. DisposeBag을 통해 관리된다.
💡 RxSwift의 이점
RxSwift를 사용하면 다음과 같은 이점이 있다.
- 비동기 프로그래밍의 단순화: RxSwift는 비동기 동작을 간결하게 표현할 수 있게 돕는다.
- 선언적 프로그래밍: "어떻게"가 아닌 "무엇을" 하는지에 집중할 수 있게 하여 코드를 더욱 선언적으로 작성하게 한다.
- 디자인 패턴과의 호환성: RxSwift는 MVC, MVVM, MVP 등 다양한 디자인 패턴과 함께 사용할 수 있다.
- Observer Pattern 구현의 용이성: 옵저버 패턴을 UIKit을 이용하여 구현하면, 가독성이 떨어지고 객체에 대한 의존성이 높다. Rx를 이용하면 해당 부분을 해결할 수 있다.
- MVVM 패턴과의 시너지: MVVM패턴은 View와 ViewModel 간에 데이터 바인딩에 의존하는데, 바인딩을 수행하는 방법 중 하나는 Observable과 Observer 개념을 사용하는 것이며 이를 RxSwift를 이용하면 쉽게 구현할 수 있다.
🏁 결론
RxSwift는 Reactive Programming 패러다임을 Swift에 도입하여 비동기 프로그래밍을 단순화하고 코드의 가독성을 향상시키는 라이브러리이다. RxSwift를 이해하고 활용하면 iOS 앱 개발에서 복잡한 비동기 동작을 쉽게 관리할 수 있게 된다.
🤔 사견
Combine은 출시된지 얼마 되지 않아 하위 버전에서 안정성이 떨어지고, 또한 SwiftUI에 종속되어 있다는 느낌이 강하게 드는 프레임워크로 생각한다. 추후에 SwiftUI가 대세가 된다면 Combine으로 넘어가겠지만 아직은 Rx가 더 좋다고 생각한다.