코틀린 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
'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 |