멜팅비의 개발 공부

RxJava 기본 개념 및 구조 본문

개발 공부/[Android 개발]

RxJava 기본 개념 및 구조

멜팅비 2021. 2. 18. 20:48
반응형

최근 프로젝트에서  RxJava + Dagger + MVVM 패턴 + LiveData + Databinding 등을 접하게 되었는데

아직 안드로이드 초보 개발자로서 모르는 게 너무 많아서 조금씩 스터디를 하게 되었고, 그때 정리해둔 내용(틀린 부분이 많을 수도 있음)


ReactiveX

: 비동기적 데이터 흐름을 처리하는 프로그래밍 (Observable 시퀀스를 이용해 이벤트를 처리)

Reactive Programming

  • 프로그램에서 필요한 데이터를 직접 가지고와서 처리하는 방식이 아닌, 데이터를 받은 시점에서 처리하는 방식
  • 데이터를 만들어내는 생산자와 이를 소비하는 소비자로 역할을 나눠 처리하는 프로세스를 가짐
  • 생산자 - 데이터를 생산하여 전달하는 역할까지 수행 소비자 - 데이터를 받아서 처리하는 역할만 수행 역할의 분리 > 비동기 구현 가능

구성

  • Publisher와 Subscriber로 구성 Subscriber가 Publisher를 구독하면 Publisher가 통보하는 데이터를 받을 수 있음

  • 흐름

    1. 구독(subscribe)
    2. 데이터 통보 준비 완료 (onSubscribe)
    3. 데이터 요청 (Subscription.request)
    4. 데이터 생산
    5. 데이터 통보 (onNext)
    6. 통보받은 데이터 처리
    7. 데이터 요청
    8. 데이터 통보 완료 (onComplete) or
    9. 에러 통보 (onError)
  • 구독이 발생하면 이에 대한 Subsciption이 생성

  • Subscriber가 Publisher를 구독하지 않으면 이후 단계는 진행되지 않는다.

  • onComplete, onError와 같은 확정 Action이 발생하면 소비자에게 통보

  • Subscriber는 Publisher에게 받을 데이터 개수를 요청할 수 있으며, 요청받은 Publisher는 다시 데이터를 생산하여 Subscriber에게 전달(onNext)

규칙

  • 구독 시작 통지는 구독에서 한번만 발생
  • 데이터 통지는 순차적으로 이뤄짐
  • null을 통지하지 않음
  • Publisher는 처리완료 혹은 에러를 통하여 종료

ReactiveStream 지원 → 생산자 : Flowable / 소비자 : Subsciber / 관계 : Subscription

ReactiveStream 미지원 → 생산자 : Observable / 소비자 : Observer / 관계 : Disposable

Flowable

: Observable과 같은 RxJava에서 쓰이는 관찰 가능한 객체, backpressure를 처리할 수 있음 (backpressure : 생산자 속도가 빨라서 값을 처리하지 못하는 상황 = Observer에게 방출되는 Data가 너무 많아 처리하지 못함 Memory Leak 발생)

  • 대량 데이터를 처리 할 경우
  • 네트워크 통신/파일 등 IO를 처리할 경우

Observable

: 옵저버 패턴을 사용 > rx의 Observer는 Observable을 구독

  • GUI 이벤트
  • 소량의 데이터를 처리할 경우

3가지 알림을 구독자에게 전달

  1. onNext : Observable이 데이터 발행을 알림
  2. onError : error가 발생했음을 알리고 Observable을 종료
  3. onCompleted : 모든 이벤트가 발행을 완료했음을 알림(이벤트 발생 후 onNext를 발행하면 안 됨)

표준 인터페이스

  • Publisher : 데이터 생성/통보
  • Subscriber : 데이터 처리
  • Subscription : 데이터 요청/구독 해지 가능 ⇒ RxJava2에서 Disposable로 바뀜
  • Processor : Publisher & Subscriber의 역할을 모두 가지고 있음

Disposable

: 옵저버블을 통해 데이터 스트림을 발행하고 subscribe() 함수들을 사용하여 구독할 때 함수가 반환하는 값 = Disposable 인터페이스의 객체

  • dispose() 함수 : 옵저버블에게 더 이상 데이터를 발행하지 않도록 함 = 구독해지
  • clear() 함수 : add 된 옵저버블을 해지 (isDisposed()가 false이기 때문에 재사용 가능)
반응형
Comments