RxJava

RxJava프로그래밍 - 유동환, 박정준 ( 한빛미디어 )

리액티브 프로그래밍이란 데이터의 흐름을 먼저 제어하고 흐름에서 발생하는 다양한 이벤트에 따라 함수가 실행된다.

시작하며

subscribe()함수

  1. Observable을 구독합니다.(즉 데이터의 구독)
  2. just()함수만 호출하면 데이터를 발행하지 않습니다.
  3. 옵저버 패턴과 동일하다고 판단.
  4. 반드시 데이터를 수신할 구독자가 subscribe를 호출해야 Observable에서 데이터가 발생

RxJava

  1. 자바는 전통적인 스레드 기반의 프로그래밍입니다. 다수의 스레드를 활용하는 경우 예상치 못한 문제가 발생 또는 디버깅이 어려웠습니다. 이문제를 해결하기 위해 함수형 프로그래밍 기법을 도입!

  2. 함수형 프로그래밍은 부수효과가 없는 순수함수를 지향하므로 스레드가 안전합니다. 즉 스레드세이프하다! (https://beanbroker.github.io/2018/11/17/Kotlin/concept_functional/)참고

  3. RxJava 라이브러리는 순수 함수로 작성된 리액티브 연산자를 제공

  4. 함수형 연산자를 어떻게 호출해야 하는지 모르기 때문에 어렵다.

중요 컨셉

  1. Hot Observable | Cold Observable
  2. 생성 연산자, 결합 연산자, 변환 연산자

Observable

Observable을 반드시 알아야 한다.

Observable클래스는 상황에 맞게 세분화해 각각 Observable, MayBe, Flowable 클래스로 구분해 사용합니다.

Observable은 옵저버 패턴을 구현합니다. 상태 변화가 있을 때마다 메서드를 호출하여 옵저버에게 변호라르 알려줍니다. 라이프 사이클은 존재하지 않으며 보통 단일 함수를 통해 변화만 알립니다.

RxJava의 Observable은 세가지 알림을 구독자에게 전달합니다.

  • onNext : Observable이 데이터의 발행을 알립니다. 기존의 옵저버 패턴과 동일
  • onComplete : 모든 데이터의 발행을 완료했음을 알림. “해당 이벤트는 단 한번만 발생하며, 발생한 후에는 더 이상 onNext 이벤트가 발생해선 안됩니다.”
  • onError : Observable에서 에러 발생을 알림. 해당 이벤트가 발생하면 이후 onNext및 onComplete이벤트가 발생하지 않습니다. 즉 Observable의 실행이 종료된다.

Just

  1. Integer와 같은 래퍼 타입부터 User같은 사용자 정의 클래스의 객체도 인자로 넣을수 있습니다.

  2. 인자로 넣은 데이터를 차례로 발행하려고 Observable을 생성(실제 데이터 발행은 subscribe가 담당)

  3. 한개의 값을 넣을수도 있고! 여러개(최대 10개)를 넣을수 있다. 단 타입은 모두 같아야 한다.

1
2
3
4
5
6
7
8
9
10
11

public void emit(){
Observable.just("1", "2", "3", "4", "5", "6")
.subscribe(System.out::println);
}

public static void main(String args[]){

FirstSample d = new FirstSample();
d.emit();
}

1,2,3,4,5,6 차례대로 호출

Subscribe

  1. 인자가 없는 subscribe는 onError의 이벤트의 발생에 따라 Exception을 던집니다. 코드를 테스트하거나 디버깅을 위해 사용합니다. (onNext, onComplete 무시)
  2. 인자가 1개 있는 subscribe는 onNext 이벤트만을 처리합니다.
  3. 인자가 2개인 subscribe는 onNext와 onError 이벤트를 처리합니다.
  4. 인자가 3개인 subscribe는 onNext, onError, onComplete 이벤트 모두를 처리합니다.

Disposable

Subscribe는 Observable에게 더이상 데이터를 발행하지 않도록 구독을 해지하는 함수입니다. Observable Contract에 따르면 onComplete알림을 보냈을 때 자동으로 dispose()를 호출해 Observable과 구독자의 관계를 끊습니다.

create

just는 데이터를 인자로 넣으면 자동으로 알림 이벤트가 발생!
create는 onNext, onComplete, onError를 개발자가 직접 제어

1
2
3
4
5
6
7
8
9
10
11

Observable<Integer> source = Observable.create(
(ObservableEmitter<Integer> emmiter) ->{
emmiter.onNext(1);
emmiter.onNext(2);
emmiter.onComplete();
}

);

source.subscribe(System.out::println);