성장기록지

Kotlin Flow란? 본문

안드로이드/안드로이드 지식

Kotlin Flow란?

pengcon 2025. 1. 24. 12:46

1. Flow란?

  • Flow는 Kotlin의 코루틴 라이브러리에서 제공하는 API로, 비동기 데이터 스트림을 처리하기 위한 도구이다.
  • Flow는 콜드 스트림(cold stream)으로 작동하며, 데이터가 필요할 때만 스트림을 생성하고 실행한다. 

2. Flow - cold Stream 

Flow는 구독(subscribe)하기 전까지 실행되지 않으며, 데이터 흐름을 생성하지 않는다.

이는 Lazy evaluation과 비슷한 개념으로, 사용자가 Flow를 구독할 때 비로소 스트림이 시작된다. 

Flow가 cold Stream이기에 얻는 특징들은 다음과 같다.

  • 데이터가 내부에서 생성된다.
  • 소비자가 소비를 시작할 때 데이터를 생산한다.
  • Cold Stream은 하나의 생산자에 하나의 소비자만 존재한다. (UniCast)

Flow가 cold Stream으로 갖는 특징에 대한 예시들은 바로 이전글에 작성하였으니 참고하면 좋을것이다.


3. Flow - 비동기 데이터 흐름

Flow는 코루틴 기반으로 작동하며, 데이터의 비동기 처리에 적합하다.

아래의 예시를 보면서 확인해보자.

fun exFlow(): Flow<Int> = flow {
    for (i in 1..3) {
        delay(100)
        emit(1)
    }
}

 

suspned 선언이 없어도 flow는 delay(100)를 활용하고 있는 모습을 볼 수 있다.

이는 flow의 내부 블록이 suspend로 되어있기 때문이고, flow는 아래와 같이 설명이 되어있다.

 

 

  • 주어진 suspendable 블록으로부터 콜드(Cold) Flow 를 생성한다고 적혀있다.
  • Flow가 cold하다는 것은, Flow에서 정의된 코드가 Flow의 최종 연산자(terminal operator) 가 호출될 때마다 다시 실행된다는 것을 의미한다고도 적혀있다.
  • 설명처럼 flow를 반환하는 함수는 비동기 작업을 정의할 뿐, 실제로 수행하지는 않는다.
  • 그렇기 때문에 exFlow()에는 suspend 키워드가 붙지 않는다.
  • 또한 최종 연산자인 collect에는 아래와 같이 suspend가 붙어있다.

 

 

4. Flow - Structured Concurrency 

  • Flow의 수명과 실행이 항상 호출된 Coroutine Scope에 종속된다는 것을 의미한다.
  • Flow의 모든 작업은 현재 Coroutine Scope의 lifecycle에 따라 관리된다.
  • exFlow()를 활용한 main 함수 예시를 봐보자.
fun main() = runBlocking {
    val flow = exFlow()
    flow.collect { value ->
        println(value)
    }
}

 

  • 예시코드에서 runblocking을 통해 생성된 Coroutine Scope 안에서 flow가 관리되어진다.
  • collect가 호출되어 실행되면, 해당 스코프 내에서 모든 flow 작업이 실행된다.
  • flow가 실행되는 코루틴이 취소 될 시에 flow에 의해 실행된 모든 자원들이 자동으로 정리된다.

5. flow 구조

producer(생산자)

  • flow builder가 속해져 있다.
  • DataStore,Retrofit,Room,WorkManager 등에서 flow반환형을 지원하고 있다
  • 때문에 flow builder를 사용할 일은 많이 없다.

intermidiary(중간 연산자)

  • flow의 데이터 스트림을 여러 단계에서 걸쳐 조작할 수 있는 Api를 제공한다.
  • suspend 함수 호출이 가능하다.
  • map,filter와 같은 다양한 연산자들과 결합해 복잡한 데이터들을 처리한다.

Consumer(최종 연산자)

  • 값을 소비하는 유일한 방법이다.
  • collect, toList()등을 활용한다. 
  • Flow의 데이터를 소비하는 중요한 역할이다. 

안드로이드에서의 Flow 구조

공식문서에는 아래와 같이 설명되어있다.

해석하여 정리하자면 아래와 같다.

 

  • Repository(data layer)
    • Flow의 emit 역할을 담당하며, 데이터를 생성하여 스트림으로 방출한다.
    • ex) 네트워크에서 데이터를 가져오거나, 로컬 데이터베이스에서 쿼리하여 Flow로 데이터를 제공.
    • 생산자의 역할을 한다.
  • UI 계층 
    • Flow의 collect 역할을 수행하여 소비자의 역할을 한다. 
    • 사용자 입력 이벤트를 생성시킬 땐 생산자의 역할을 하기도 한다.
    • 방출된 데이터를 구독하여 화면에 표시하거나, 사용자와의 상호작용에 따라 데이터를 반영한다.
  • 중간 계층 (변환자)
    • Flow의 intermediate operators (map, filter, transform 등)에 해당하며, 데이터를 변환하거나 필터링하여 다음 계층의 요구사항에 맞도록 조정한다..

 

 

 

 

참고 자료

https://developer.android.com/kotlin/flow

 

Android에서의 Kotlin 흐름  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Android에서의 Kotlin 흐름 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 코루틴에서 흐름은 단일 값만

developer.android.com