Java Developer

Talk is cheap. Show me the code.

io.reactivex.Single

14 Jun 2018

정의

Single 클래스는 하나의 값만을 응답하는 Reactive Pattern의 구현체입니다.

Single은 Observable과 유사하며, Observable과 다르게 onSuccess와 onError만을 가지고 있습니다. 즉 하나의 값을 리턴하고, Obserable에서 제공하는 일부 기능을 사용할 수 없습니다.

간단한 차이점 하나를 보면 다음과 같습니다.

Single.just("Hello", "World").subscribe(System.out::println);

만약 위와 같이 하게 되면, 하나의 입력이 들어와서 하나의 응답이 나가야하는데, 입력이 2개가 되어 컴파일 오류가 나게 됩니다.

마찬가지로 fromIterable도 제공되지 않습니다.

List<String> words = Arrays.asList("AA", "BB");
Single.fromIterable(words).subscribe(System.out::println);

제공되지 않기 때문에 위의 코드도 마찬가지로 컴파일 오류가 납니다.

Single은 다음 기능만을 제공을 합니다.

interface SingleObserver<T> {
    void onSubscribe(Disposable d);
    void onSuccess(T value);
    void onError(Throwable error);
}

onNext나 onComplete는 onSuccess로 합쳐져서 단 하나의 값만 리턴이 됩니다.

Single의 경우 DBMS의 데이터를 조회한 결과를 한건을 반환하는데 적합합니다.

따라서 다음과 같은 코드 작성이 가능합니다.

public Single<Person> findPerson(long ssn) {
    return Single.fromCallable(() -> personMapper.findPerson(ssn));
}

personMapper는 db를 조회하여 Person개체를 반환하는 myBatis 코드 샘플입니다. RxJava 1.2 부터는 비동기로 작업을 처리하고 그 결과를 리턴을 편리하게 만들기 위해서

Observable.fromCallable() 이 추가되었습니다. defer를 대체할 수 있습니다.

Single.fromCallable(dao::findPerson)
  .subscribe(person -> {
    // Next Step
  }, throwable -> {
    // Error handling
  });

fromCallable은 subsribe될때는 아무것도 하지 않으며, 호출(call)이 되는 시점에 onSuccess가 실행되어 personMapper가 호출이 됩니다.

참조

  • http://reactivex.io/RxJava/javadoc/io/reactivex/Single.html