본문 바로가기
안드로이드

[실무 라이브러리] RxJava와 Coroutines 비교해보자

by 디지털노마더 2021. 4. 10.

안드로이드 개발을 진행하다보면, REST API를 통해서 목록과 상세정보를 불러오는

기능을 필수적으로 개발하게 된다.

 

일반적으로 사용자들은 평균적으로 앱을 이용할 때 기다릴 수 있는 시간이 2~3초 사이라고 한다.

앱을 이용하는 목적이 편리하고 빠르게 정보를 확인하기 위함이기 때문에

앱 개발자에게 비동기 처리기술은 필수적으로 학습야할 요건이다.

 

최근에도 꾸준히 사용하고 있는 대표적인 비동기 라이브러리 기술을 소개한다.

RxJava, Coroutines 2가지이다.


* ReactiveX

: An API for asynchronous programming with observable streams 비동기 프로그래밍을 Observable streams을 활용하는 API이다.


RxJava는 최신 버전이 3.x버전이다.

ReactiveX 공식 홈을 통해 확인할 수 있는데,

다음과 같은 주요 언어들을 지원하고 있으며, 추가적인 언어들은 사이트에서 확인 가능하다.

 

RxJava에서 사전에 알아야 할 구문

 (아래 정보는 Taehwan님의 블로그에서 내용을 참조)

  • Flowable : Reactive-Stream을 구현하기 위한 패턴의 시작
  • subscribeOn : Reactive-Stream에서 사용할 기본 스케줄러이며, observeOn으로 스케줄러 교체하기 전까지 기본으로 사용한다.
  • observeOn : 스케줄러의 변경이 필요하면 observeOn을 이용 스케줄러 교체가 가능하다. 다음 observeOn이 오기전까지 유효하다.
  • map : Stream에서 넘어온 데이터를 처리할 수 있다.
  • filter : Stream에서 넘어온 데이터에 filter를 걸 수 있다. 단, 조건의 결과값이 true가 아닌 경우 다음 구문을 실행하지 않는다.
  • subscribe : 모든 Reactive-Stream은 subscribe 정의가 없으면 동작하지 않는다. subscribe 정의에서는 onNext, onError, onCompleted을 제공한다.
  • Schedulers.io() : Rx에서 사용하는 Schedulers이며 AndroidSchedulers.mainThread()를 별도로 제공한다.

 

* RxAndroid

RxAndroid는 RxJava를 기본적으로 포함하고 있다. 

다만 문서에 보면 RxAndorid 사용 시 RxJava를 기본으로 추가하길 권장하고 있다.

 

Android를 위한 RxAndroid - 링크가 있다.

 

Androd Stuiod의 build.gradle 파일 내에 아래의 속성을 추가한다.

allprojects {
    repositories {
        maven { url "https://oss.jfrog.org/libs-snapshot" }
    }
}

dependencies {
    // rxAndroid 최신버전: 3.x
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
}

 

RxAndroid에서는 Android의 Main Scheduler(UI Scheduler)를 활용할 수 있도록

AndroidSchedulers.mainThread()를 제공하고 있다.

Observable.just("one", "two", "three", "four", "five")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe {/* an Observer */}

 

.subscribeOn(Schedulers.io()) 와 observeOn(AndroidSchedulers.mainThread()) 는 

RxAndroid를 이용한다면 자주 접하게 될 코드이니 익숙해지자.


Coroutine에서 알아야 할 것은?

이번엔 위 Coroutine 코드를 이해하기 위한 구문을 나눠보자.

기본 형태는 함수와 동일하여 이해하기 쉬운데 크게 나누면 CoroutineScope, launch와 RxJava에서와 같은 스케줄러인 Dispatches를 이해하면 간단하게 읽을 수 있다.

 

  • CoroutineScope : Coroutine을 동작하기 위해서 CoroutineScope을 정의할 수 있다. CoroutineScope은 기본 스케줄를 함께 지정해야 하며, RxJava의 subscribeOn과 같다.
  • launch : 코루틴으로 동작해야 할 코드 스쿱을 지정한다. 이때 이 스쿱에서 사용할 스케줄러를 함께 지정할 수 있으며, 지정하지 않을 경우 CoroutineScope에서 지정한 스케줄러를 사용한다.
  • Dispatchers : 코루틴에서 사용할 스케줄러를 정의하며, Default(Work Thread), Main(UI Thread) 등을 지정할 수 있다.

 

Coroutine은 interface로 정의되어있으며, 모든 Scope은 CoroutineScope을 최상위로 두고 있다.

 

이를 활용한 GlobalScope을 함께 제공한다. RxJava처럼 subscribe 호출 시 동작하도록 하려면 suspend로 함수 정의를 해둘 수 있는데, 단순 CoroutineScope은 즉시 실행 및 event 대기를 한다.

launch의 return 결과인 Job을 통해 일시 정지, 종료, 취소, 시작 등을 제어할 수 있다.

 

  • CoroutineScope : 새로운 CoroutineScope을 생성할 수 있으며, 스케줄러를 함께 초기화해야 한다. CoroutineScope은 Activity 라이프사이클에 따라 동작하도록 베이스 코드를 함께 사용하는 것을 추천하고 있다.
  • GlobalScope : CoroutineScope을 상속받아 구현되어있으며, GlobalScope은 object인 싱글톤으로 만들어져있다. GlobalScope은 Application의 라이프 사이클을 따라 동작해야 하며, 서비스와 같은 형태에서 사용하는 것을 추천한다.

CoroutineScope, GlobalScope으로 객체를 생성하였다면, 코드 동작을 위한 액션을 지정해주어야 한다.

  • launch : 일반적인 코루틴을 사용할 때 사용하며, launch에서 스케줄러를 지정하지 않으면, CoroutineScope의 스케줄러를 따르며, 지정할 경우 블록 안에서만 스케줄러에 따라 동작한다.
  • async : async/await이 필요할 경우 사용할 수 있다.
  • actor : actor를 사용할 경우 이벤트 전달이 가능하며, suspend에서 데이터 전달과 send와 기본 Thread에서 이벤트 전달이 가능한 offer 두 가지를 제공한다. 이를 Android에서는 OnClick에 함께 사용할 수 있다.

RxJava보다 알아야 할 구문이 적어 이해하기 쉽다. 

처음에는 RxJava보다 이해하기 쉽지만 시간이 지날수록 RxJava 만큼의 학습 비용은 들어간다.

 

이것 외에도 다양하게 있으니 코루틴 가이드 문서를 참고하길 바란다.

 

 

* RxJava to Coroutine

 

► RxJava

  • Observable pattern 으로 구독
  • 구독 후 들어오는 data를 stream 형태로 내려보낸다.
  • 중간중간 데이터가 변환되는 것을 stream을 통해 확인 가능하다.

 Coroutine 

  • 누구나 아는 함수를 호출하고, return이 오기 전까지 대기한다.
  • 처리가 끝나 return한 데이터를 가지고 다음 처리를 할 수 있다.

 

표로 한 번 더 정리하면 아래와 같다.

내용 RxJava Coroutine
시작 Flowable CoroutineScope(dispatchers)
0..10 range(0, 10)(RxJava에서 제공) (0..9)(코틀린 문법)
시작 스케줄러 subscribeOn(Schedulers.io()) Dispatchers.Default
중간 스케줄러 변경 observeOn(Schedulers.io()) launch(Dispatchers.Main)
index + 1 map {} map {} (코틀린 stream 문법)
index > 4 filter {} filter {} (코틀린 stream 문법)
출력 subscribe의 onNext에서 출력 (구독을 통한 실행) launch를 통한 MainThread로 변경 후 출력

 

 

* 마무리

 RxJava, Coroutine 비동기 처리 네트워크 라이브러리로는 유용한 도구이다.

 개발자마다 성향이 달라서, 딱 이것이 좋다고는 정하기는 어렵습니다. 

 두 라이브러리(RxJava, Coroutine) 모두 상호 호환이 가능하므로 사용하기 

 편한 라이브러리로 우선 사용법을 익히는 것을 추천드립니다.

 

 최근 프로젝트에서 RxJava를 이용하면서, 제공되는 함수를 하나씩 학습하고 있습니다.

 추후에 RxJava에서 자주 사용하는 기능을 위주로 정리하는 포스팅을 작성할 예정입니다.

 

아래는 권태환 님이 2019년 DEVFEST의 강연 영상입니다.

리액티브x, 코루틴을 처음 접하시는 분들에게 도움이 되신다면 좋겠습니다.

 

 

 

댓글