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(0 |
- Reactor는 Spring 생태계에 최적화된 후발주자이며,
- 현재 Spring WebFlux를 쓴다면 Reactor가 사실상 표준
RxJava는 여전히 안드로이드나 Spring 외의 프로젝트에서 많이 사용되지만, Spring 기반 비동기 시스템에서는 Reactor를 쓰는 것이 자연스럽다.
'【 개발 이야기 】' 카테고리의 다른 글
Connection Timeout, Socket Timeout, Read Timeout의 차이점은 무엇인가요? (1) | 2025.08.01 |
---|---|
스프링 생명주기와 @Bean (4) | 2025.07.30 |
HTTP method (6) | 2025.07.21 |
WebClient.builder() VS WebClient.create() (2) | 2025.07.18 |
Filter의 Flux<DataBuffer>에 대해 알아보자 (0) | 2025.07.14 |