[Kotlin] Retrofit에 Flow와 CallbackFlow 적용하기

Harry The Great
해리의 유목코딩
3 min readDec 29, 2019

본 예제는 Okhttp와 Retrofit에 대한 튜토리얼 내용은 설명하지 않습니다.

코 루틴의 Flow와 CallbackFlow를 이용하면 RxJava 부럽지 않은 데이터 스트림을 생성할 수 있습니다. 코 루틴의 데이터 스트림은 크게 Flow와 Channel로 나눌 수 있는데 Flow는 소비자가 호출(ex. Collect, First)되어야 데이터 스트림을 만들어내는 Cold 상태의 스트림이고 Channel은 소비자 호출 이전에 데이터 스트림을 만들어내는 Hot 상태의 스트림입니다.

사용할 API

어떤 API를 사용할까 고민하다가 무료로 누구나 호출할 수 있는 API로 업비트 코인 가격정보 API를 선택하였습니다. URL은 아래와 같습니다.

https://crix-api-endpoint.upbit.com/v1/crix/candles/lines?code=CRIX.UPBIT.KRW-BTC

JSON값의 예시

code값을 쿼리로 주어 현재 거래되는 값을 가져올 수 있습니다.

필요한 디펜던시

본 예제는 Retrofit의 최소한의 디펜던시만 선언하였고 별도의 DI 라이브러리는 사용하지 않았습니다. JSON 데이터 리스트들 중 Candles와 Unit만을 가져오기 위해 아래와 같이 선언하였습니다.

Retrofit의 JsonAdapter로 Moshi를 사용하였습니다. Moshi Converter를 사용하면 JSON의 키값과 변수명이 같을 경우 자동으로 맵핑되며 다를 경우 Json 어노테이션을 이용할 수 있습니다. Gson으로 해도 무방합니다.

네트워크를 호출할 Interface를 선언합니다. 별도의 Retrofit 데이터 스트림 컨버터를 사용하지 않고 Call 형태로 데이터를 받습니다.

DI를 사용하지 않아 레포지토리 역할을 해줄 싱글톤을 선언하였습니다.

Retrofit 확장함수

asCallbackFlow 확장함수는 Retrofit의 Call 값을 CallbackFlow로 컨버팅하여줍니다. CallbackFlow에 대한 내용은 이전의 블로깅글에서 확인하실 수 있습니다. close함수에 throwable 형태의 인자값을 준다면 flow 스트림에서 catch로 에러값을 받을 수 있습니다.

CoinViewModel

CoinViewModel에서는 Activity 혹은 Fragment로부터 코인 코드를 받아 Flow 데이터 스트림을 만들어냅니다. collect 이전에 first, reduce, retry, zip, asLiveData 등을 통해 RX 부럽지 않은 스트림을 더 많들어낼 수 있습니다.

MainActivity

MainActivity에서의 버튼을 클릭하면 CoinViewModel의 Flow 스트림을 만들어냅니다.

마치며

아직까지 Experiment여서 그런지 몇달전에 작성한코드도 Deprecated가 너무많이 뜨는것같습니다. 추후에 정식버전이 출시되면 그때 다시한번 코드를 정리하여 업로드해야할것같습니다.

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.