본문 바로가기

RxJava

[RxJava] Single vs Maybe vs Completable

안녕하세요. 메로나입니다.

 

오늘은 Single과 Maybe와 Completable 3가지를 공부해보려고 합니다.

 

많은 내용이 들어 있지만, 실습도 해보면서 공부해 보겠습니다.

 

Single 키워드는 무엇인가?
  • 데이터를 1건만 통지하거나 에러를 통지합니다.
  • 완료 통지는 별도로 하지 않습니다.
  • 데이터 개수는 따로 요청할 필요가 없습니다. (only 1개)
  • onNext(), onComplete()가 없으며, onSuccess() 함수를 제공합니다.
  • 대표적 소비자는 SingleObserver입니다.
  • 예시 중 클라이언트의 요청에 대응하는 서버의 응답이 Single을 사용하기 좋은 대표적인 예입니다.
public static void main(String[] args) throws Exception {
        Single<String> single = Single.create(new SingleOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull SingleEmitter<String> emitter) throws Throwable {
                1. 데이터 출력
                emitter.onSuccess("Hello Single");
                2. 에러 발생 시키기
                emitter.onError(new Exception());
                // 중요 1 or 2 중 하나만 가능합니다.
                // 이유는 데이터는 하나만 발행이 가능해서 입니다.
            }
        });

        single.subscribe(new io.reactivex.rxjava3.core.SingleObserver<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable disposable) {
                // 아무것도 하지 않음
            }

            @Override
            public void onSuccess(@NonNull String data) {
                System.out.println(data);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                System.out.println("에러 발생");
            }
        });
    }

 

Maybe 키워드는 무엇인가요?
  • 데이터를 1건만 통지하거나 1건도 통지하지 않고 완료 또는 에러를 통지할 수 있습니다.
  • 완료 통지는 하지 않습니다.
  • 종료될 경우 완료 통지됩니다.
  • 대표적인 소비자는 MaybeObserver입니다.
public static void main(String[] args) {
        Maybe<String> maybe = Maybe.create(new MaybeOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull MaybeEmitter<String> emitter) throws Throwable {
                1. 무조건 1개의 데이터만 발행
                emitter.onSuccess("Hello Maybe");
                2. 완료 시 complete를 보낼 수 있습니다.
                emitter.onComplete();
                3. 에러 발생 시키기
                emitter.onError(new Exception());
                // 1번 2번 3번 중 하나만 발행이 가능합니다.
            }
        });

        maybe.subscribe(new io.reactivex.rxjava3.core.MaybeObserver<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                // 아무것도 하지 않음
            }

            @Override
            public void onSuccess(@NonNull String s) {
                System.out.println(s);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                System.out.println("에러 발생");
            }

            @Override
            public void onComplete() {
                System.out.println("완료");
            }
        });
    }

 

Completable 키워드는 무엇인가요?

데이터 생산자이지만, 데이터를 1건도 통지하지 않고, 완료 또는 에러를 통지합니다.

데이터 통지의 역할 대신에 Completable 내에서 특정 작업을 수행한 후, 해당 처리가 끝났음을 알리기 위한 목접입니다.

대표적인 소비자는 CompletableObserver()입니다.

public static void main(String[] args) {
        Completable completable = Completable.create(emitter -> {
            int sum = 0;
            for (int i = 0; i < 100; i++) {
                sum += i;
                if (sum > 10) {
                    emitter.onComplete(); // 조건에 만족 시 complete 발행
                    return;
                } else {
                    emitter.onError(new Exception()); // 조건 만족 못 할 시 error 발행
                    return;
                }
            }
        });

        completable.subscribeOn(Schedulers.computation())
                .subscribe(new io.reactivex.rxjava3.core.CompletableObserver() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        // 아무것도 하지 않음
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("완료");
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        System.out.println("에러 발생");
                    }
                });
    }

 

참조문헌

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%A6%AC%EC%95%A1%ED%8B%B0%EB%B8%8C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1/dashboard

 

Kevin의 알기 쉬운 RxJava 1부 강의 | Kevin - 인프런

Kevin | 리액티브 프로그래밍이라는 진입 장벽을 넘고 싶으신가요? Kevin의 알기 쉬운 RxJava가 그 벽을 넘을 수 있는 힘을 키워드리겠습니다., 리액티브 프로그래밍, 알기 쉽고 확실하게 배워보세요!

www.inflearn.com

 

오늘은 Single, Maybe, Completable 키워드를 공부하였습니다.

공부하면서 느낀 점은 각각의 함수마다 상황에 맞춰 사용하면 될 것 같다는 생각이 들었습니다.

점점 익숙해지면서 상황에 맞춰 사용하는 법도 배워보도록 하겠습니다.

감사합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'RxJava' 카테고리의 다른 글

[RxJava] 데이터 필터링 연산자  (0) 2025.02.01
[RxJava] 생성 연산자  (0) 2025.01.30
[RxJava] Flowable과 Observable의 차이점  (0) 2025.01.23
[RxJava] Reative Streams  (0) 2025.01.22
[RxJava] 마블 다이어그램  (0) 2025.01.19