
RxJava 기반 통신 작업을 회사에서 사용 중이지만 제대로 된 개념이 잡히질 않은 것 같아 공부를 하던 중 Observable 과 Flowable 를 선택하여 사용하는 기준에 대해 이해한 부분을 정리하고자 글을 써보기로 했다.
먼저 RxJava 가 무엇인지 부터 알아보자.
RxJava
RxJava 란 ReactiveX (Reactive Extentions) 를 자바로 구현한 라이브러리다. ReactiveX 는 Microsoft 사 주도 아래 옵저버 패턴, 이터레이터 패턴, 함수형 프로그래밍의 장점과 개념을 접목한 반응형 프로그래밍 기법을 의미한다.
과거의 어플리케이션은 클라이언트와 서버의 작업 간에 동기식 구조가 대부분이었다. 하지만 규모가 커지고 복잡해지면서 퍼포먼스 향상을 위해 비동기식 처리를 해야만 하는 시대가 도래하였다. RxJava 는 이러한 Reactive Programming 을 확장하여 구현한 라이브러리이다.
RxJava 의 가장 중요한 개념은 생산자와 소비자이다.
생산자 (Observable) : Data Stream 의 데이터를 발행하는 역할
소비자 (Observer) : 생산자의 데이터를 사용하는 주체
데이터 스트림을 데이터가 흐르는 강이라고 생각해본다면 이 곳에 데이터를 흘려보내는 주체가 생산자이고 떠내려오는 데이터를 받아서 처리하는 역할을 하는 것이 소비자 이다.
그런데 여기서 생산자와 소비자의 밸런스가 무너지게 된다면 어떻게 될까?
배압 (Back Pressure)
배압이란 데이터 생산과 소비가 불균형적일 때 일어나는 현상이다. 예를 들어 10,000개의 데이터를 0.1초마다 발행하고, 10초마다 소비를 하게 된다면 데이터는 스트림에 계속 쌓이게 될 것이다. 생산자가 데이터를 발행하는 속도를 소비자가 따라가지 못하는 것이다. 이는 결국 메모리가 Overflow 되고 Out of Memory 로 이어져 앱이 죽게 될 것이다.
이러한 현상을 배압이라고 하며 RxJava 에서는 배압 현상을 제어할 수 있는 방법을 제공한다.
Flowable
기존의 Observable 을 사용한 경우에는 데이터 발행과 소비가 균형적으로 일어나지 않으며 데이터는 소비와 상관없이 스트림에 계속 쌓이게 된다. 반면 Flowable 을 사용한 경우에는 데이터가 일정량 누적되면 배압 기능을 통해 데이터를 더 이상 발행하지 않도록 한다.
배압 전략
RxJava 에서는 배압 전략을 통해, Flowable 이 통지 대기 중인 데이터를 어떻게 다룰 지에 대한 스펙을 제공한다. 배압 전략에는 다음과 같은 것들이 있다.