Kotlin Coroutines Flow 맛보기
ReactiveX
은 반응형 프로그래밍으로 비동기 프로그래밍을 구현하기 위하여 많이 사용이 되어 한번 학습을 해봐야 겠다는 생각이 들었다. Coroutine을 학습하는 도중 ReacticeX와 같은 기능을 할 수 있는 비동기 스트림 Flow
를 제공하고 있어 ReactiveX 이전에 먼저 Flow에 기본적인 개념에 대해 알아보려고 한다.
Flow란
코루틴에서 Flow(흐름)은 단일 값만 반환하던 Suspend 함수와는 다르게 여러 값을 순차적 으로 내보낼 수 있다. 또한 반응형 프로그래밍으로 실시간으로 업데이트 하는 상황에서 더욱 코드를 효과적으로 사용할 수 있다.
코루틴에서 데이터 스트림을 구현하기 위해서의 구성요소는 다음과 같다.
- Producer(생산자)
- Intermediary(중간 연산자) - 선택사항
- Consumer(소비자)
Producer(생산자)
먼저 생산자에서는 데이터를 발행하기 위하여 flow {}
코루틴 블록(빌더)을 생성한 후 내부에서 emit()
을 통하여 데이터를 생성한다. 또한 flow {}
블록은 suspend 함수이므로 delay를 호출할 수 있다.
fun flowSomething(): Flow<Int> = flow {
repeat(10) {
emit(it) // 0 1 2 3..9
delay(100L) // 100ms
}
}
Flow 빌더
- 앞서
flow {}
를 사용하는 것이 가장 기본적인 플로우 빌더이다. emit()
이외에asFlow()
를 통하여 Collection 및 Sequence를 Flow로 변환 할 수 있다.
// Int 배열
(6..10).asFlow().collect { value ->
println(value)
}
Intermediary(중간 연산자)
생산자에서 데이터를 발행을 하였다면 중간 연잔자는 생성된 데이터를 수정 할 수 있다. 대표적으로 코틀린의 컬렉션의 함수와 같이 대표적으로 map(데이터를 원하는 형태로 변환), filter(데이터 필터링), onEach(데이터를 변경후 수행한 결과를 반환) 등이 있다.
// Filter
flowSomethings().filter {
// 짝수만 필터링
it % 2 == 0
}
// map
flowSomethings().map {
// 각 데이터를 2배씩
it * 2
}
.
.
Consumer(소비자)
마지막으로 생산자에서 데이터를 발행하고, 중간 연산자(선택)에서 데이터를 가공하였다면 소비자에서는 collect()
를 이용하여 전달된 데이터를 소비할 수 있다.
fun main() = runBlocking {
flowSomething().map {
it * 2
}.collect { value ->
println(value)
}
}
// 0 2 4 6 8 .. 18
댓글남기기