Flow 이해하기 1
Flow는 Coroutine에서 사용가능한 비동기 스트림 입니다.
스트림이란?
사전적 의미는 하나의 "흐름" 입니다.
Flow를 사용하면서 가장 기초적이고 중요한 것은 발행자와 구독자라고 생각합니다.
이번 포스팅은 발행자와 구독자의 사이 그리고, 값을 보내는 방법 정도까지만 알아보겠습니다.
Flow는 발행자가 구독자에게 데이터를 흘려보냅니다.
Coroutine을 같이 공부한 것 처럼 Flow도 예제 하나하나 보면서 어떻게 흘려보내고 어떤 연사자를 사용하면 발행한 값이 어떻게 변형이 되는지 같이 알아보아요.
우선 첫번째로 Flow를 사용하는 방법과 발행자와 구독자가 어떻게 생겼는지 아래 코드로 알아보겠습니다.
fun flow(): Flow<Int> = flow {
emit(10)
}
fun main() = runBlocking {
flow().collect { value ->
println(value)
}
}
//결과
10
위 코드에서는 딱 3가지만 알아보겠습니다.
발행자가 누구인가?, 구독자는 누구인가?, 발행을 어떻게 했는가? 이렇게 3가지요.
우선 발행자는 함수 flow()입니다.
flow는 emit을 통해서 값을 구독자에게 보낼 수 있습니다.
위 코드에서는 emit이라는 함수를 통해서 10이라는 값을 흘려 보내고 있습니다.
그럼 구독은 어디서 일어나고 있을까요?
정답은 main함수 입니다.
구독은 main함수에서 collect를 함으로써 emit한 10 이라는 값을 받았고 이를 print하였습니다.
collect는 flow가 방출하고 있는(emit 하고 있는) 값을 받을 수 있습니다.
flow를 선언하는 방법은 위 flow()함수처럼 사용하면 됩니다.
flow() 빌더를 통해 리턴함으로써 발행자는 값을 emit을 통해 구독자에게 값을 보내줄 수 있고, 구독자는 flow가 리턴한 값들을 상황에 맞게 여러 연산자를 이용하여 발행자로 부터 받은 값을 가공할 수 있는 것이죠.