코틀린 Flow Api에 대해서 공부를 해보자.
Kotlin Flow Api란
비동기적인 연산을 처리하기 위한 새로운 프로그래밍 모델을 제공하는 Kotlin의 라이브러리이다.
Flow는 비동기적인 작업을 쉽게 처리하고 조절할 수 있도록 설계되었으며, 주로 비동기 스트림(Asynchronous Streams)을 다루는데 사용된다.
Flow API의 핵심 개념은 데이터의 비동기적인 흐름(Flow)을 나타내는 것이다. Flow는 값을 생성하고 소비하는 비동기적인 프로시저로, 여러 개의 값을 비동기적으로 생산하고 소비할 수 있다. 이는 코루틴과 함께 사용되어 비동기 코드를 더 간결하게 만들고 복잡성을 줄일 수 있다.
Flow의 주요 구성 요소
Flow Builder
작업을 수행하고 아이템을 방출하는데 도움이 된다고 말할 수 있다. 때로는 아무런 작업도 수행하지 않고 항목만 내보내야하는 경우도 있다.
여기서는 Flow Builder가 이를 수행하는 데 도움이 된다.
Operator
연산자는 데이터를 한 형식에서 다른 형식으로 변환하는 데 도움이 된다.
연산자를 Translator로 생각할 수 있다.
Collector
Collector는 Operator가 변환한 Flow Builder를 사용하여 내보낸 항목을 수집한다.
Flow API의 중요한 함수 및 개념
- emit: Flow에서 값을 생성하고 방출하는 함수이다.
- collect: Flow에서 값을 소비하는 함수로, 코루틴 내에서 사용된다.
- map, filter, transform: Flow의 값을 변환하거나 걸러내는 함수들을 제공한다.
- onEach: Flow의 각 요소에 대해 특정 작업을 수행할 수 있다.
- combine, zip: 여러 개의 Flow를 결합하거나 조합하는 함수들이 있다.
- flowOf: 고정된 값을 가진 Flow를 생성한다.
flow {
(0..10).forEach {
emit(it)
}
}.map {
it * it
}.collect {
Log.d(TAG, it.toString())
}
flow { } | -> | Flow Builder |
map { } | -> | Operator |
collect {} | -> | Collector |
- 먼저, 0에서 10까지 방출하는 Flow Builder가 있다.
- 그런 다음 각각의 모든 값과 제곱(it * it)을 취하는 Operatro가 있다.
- 그런 다음 방출된 값을 가져와 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100으로 인쇄하는 Collector가 있다.
참고: 실제로 Collect 메소드를 사용하여 Flow Builder와 Collector를 모두 연결한 경우에만 실행이 시작된다.
Flow Builder의 유형
flowOf(): 주어진 항목 세트에서 흐름을 생성하는 데 사용된다.
asFlow(): 유형을 흐름으로 변환하는 데 도움을 주는 확장 기능이다.
flow{}: 이는 Flow의 Hello World 예제에서 사용한 것이다.
channelFlow{}: 이 빌더는 빌더 자체에서 제공하는 send를 사용하여 요소로 흐름을 생성한다.
flowOf()
flowOf(4, 2, 5, 1, 7)
.collect {
Log.d(TAG, it.toString())
}
asFlow()
(1..5).asFlow()
.collect {
Log.d(TAG, it.toString())
}
flow{}
flow {
(0..10).forEach {
emit(it)
}
}
.collect {
Log.d(TAG, it.toString())
}
channelFlow{}
channelFlow {
(0..10).forEach {
send(it)
}
}
.collect {
Log.d(TAG, it.toString())
}
위와 같은 예시 코드로 수행할 수 있다.
flowOnOperator
flowOnOperator는 작업이 수행될 스레드를 제어할 때 매우 편리하다.
일반적으로 Android에서는 백그라운드 스레드에서 작업을 수행하고 UI 스레드에 결과를 표시한다.
예를들어
val flow = flow {
// Run on Background Thread (Dispatchers.Default)
(0..10).forEach {
// emit items with 500 milliseconds delay
delay(500)
emit(it)
}
}
.flowOn(Dispatchers.Default)
CoroutineScope(Dispatchers.Main).launch {
flow.collect {
// Run on Main Thread (Dispatchers.Main)
Log.d(TAG, it.toString())
}
}
여기서 Flow Builder 내부의 작업은 Dispatchers.Default로 인해 백그라운드 스레드에서 수행된다.
이제 이를 UI스레드로 전환해야 한다. 이를 달성하려면 collector API를 Dispatchers.Main으로 실행해야한다.
이것이 flowOn Operator를 사용하여 스레드를 제어하는 방법이다.
참고
https://amitshekhar.me/blog/flow-api-in-kotlin
Mastering Flow API in Kotlin
In this blog, we are going to learn what is Flow API in Kotlin. Kotlin provides many features out of the box that we can use to perform various tasks in our project.
amitshekhar.me
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] Flow zip 연산자로 long- running tasks in parallel 처리하기 (0) | 2024.03.02 |
---|---|
[Kotlin] Flow Builder를 사용하여 Flow 만들어보기 (0) | 2024.03.02 |
[Kotlin] Kotlin Coroutines에서 Launch 와 Async (0) | 2024.03.01 |
[Kotlin] coroutineScope와 supervisorScope (0) | 2024.01.20 |
[Kotlin] 코틀린이란 무엇인가 그리고 특징과 주요 개발까지 (2) | 2023.08.24 |