[RxJava] Observable<T>와 MaybeSource<T>

Observable<T>와 MaybeSource<T>는 RxJava에서 사용되는 비동기 스트림 타입이다.

 

1. Observable<T> (from io.reactivex.rxjava3.core.Observable)

  • 정의: 0개 이상의 데이터를 순차적으로 발행하는 push 기반의 스트림 타입이다.
  • 특징
    • 다수의 아이템을 발행할 수 있다 (0개 ~ 무한 개).
    • onNext가 여러 번 호출될 수 있다.
    • 끝났음을 알릴 땐 onComplete() 호출.
    • 에러가 발생하면 onError()를 호출하며 스트림 종료.

2. MaybeSource<T> (from io.reactivex.rxjava3.core.MaybeSource)

  • 정의: 0개 또는 1개의 값만 발행할 수 있는 타입.
  • 특징
    • onSuccess(T) → 1개의 아이템을 정상적으로 발행.
    • onComplete() → 아무 것도 발행하지 않고 정상 종료.
    • onError(Throwable) → 에러 발생.

  Observable  MaybeSource
발행 개수 0개 이상 0 또는 1개
사용 용도 연속적인 데이터 (예: 이벤트 스트림) 단일 결과 (예: DB 조회, 네트워크 응답 등)
콜백 onNext, onError, onComplete onSuccess, onError, onComplete
스트림 종료 수동으로 onComplete() onSuccess() 또는 onComplete() 중 하나 호출 후 종료

Observable

Observable.just("A", "B", "C")
// emits: A -> B -> C -> complete

Maybe

Maybe.just("A")
// emits: A -> complete

Maybe.empty()
// emits: complete

awaitFirst() vs awaitSingle()과의 관계

  • awaitFirst()는 Observable 혹은 Flowable에서 첫 번째 요소만 받는다.
  • awaitSingle()는 Maybe 또는 Single에서 정확히 1개를 기대할 때 사용한다. 없거나 2개 이상이면 예외 발생.

 

  • Observable<T>: 다수 이벤트를 처리하는 스트림에 적합.
  • MaybeSource<T>: 1개 또는 없음이 명확한 작업 (예: DB 단건 조회)에 적합.

4. RxJava 와 Reactor의 관계

  RxJava  Reactor
개발사 Netflix → 이후 유지보수 커뮤니티 (RxJava 2/3) Pivotal (Spring 팀)
주요 버전 RxJava 2, RxJava 3 Reactor 3.x
핵심 타입 Observable, Flowable, Single, Maybe, Completable Flux, Mono
Spring 연동성 Spring과 별개, 수동 연동 Spring WebFlux의 공식 리액티브 엔진
표준 연동성 Reactive Streams 준수 (인터페이스 기반) Reactive Streams + 추가 최적화
추상화 수준 더 다양한 추상 타입 제공 Flux(0N), Mono(01)로 단순화됨

 

  • Reactor는 Spring 생태계에 최적화된 후발주자이며,
  • 현재 Spring WebFlux를 쓴다면 Reactor가 사실상 표준

RxJava는 여전히 안드로이드나 Spring 외의 프로젝트에서 많이 사용되지만, Spring 기반 비동기 시스템에서는 Reactor를 쓰는 것이 자연스럽다.