성장기록지
Kotlin Flow란? 본문
1. Flow란?
- Flow는 Kotlin의 코루틴 라이브러리에서 제공하는 API로, 비동기 데이터 스트림을 처리하기 위한 도구이다.
- Flow는 콜드 스트림(cold stream)으로 작동하며, 데이터가 필요할 때만 스트림을 생성하고 실행한다.
2. Flow - cold Stream
Flow는 구독(subscribe)하기 전까지 실행되지 않으며, 데이터 흐름을 생성하지 않는다.
이는 Lazy evaluation과 비슷한 개념으로, 사용자가 Flow를 구독할 때 비로소 스트림이 시작된다.
Flow가 cold Stream이기에 얻는 특징들은 다음과 같다.
- 데이터가 내부에서 생성된다.
- 소비자가 소비를 시작할 때 데이터를 생산한다.
- Cold Stream은 하나의 생산자에 하나의 소비자만 존재한다. (UniCast)
Flow가 cold Stream으로 갖는 특징에 대한 예시들은 바로 이전글에 작성하였으니 참고하면 좋을것이다.
3. Flow - 비동기 데이터 흐름
Flow는 코루틴 기반으로 작동하며, 데이터의 비동기 처리에 적합하다.
아래의 예시를 보면서 확인해보자.
fun exFlow(): Flow<Int> = flow {
for (i in 1..3) {
delay(100)
emit(1)
}
}
suspned 선언이 없어도 flow는 delay(100)를 활용하고 있는 모습을 볼 수 있다.
이는 flow의 내부 블록이 suspend로 되어있기 때문이고, flow는 아래와 같이 설명이 되어있다.
- 주어진 suspendable 블록으로부터 콜드(Cold) Flow 를 생성한다고 적혀있다.
- Flow가 cold하다는 것은, Flow에서 정의된 코드가 Flow의 최종 연산자(terminal operator) 가 호출될 때마다 다시 실행된다는 것을 의미한다고도 적혀있다.
- 설명처럼 flow를 반환하는 함수는 비동기 작업을 정의할 뿐, 실제로 수행하지는 않는다.
- 그렇기 때문에 exFlow()에는 suspend 키워드가 붙지 않는다.
- 또한 최종 연산자인 collect에는 아래와 같이 suspend가 붙어있다.
4. Flow - Structured Concurrency
- Flow의 수명과 실행이 항상 호출된 Coroutine Scope에 종속된다는 것을 의미한다.
- Flow의 모든 작업은 현재 Coroutine Scope의 lifecycle에 따라 관리된다.
- exFlow()를 활용한 main 함수 예시를 봐보자.
fun main() = runBlocking {
val flow = exFlow()
flow.collect { value ->
println(value)
}
}
- 예시코드에서 runblocking을 통해 생성된 Coroutine Scope 안에서 flow가 관리되어진다.
- collect가 호출되어 실행되면, 해당 스코프 내에서 모든 flow 작업이 실행된다.
- flow가 실행되는 코루틴이 취소 될 시에 flow에 의해 실행된 모든 자원들이 자동으로 정리된다.
5. flow 구조
producer(생산자)
- flow builder가 속해져 있다.
- DataStore,Retrofit,Room,WorkManager 등에서 flow반환형을 지원하고 있다
- 때문에 flow builder를 사용할 일은 많이 없다.
intermidiary(중간 연산자)
- flow의 데이터 스트림을 여러 단계에서 걸쳐 조작할 수 있는 Api를 제공한다.
- suspend 함수 호출이 가능하다.
- map,filter와 같은 다양한 연산자들과 결합해 복잡한 데이터들을 처리한다.
Consumer(최종 연산자)
- 값을 소비하는 유일한 방법이다.
- collect, toList()등을 활용한다.
- Flow의 데이터를 소비하는 중요한 역할이다.
안드로이드에서의 Flow 구조
공식문서에는 아래와 같이 설명되어있다.
해석하여 정리하자면 아래와 같다.
- Repository(data layer)
- Flow의 emit 역할을 담당하며, 데이터를 생성하여 스트림으로 방출한다.
- ex) 네트워크에서 데이터를 가져오거나, 로컬 데이터베이스에서 쿼리하여 Flow로 데이터를 제공.
- 생산자의 역할을 한다.
- UI 계층
- Flow의 collect 역할을 수행하여 소비자의 역할을 한다.
- 사용자 입력 이벤트를 생성시킬 땐 생산자의 역할을 하기도 한다.
- 방출된 데이터를 구독하여 화면에 표시하거나, 사용자와의 상호작용에 따라 데이터를 반영한다.
- 중간 계층 (변환자)
- Flow의 intermediate operators (map, filter, transform 등)에 해당하며, 데이터를 변환하거나 필터링하여 다음 계층의 요구사항에 맞도록 조정한다..
참고 자료
https://developer.android.com/kotlin/flow
'안드로이드 > 안드로이드 지식' 카테고리의 다른 글
Kotlin Data Stream (Sequence, Hot, Cold Stream) (0) | 2025.01.23 |
---|---|
Compose Structure 정리하기 (compiler, Runtime, UI) (0) | 2025.01.22 |
Compose Stability 자세히 알아보기! (0) | 2025.01.21 |
Compose Stability란? (0) | 2025.01.20 |
안드로이드 MVVM 아키텍쳐란? (0) | 2025.01.13 |