코틀린/코루틴

Flow 2주차 1차 스터디 flows 까지

강한 맷돼지 2023. 11. 23. 17:22

Asynchronous Flow 공식문서 정리

이 글은Flow 공식문서를 정리한 글입니다. -> 학습을 위해 사용한다면 공식문서를 옆에 띄워놓고 목차와 함께 봐주세요

 

Representing Multiple Value

일반적으로 비동기처리 할때 suspend funtion을 이용해서 single value 를 얻어오는데 사용했다.

하지만 일반적으로 Stream 개념을 사용해서 여러 값을 전달 받을수 있는 Reactive Programming(Ex: RxJava)과 같은 기능을 Kotlin 에서는 Flow를 통해서 사용할 수 있다.

Stream

Hot Stream, Cold Stream 개념에 대해서 학습했을때 말했듯이 stream은 데이터를 나타내는 하나의 형태라고 볼 수 있다.

이런 stream 이라는 개념을 여기저기서 쓰고 있고 일반적으로 간단히 이해하자면 그냥 순차적으로 데이터를 흘려보내는 형태이다.

이러한 Stream 을 사용하는 대표적인 예시가 Reactive X이다.

Reactive Programming

사실상 필자도 현재 Rx를 딱히 사용할 일이 없어서 내부적으로 어떻게 돌아가는지 사용법이 어떻게 되는지 정확히 파악하고 있지는 않지만

큰 흐름을 보면 Rx 나 Flow나 리액티브 프로그래밍 패러다임을 표방하고있다.(뭐 Flow는 명확히 리액티브를 위한것만은 아니고 어쨋든 리액티브 프로그래밍을 할수 있는 도구정도라 생각하자.)

리액티브 프로그래밍을 찾아보면 선언형, Stream 이 주요 키워드이다. 이 키워드만 들어도 대략 감이 올수도 있고 감이 안온다고 하더라도 학습을 하면서 이해를 돕는 키워드가 될것이다.

일단 Rx를 배우려는 취지의 글이 아니니 잡설은 이정도까지만 하고 공식문서를 살펴보자


공식문서에서는 아주 친절하게 설명해주는데

기존의 동기적인 코드를 짜는 경우 다량의 Value를 운반하기위해 collection 혹은 sequences 를 사용했었다.(sequences 우테코 초반에 배웠던 기억 저편을 떠올려보자)

이를 비동기적으로 처리하려면 그냥 코루틴의 suspend function과 flow를 사용하면 되는것이다.

동기 처리

- Collections

다량의 값을 하나의 자료구조를 통해 담아서 보낼 수 있다. -> 예를 들어 List 같은 자료조에 담아 보낼수 있을것이다.

그리고 forEach 같은 collection api 를 통해서 순차적으로 처리할 수 있다.

그냥 우리가 숨쉬듯이 생각하는 구조이다.

이를 코루틴에 빗대면 single value 를 받아올 수 있는 suspend function와 비교된다.

- Sequences

Sequence를 사용하면 다량의 데이터를 자료구조에 담지 않고 사용하려는 타입자체를 stream 형태로 내보낼 수 있다.

여담이지만 Sequence를 그냥 collections 를 사용할때 계속 새로운 인스턴스를 만들지 않기 위한 수단이라고 생각했는데 훨씬 심오한 Stream 개념이 숨어있었다.

동기적으로 Stream 을 열고 싶다면 Sequence 를 사용하면 된다. 또한 Flow랑 비교해보면 그냥 동기와 비동기의 차이일뿐 사용법과 개념은 거의 동일하다.

Sequence 가 생소하여 예시가 필요하다면 링크를 타고가보자

비동기 처리

- Suspending functions

똑같이 다량의 자료를 자료구조를 통해 묶어서 내보낼 수 있다. -> collection 이용

하지만 이를 비동기적으로 처리하고 싶다면 suspend 키워드를 붙여서 코루틴을 이용하여 처리하면 될것이다.

- Flows

자 처음부터 Flow를 접했다면 이게 뭐지? 싶었겠지만 우리는 hot Stream ,cold Stream 개념을 이미 장착했고

Sequence를 통하여 동기적인 Stream 의 예시 또한 접하였다.

그냥 이제 Flow는 보면 이해된다. 그냥 그야말로 비동기적인 Stream 이다.

만약 이해가 안된다면 안드로이드 공식문서의 flow에 대해 생산자,중간 연산자,소비자 collect시점에 생산자 코드가 돌고어쩌구 저쩌구 설명하는걸 보면 더 이해가 잘될수도 있다.(사실상 생각해보면 그냥 이 예시를 바로 맞닥트리면 collect 되는 시점에 flowbuilder 내부 코드가 돈다는걸 어떻게 알지? 좀 불친절한것 같다...)

사실상 값을 받기위한 통로를 개설한다고 생각하면되는데 통로의 자료형이 Flow라고 생각하면된다.