[Android / Kotlin] StateFlow와 SharedFlow

Subeen·2024년 3월 11일

Flow

Flow는 비동기 프로그래밍을 위한 API이며 데이터 스트림을 표현하고 비동기 연산을 수행할 때 사용된다.
네트워크 호출, 파일 읽기, 센서 데이터 수집 등과 같은 작업에 유용하다.

  • 데이터 스트림 : 데이터 요소가 순차적으로 발생하는 데이터의 흐름을 의미하며 시간에 따라 연속적으로 발생하는 이벤트나 값들을 나타낸다.
  • Flow를 사용하면 비동기 작업의 결과물을 순차적으로 받아오거나 여러 비동기 작업을 병렬로 처리하면서 결과를 스트림으로 받아올 수 있다.

결론☝🏻 Flow는 데이터의 시퀀스를 효과적으로 처리하고 다루기 위한 도구로 사용 된다.
더 쉽게 정리하면 비동기 작업을 처리하고 여러 값들을 순차적으로 처리할 수 있는 도구라고 생각할 수 있다.

Flow는 일반적으로 비동기 연산의 결과를 연속적으로 처리하는 데 사용된다.
Flow는 값을 생성하고 소비자가 이 값을 비동기적으로 수신할 수 있도록 해준다.

  • Flow의 주요 특징
    • 비동기성 : 비동기적으로 값을 생상하고 소비할 수 있다. UI 스레드를 차단하지 않고 비동기적인 작업을 처리할 수 있다.
    • 취소 가능성 : 코루틴의 취소 기능과 통합되어 있어 불필요한 작업이나 리소스를 취소할 수 있다.
    • 순차 및 병렬 처리 : 순차적으로 값을 처리하거나 병렬로 여러 값을 동시에 처리할 수 있다.
    • 종료 시그널 : 작업이 완료되었음을 나타내는 종료 시그널을 제공하여 소비자에게 작업의 완료 여부를 알려준다.

Flow의 주요 동작을 수행하는 함수

emit

  • Flow에서 값을 생성하고 발생하는데 사용 된다.
  • Flow 빌더 블록 내에서 호출되며 값을 생성하고 해당 값을 flow에 추가한다.
  • Flow는 emit을 통해 발생한 값을 소비자에게 전달한다.
  • 여러 번 호출하여 여러 값 또는 시퀀스를 Flow에 추가할 수 있다.

collect

  • 값을 소비하는데 사용된다.
  • 비동기적으로 호출되며 Flow에서 생성된 값들을 소비한다.
  • Flow의 값은 collect 함수 내에서 제공된 람다 표현식에 따라 처리된다.
  • Flow의 모든 값을 처리할 때까지 블록하며 블록은 코드 실행이 특정 지점에 멈추고 계속 진행되지 않는 상태를 의미한다.

정리☝🏻 emit 으로 값을 Flow에 추가하고 collect로 해당 값을 비동기적으로 소비하며 처리할 수 있다.
Flow는 코루틴과 함께 사용되며 collect 함수가 실행되면 Flow에서 생성된 값이 전달되어 소비자에게 처리된다.

Cold Stream과 Hot Stream

Flow는 기본적으로 Cold Stream의 특성을 가지고 있어 구독자가 새로운 데이터를 요청할 때마다 데이터를 생산하고 전달한다.
그러나 Flow를 사용하여 Hot Stream도 만들 수 있으며 SharedFlow가 예시 중 하나이다.

Cold Stream

Cold Stream은 데이터를 생산하는 측과 소비하는 측 간에 관계가 단방향이다.
생산자가 데이터를 생성하고 소비자는 이를 소비한다.
✨ Cold Stream에서 새로운 데이터가 생산될 때마다 소비자는 처음부터 데이터를 수신한다.

Hot Stream

Hot Stream은 데이터를 공유하고 여러 구독자가 하나의 데이터 스트림을 공유하는 방식이다.
데이터가 생산되면 모든 구독자에게 브로드캐스팅된다.
✨ 이미 생산된 데이터에 새로운 구독자가 가입하더라도 가입 시점 이전의 데이터는 수신할 수 없다.

StateFlow

StateFlow는 단일 값을 가지며 그 값이 변경 될 때마다 새로운 값을 방출한다.
주로 UI 상태를 나타내는데 사용되며 화면의 특정 데이터나 상태가 변경될 때마다 UI를 업데이트 하는 데 유용하다.
StateFlow는 MutableStateFlow 클래스로 시작하여 값을 변경할 수 있는 상태를 제공한다.

SharedFlow

SharedFlow는 여러 수신자 간에 값을 공유할 수 있는 Flow이다.
값을 방출할 때마다 모든 수신자에게 전달되며 각 수신자는 독립적으로 값을 소비할 수 있다.
SharedFlow는 Cold Flow로 간주되어 수신자가 구독할 때마다 값은 생성되지 않는다.

Cold Flow는 데이터를 생성하기 전에 구독자가 등록되지 않는 한 값을 생성하지 않는 Flow의 특성을 나타낸다.
☝🏻 즉, Cold Flow는 구독자가 등록되어야만 데이터가 생성되고 흐름이 시작된다.

✨ 정리하면, SateFlow와 ShardFlow는 Flow를 확장하여 특정 사용 사례에 적합한 플로우의 변경을 제공한다.
StateFlow는 단일 값을 다루는 데 유용하며, SharedFlow는 여러 수신자 간에 값을 공유하는 데 유용하다.
모두 코루틴과 함께 사용되며, UI 상태 관리나 이벤트 처리에 활용된다.

profile
개발 공부 기록 🌱

0개의 댓글