개발콩블로그

[RxSwift] RxSwift의 시작 Observable & Observer 본문

RxSwift

[RxSwift] RxSwift의 시작 Observable & Observer

devBean 2025. 2. 24. 23:49

안녕하세요 개발콩입니다.

오늘은 RxSwift의 시작인 Observable과 Observer에 대해서 소개하고자 합니다.

 

 

ReactiveX

Observable streams을 활용하는 비동기 프로그래밍을 위한 API

 

 

우리가 작성한 코드가 1부터 1000까지 진행된다고 가정했을 때,

대부분의 코드는 1부터 1000까지 순서대로 동작하지 않습니다.

 

예를들어 특정 상황에서 버튼이 클릭되었다면? 검색어가 입력되었다면?

이런 경우에는 미리 작성해둔 특정한 코드 구간이 실행될 것입니다.

 

우리는 이러한 상황을 처리하기 위해서 아래 4가지 방법을 이용해왔습니다.

  • Closure
  • GCD(Grand Central Dispatch)
  • Delegate
  • Notification Center

이러한 방법을 조금 더 쉽고 편리하게 제공하는 것이 RxSwift입니다.

 

 

 

Observable Stream

ReactiveX의 소개말에서는 with observable streams이라는 말이 있습니다.

이것은 시간이 흘러가면서 변화가 발생한 일련의 과정들을 이야기 합니다.

데이터 흐름을 말합니다.

 

let result = array
    .filter { $0 % 2 == 0 }
    .map { $0 * 2 }
    .map { $0 + 1 }
signInButton // UIButton
    .rx // Reactive<UIButton>
    .tap // ControlEvent<Void>

 

위의 코드는 함수형 프로그래밍으로 각각의 메서드가 실행될 때마다 데이터가 변화합니다.

이러한 것처럼 RxSwift 또한, 데이터의 흐름에 따라 변화하는 것이 핵심입니다.

 

 

 

Observable

사전적 의미 그대로 '관찰이 가능한' 이라는 표현처럼 Observable은 이벤트를 방출합니다.

Observable은 이벤트를 방출'만' 합니다.

  • 버튼이 클릭되었습니다! (방출)
  • 셀이 클릭되었습니다! (방출)
  • 검색어가 변경되었습니다! (방출)

 

Observer

사전적 의미 그대로 '관찰자'라는 표현처럼 Observer는 이벤트를 받아서 처리합니다.

즉, Observer는 Observable을 구독하고 이벤트가 방출되었을 때 해당 이벤트를 처리합니다.

 

 

 

예시코드와 함께 보시죠.

Observable.just("안녕하세요. 개발콩 화이팅")
    .subscribe(with: self) { owner, value in
        print("JUST \(value)")
    } onError: { owner, error in
        print("JUST onError")
    } onCompleted: { _ in
        print("JUST onCompleted")
    } onDisposed: { _ in
        print("JUST onDisposed")
    }
    .disposed(by: disposeBag)
// JUST 안녕하세요. 개발콩 화이팅
// JUST onCompleted
// JUST onDisposed

 

Observable은 "안녕하세요. 개발콩 화이팅"을 방출하고 있습니다.

그리고 .subcribe 메서드를 통해 해당 이벤트가 방출되었을 때 해당 값을 처리하고 있습니다.

 

여기서 observer가 없는데 어떻게 값을 관찰할 수 있었을까요?

해당 메서드 내부에서 observer를 생성하여 값을 관찰할 수 있게 합니다.

 

 

 

 

마무리 하며

  • Observable은 이벤트를 방출하는 역할을 합니다.
  • Observer는 이벤트를 구독하고 처리하는 역할을 합니다.

이러한 흐름의 과정에서 데이터의 흐름을 변화하고 우리가 사용하기 쉬운 값으로 사용할 수 있습니다.