[RxSwift] Observable
안녕하세요, iOS 개발하는 루피입니다.
오늘은 ReactiveX Observable 문서를 바탕으로 공부한 내용을 공유 해보려고 합니다. 다행히도 설명이 쉽고 친절해서 글이 생각보다 잘 읽히더라고요!!. 다행이지 말입니다. 암튼 지금부터 시작해보도록 하겠습니다!!! 공식문서 바로가기!!!
Observable이란?
ReactiveX에서 가장 중요한 개념 중 하나는 바로 Observable과 Observer입니다. 간단히 말해서, Observer는 Observable이 발행하는 데이터 또는 이벤트를 구독해서 처리하는 주체입니다. Observable이 하나 또는 여러 항목을 발행하면 Observer는 이를 보고 반응합니다. 이렇게 동작하기 때문에 비동시성 작업을 효율적으로 처리할 수 있습니다. Observable은 항목이 발행될 때까지 기다릴 필요가 없습니다. 항목이 발행되는 순간 옵저버가 감지하고 처리하면 되니까요! 그래서 "Observable을 구독한다"는 표현이 맞는 겁니다.

배경 지식
대부분의 개발자는 코드를 작성할 때 코드를 한 줄씩 순차적으로 실행하고, 결과가 나올 때까지 기다리는 동기 방식에 익숙합니다. 하지만 RxSwift는 이런 동작 방식과 다릅니다. 리액티브 프로그래밍에서는 Observable이 데이터를 발행하고, Observer는 그 발행되는 데이터를 실시간으로 관찰하여 반응합니다. 그러면, 어떤 장점이 있을까요?…..??? …?…..? 바로 병렬 처리입니다!
여러 작업이 동시에 진행되고, 작업의 결과를 기다리지 않고도 다음 코드를 실행할 수 있기 때문에 효율적인 비동기 처리를 할 수 있습니다.
- Observable: 데이터를 발행하는 주체입니다.
- Observer: Observable을 구독하고 발행되는 데이터를 받아 처리하는 주체입니다.
Observer는 "구독자", "관찰자", 혹은 "리액터"로 불리기도 하는데요, 중요한 건 결국 리액터 패턴 기반의 구조라는 점입니다.
Observer 생성: 일반적인 방식 vs RxSwift
- 일반적인 동기적 메서드 호출 방식
일반적으로 코드를 작성할 때 메서드를 호출하고 그 결과를 받아 필요한 작업을 수행합니다. !!!
// 메서드를 호출하고 결과를 result에 저장
let result = someMethod(parameters)
// 결과를 가지고 필요한 작업 진행
print(result)
이런 방식의 문제점은 메서드가 완료될 때까지 기다려야 한다는 것입니다.
- RxSwift로 비동기 처리하기
하지만 RxSwift에서는 Observable과 Observer를 활용하여 보다 효율적으로 비동기 작업을 처리할 수 있습니다. 방식은…?
- Observable 생성: 데이터를 발행하는 역할을 하는 Observable을 만듭니다.
- Observer 정의: Observable이 발행하는 데이터를 처리하는 Observer를 정의합니다.
- 구독: Observer를 Observable에 구독시켜, Observable이 데이터를 발행할 때마다 Observer가 반응하도록 합니다.
다음 RxSwift 로 코드를 짜보도록 하겠습니다!
import RxSwift
// DisposeBag 생성 (구독 해지를 위한 용도)
let disposeBag = DisposeBag()
// 1. Observable 생성
let observable = Observable.of("김", "루", "피")
// 2. Observer 정의 및 구독
observable.subscribe(onNext: { element in
print("Received element: \\(element)")
}, onError: { error in
print("Error occurred: \\(error)")
},onCompleted: {
print("Observable completed")
})
.disposed(by: disposeBag)
이 코드에서 Observable은 "김", "루", "피"라는 문자열을 발행하며, Observer는 onNext, onCompleted, onError를 통해 발행된 이벤트에 반응합니다.
- onNext: Observable이 항목을 발행할 때마다 호출됩니다.
- onCompleted: Observable이 더 이상 발행할 항목이 없을 때 호출됩니다.
- onError: Observable에서 에러가 발생할 때 호출됩니다.
뜨거운 . 차가운 Observable
Observable에는 두 가지 종류가 있습니다.
바로 뜨거운 Observable과 차가운 Observable입니다. 이 둘의 차이는 언제 데이터를 발행하는지에 있습니다.
- 뜨거운 Observable
- 즉시 발행: 뜨거운 Observable은 생성되자마자 데이터를 발행합니다.
- 데이터 누락 가능성: 옵저버가 중간부터 구독하면 그 이전에 발행된 데이터는 받을 수 없습니다.
마치 라이브 스트리밍처럼, 방송이 이미 시작된 후에 접속한 시청자는 앞부분을 놓치게 되는 것과 같죠.
- 차가운 Observable
- 구독 시 발행: 차가운 Observable은 옵저버가 구독할 때까지 데이터를 발행하지 않습니다.
- 모든 데이터 수신: 따라서 옵저버는 Observable이 발행하는 모든 데이터를 처음부터 끝까지 받을 수 있습니다.
이는 VOD 서비스와 유사합니다. 언제든 처음부터 데이터를 볼 수 있죠.
- 연결 가능한(Connectable) Observable
Connectable Observable은 조금 독특한데요. 구독이 이루어지더라도 connect() 메서드가 호출될 때까지 데이터를 발행하지 않습니다. 이를 통해 모든 구독자들이 동일한 시점부터 데이터 수신을 시작할 수 있습니다.
이렇게 오늘 ReactiveX에서 Observable 문서를 살펴봤는데요. 부족한 부분이나 잘못 알고 있는 부분이 있을 수 있으니 언제든지 피드백 주세요! 감사합니다!
ReactiveX - Observable
Observable ReactiveX에서 옵저버는 Observable을 구독한다. Obseravable이 배출하는 하나 또는 연속된 항목에 옵저버는 반응한다. 이러한 패턴은 동시성 연산을 가능하게 한다. 그 이유는 Observable이 객체를
reactivex.io