서론
Android viewmodel을 활용하여 개발을 하던 중 LiveData를 잘 사용하고 있었다. 다른 개발자들의 코드를 보니 LiveData뿐만 아니라 Flow를 활용하는 경우도 많았다. 아직 Flow가 익숙하지 않아서 한번 간단하게 정리해보려 한다.
Flow란?
Coroutine의 Flow는 데이터 스트림이며, 코루틴 상에서 리액티브 프로그래밍을 지원하기 위한 구성요소이다.
- 리액티브 프로그래밍이란 데이터가 변경될 때 이벤트를 발생시켜서 데이터를 계속해서 전달하도록 하는 프로그래밍 방식을 뜻함
[CS] 프로그래밍 패러다임에 관해
서론 최근 Android 개발을 진행하던 중 함수형 프로그래밍, 리액티브 프로그래밍 등 다양한 용어들을 접하게 되어 프로그래밍 패러다임에 대해 정리해보려 한다. 프로그래밍 패러다임이란? 프로
ystech.tistory.com
추가 정보는 이전 포스팅 참고
flow는 단일 값만 반환하는 정지 함수와 달리 여러 값을 순차적으로 내보낼 수 있는 유형이다. 보통, API 통신이나 데이터베이스에서 실시간 업데이트를 수신할 때 쓰인다.
데이터 스트림 구성 요소
테이터 스트림은 아래 3가지로 구성되며, 이 세 가지가 flow의 핵심 구성요소이다.
- Producer(생산자)
- Intermediary(중간 연산자)
- Consumer(소비자)
Producer(생산자)
생산자는 데이터를 생성하는 역할을 한다. Flow에서 Producer는 flow {} 불록 내부에서의 emit()을 통해 데이터를 생성한다. Android 상에서 생산자가 가져오는 DataSource는 위에 언급한 API 통신, DB에서 가져오는 데이터 2가지 정도이다.
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun produceNumbers(): Flow<Int> = flow {
for (i in 1..5) {
delay(1000) // 1초마다 데이터 생성
emit(i) // 데이터 발행
}
}
fun main() = runBlocking {
val flow = produceNumbers()
flow.collect { value ->
println(value)
}
}
- 1~5까지 숫자를 1초마다 생성하고 해당 숫자를 Flow로 emit
- 위와 같이 생성하는 부분을 Producer
Intermediary(중간 연산자)
중간 연산자는 생성자가 생성한 데이터를 수정하는 역할을 한다. 클린 아키텍처에서 예로 들자면 data 모듈에서 domain 모듈의 데이터 클래스로 매핑하는 등 다른 객체 데이터로 변환해 주는 역할을 하는 것이다.
대표적인 중간 연산자는 map(데이터 변형), filter(데이터 필터링), onEach(모든 데이터마다 연산 수행) 등이 있다.
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
fun produceNumbers(): Flow<Int> = flow {
for (i in 1..5) {
emit(i)
}
}
fun main() = runBlocking {
val flow = produceNumbers()
flow.map { it * 2 } // 데이터를 2배로 가공
.filter { it % 3 == 0 } // 3의 배수만 필터링
.collect { value ->
println(value)
}
}
- 1~5까지의 숫자를 생성하고 이를 2배로 가공 및 3의 배수만 필터링하여 출력
- 위와 같이 필터링하는 부분을 Intermediary
Consumer(소비자)
중간 연산자가 수정한 데이터를 소비자에게 전달한다. Flow에서는 collect를 이용해 전달된 데이터를 소비할 수 있다.
아키텍처 구조상으로 소비자는 보통 UI 구성요소이다.
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
fun produceNumbers(): Flow<Int> = flow {
for (i in 1..5) {
emit(i)
}
}
fun main() = runBlocking {
val flow = produceNumbers()
flow.collect { value ->
println(value)
}
println("Flow completed")
}
- 1~5까지의 숫자 생성 및 숫자를 Flow로 emit 한 후 모두 소비하여 출력
- 위와 같이 소비하는 부분을 Consumer
Reference
Android의 Kotlin 흐름 | Android Developers
Android의 Kotlin 흐름 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 코루틴에서 흐름은 단일 값만 반환하는 정지 함수와 달리 여러 값을 순차적으로 내보낼
developer.android.com
[Coroutine Flow] 1. Flow란 무엇인가?
Coroutine의 Flow는 데이터 스트림이며, 코루틴 상에서 리액티브 프로그래밍 지원 하기 위한 구성요소이다. 이를 이해하기 위해서는 먼저 리액티브(반응형) 프로그래밍이 무엇인지, 그리고 Flow가 리
kotlinworld.com