Coroutine
[Coroutine Flow] conflate를 이용해 최신 데이터 collect 하기
collectLatest를 이용한 최신 데이터 collect의 한계점 그림1과 같이 데이터 발행 시간 사이의 간격보다 데이터를 처리하는 suspend fun이 수행하는 시간이 오래 걸릴 경우, 새로 들어온 데이터는 계속해서 소비되지 못한다. 즉 이런 상황에서 collectLatest를 쓸 경우 중간 데이터를 하나도 얻지 못하고 마지막 데이터만을 얻을 수 있다. 예를 들어 아래 그림2와 같이 데이터 발행에 0.1초가 걸리는데 데이터 소비에 1초가 걸릴 경우 하나도 소비가 안되고 마지막 데이터만이 소비된다. conflate을 이용해 최신 데이터 collect하기 이를 해결하는 방법은 간단하다. 한 번 시작된 데이터 소비는 끝날 때까지 하고 데이터 소비가 끝난 시점에서의 가장 최신 데이터를 다시 소비하는 것이..
[Coroutine Flow] buffer 이용해 발행과 소비를 위한 Coroutine 분리하기
collect에서 데이터 발행과 소비가 일어나는 방식 flow의 collect를 사용하면 하나의 Coroutine에서 발행과 소비가 같이 일어나기 때문에 데이터가 발행된 후 소비가 끝나고 나서 다시 다음 데이터가 발행된다. 즉 발행과 소비가 순차적으로 일어난다. 이를 그림으로 표현하면 다음과 같다. 하지만 이 방식은 매우 비효율적이다. 발행하는 쪽이나 소비하는 쪽의 delay를 미리 처리하지 않는다면 발행부와 소비부 양쪽에서 모두 delay가 생기기 때문이다. 예를 들어 다음과 같이 발행에 1초 소비에 3초가 걸리는 코드가 있다고 해보자. 그림2의 로그에서 볼 수 있듯이 collect를 사용하면 데이터를 발행하는데 1초 소비하는데 3초가 걸려서 총 4초가 발행과 소비에 사용된다. 즉, 발행에 지연(del..
[Compose Side Effect] rememberCoroutineScope을 이용해 Composable의 생명주기에 맞춰 코루틴 수행하기
Composable에서 올바른 CoroutineScope을 선택하는 것이 중요한 이유 Composable 내부에서 코루틴을 수행할 경우 Composable에 대한 Recomposition이 일어날 때 정리되어야 하는 Coroutine이 정리가 안된 상태로 계속해서 Coroutine이 쌓일 수 있다. Recomposition은 자주 일어나는 동작이므로 Recomposition마다 Coroutine을 생성하는 것은 위험하며 심할 경우 앱 크래시를 발생시킬 수도 있다. 따라서 Composable에서 Coroutine을 생성한다면 Recomposition이 일어날 때 취소되어야 한다(꼭 그렇지 않은 경우도 있지만 그래야 하는 경우가 대부분이다). Compose는 이를 위해 Composable의 Lifecycle..
[Coroutine] Coroutine(코루틴)과 Subroutine(서브루틴)의 차이 - Coroutine이란 무슨 뜻일까?
루틴이란 무엇인가? 우리는 Routine을 운동 루틴 혹은 공부 루틴과 같은 '특정한 일을 하기 위한 일련의 처리 과정'이란 뜻으로 사용한다. 비슷하게 전통적으로 프로그래밍에서는 루틴을 '특정한 일을 처리하기 위한 일련의 명령'으로 사용해 왔다. 실제로 구글에 routine을 찾으면 아래와 같이 나온다. 루틴(Routine)이란 컴퓨터 프로그램의 일부로써 특정한 일을 실행하기 위한 일련의 명령이다. 우리는 프로그래밍에서 이러한 일련의 명령을 함수라 부른다. 자 이제 서브루틴(Sub-Routine)에 대해 알아볼 준비가 되었다. 서브루틴이란 무엇인가? 프로그래밍에서는 함수 안에 함수가 있을 경우 바로 안쪽의 함수를 서브루틴이라 부른다. 예를 들어 아래와 같은 코드가 있다고 해보자. fun routine1(..
[Coroutine Flow] 1. Flow란 무엇인가?
Coroutine의 Flow는 데이터 스트림이며, 코루틴 상에서 리액티브 프로그래밍 지원 하기 위한 구성요소이다. 이를 이해하기 위해서는 먼저 리액티브(반응형) 프로그래밍이 무엇인지, 그리고 Flow가 리액티브 프로그래밍에 대응하여 어떠한 역할을 하는지를 알아야 한다. 리액티브 프로그래밍이란? 리액티브 프로그래밍이란 데이터가 변경 될 때 이벤트를 발생시켜서 데이터를 계속해서 전달하도록 하는 프로그래밍 방식을 뜻한다. 이는 기존의 명령형 프로그래밍과 대응되는 개념인데 이에 대한 내용은 [RxJava] 반응형 프로그래밍 이해하기 글에 잘 설명되어 있다. 만약 리액티브 프로그래밍에 대해 잘 모른다면 위 글을 읽고 오자. 기존 명령형 프로그래밍에서는 데이터의 소비자는 데이터를 요청한 후 받은 결과값을 일회성으로..