[안드로이드 기초] RxJava Rough한 정리

리액티브 프로그래밍이란? Rx란? RxJava란?

리액티브 프로그래밍은 데이터가 통지될 때마다 관련 프로그램이 반응해 데이터를 처리하는 방식. 각각의 데이터가 생성될 때마다 순서대로 해당 데이터를 보내는데 이를 데이터 스트림이라고 한다. 이러한 데이터 스트림으로부터 전달받은 데이터를 전달받은 프로그램이 그때마다 적절히 처리할 수 있게 구성되었다. 프로그램이 필요한 데이터를 직접 가져와 처리하는 것이 아니라 보내온 데이터를 받은 시점에 반응해 이를 처리하는 프로그램을 만드는 것. 데이터를 생산하는 측(Publisher)은 전달도 책임지는데 전달한 데이터로 소비자(Subscriber)가 무엇을 하는지는 신경안써도 된다. 소비측도 생산측에서 뭘 하든지 상관이 없기 때문에 서로 독립적으로 작업 수행이 가능하다. 이렇게 비동기 처리가 쉽게 구현된다.

Reactive Extension, Reactive 프로그래밍을 가능하게 해주는 것. 마이크로소프트가 .NET에서 사용하려고 만들었던 라이브러리.

RxJava는 자바에서 리액티브 프로그래밍을 구현하는데 사용되는 라이브러리. 넷플릭스가 자바로 이식.

onSubscribe - 데이터 통지가 준비되었음을 통지

onNext - 데이터 통지

onError - 에러(이상 종료) 통지

onComplete - 완료(정상 종료) 통지

side effect - 전달받은 데이터의 상태를 변경하거나 처리 작업의 외부에 어떤 변화를 주는 것.

외부 상태 변경이 데이터 통지 처리에 영향을 주는 것을 피하지 않으면 책임 범위가 넓어져 단순한 처리라도 관리가 어렵다. 소비자 측에서 처리하는게 좋음.

데이터를 통지하는 측이 무엇을 하더라도 데이터를 받는 측의 처리가 받은 데이터에 의해서만 바뀌게 된다면 비동기로 쉽게 전환할 수 있다. RxJava는 스케쥴러를 제공하여 어떤 쓰레드에서 무엇을처리할지 제어할 수 있음.

외부 접근으로부터 안전하게 처리하기 위해 생산자가 외부에서 데이터를 받아 데이터를 생성할 때와 소비자가 받은 데이터를 처리하고 이를 외부에 반영할 때만 외부 데이터를 참조하는게 좋다.

subscribeOn - Observable, Flowable 객체가 실행될 쓰레드를 정한다. 여러번 설정 시 맨 처음 선언만 적용

observeOn - 연쇄되는 연산이 실행될 쓰레드를 정한다. 선언 이후 작동할 쓰레드 정함.

    ApiModule.getAuthorizedClient().doScheduleTripApiCall(params)
            .subscribeOn(getSchedulerProvider().io()) // I/O 쓰레드에서 Single 객체 실행
            .observeOn(getSchedulerProvider().ui())  // subscribe를 Main 쓰레드에서 실행
            .subscribe(this::handleResponse, this::handleError);

Hot Cold Observable

Hot은 구독 여부 상관없이 데이터를 배출한다. 그래서 이벤트에 반응하는데 주로 쓰인다.

Cold는 기본적인 Observable로 구독 하고 나서야 데이터를 배출한다. 일반적인 HTTP 요청에 사용된다.

RxJava 사용 이유

함수나 모듈에 사이드 이펙트를 최소화하고 동시성을 고려하기 위해 함수형 프로그래밍을 도입, 비동기 코드가 많아지면 제어의 흐름이 복잡하게 얽혀 코드를 예측하기 어려우므로 Reactive programming을 통해 이를 해결해 보고자 적용. 일반적으로 Retrofit 사용하면 콜백이 너무 지저분해지는 경향이 있음. 이를 RxJava와 함께 사용하면 통신을 통해 받아오는 객체 처리도 편해지고 중간에 객체 처리 할 때도 사이드 이펙트 없이 처리할 수 있음.

복잡한 쓰레드의 사용

RxJava에서는