Coroutine 에 대해서는 몇번 포스팅 한 적이 있다.
오늘은 Coroutine 에 있는 Flow 라는 놈에 대해서 한번 적어볼까한다.
리액티브 프로그래밍을 지원하기 위해 탄생했는데 Rx에서 볼 수 있는 개념인 데이터스트림을 담당하고 있다.
리액티브 프로그래밍은 데이터가 변경 될 때 이벤트를 발생시켜서 데이터를 계속해서 전달받는 방식을 말하는데
기존의 명령형 프로그래밍과는 완전히 다른 느낌이다.
보통 여기서 데이터스트림이 나오는데 이는 데이터를 발행하는 발행자가 있고 발행자는 데이터의 소비자에게
지속적으로 데이터를 전달하는 흐름을 말한다.
본론으로 들어가서 Coroutine Flow 는 그럼 어떻게 되는데? 에 대해서 보자.
구성요소는 크게 3개로 나눠볼 수 있겠다.
1. 생산자 -> 데이터를 데이터 스트림에 처음 공급하는 역할
2. 중간 연산자 -> 날것의 데이터를 상황에 맞는 형태로 변환 시키는 역할
3. 소비자 -> 만들어진 데이터를 스트림에서 받아서 사용하는 역할
생성자는 기본적으로 이렇게 만든다.
class dataSource(private val api : Api){
fun makeFlow() : Flow<List<String>> = flow{ // flow 블럭 만들기
while(true){
val testFlow = api.getStringinfo() //데이터 받아오기
emit(testFlow)
}
}
}
flow {} 블럭을 선언하고 -> api 통신을 통해 서버에서 받아오고 -> 받아온 데이터를 emit 을 통해 생성자가 데이터를 발행하도록 한다. Flow의 형태로 데이터를 계속 발행 할 수 있게 생성하는걸 볼 수 있다.
그럼 이렇게 계속 생성되는 데이터들을
중간연산자는 어떻게 다룰까?
먼저 중간연산자가 위에서 '날것의 데이터를 상황에 맞는 형태로 변환 시키는 역할' 이라고 적어뒀는데
RxJava 를 써본 사람이라면 map , filter 같은 연산자를 본적이 있을텐데 여기서도 비슷하다고 생각하면 된다.
받아온 데이터 전체가 필요한게 아닌 특정 데이터들만 View에서 보여주고 싶다면 이걸 사용하면 된다.
이 과정이 필요없다면 중간연산자를 꼭 사용하지는 않아도 된다.
class dataSource(private val api : Api){
fun makeFlow( text : String) : Flow<List<String>> = flow{ // flow 블럭 만들기
while(true){
val testFlow = api.getStringinfo().map{it.filter{ this[0] == 'a')}}//첫글자가 a인 string 만 가져오도록 가공
emit(testFlow)
}
}
}
이런 식으로 쓸 수 있는데 테스트 안해보고 바로 적은 코드라 문제가 오류가 있을수도 있다.
대충 이런 느낌이구나 하고 이해하면 될 것 같다.
그럼 이제 데이터를 사용하는 소비자를 알아보자.
보통 UI 파트에서 데이터를 소비하게 된다.
사용하고자 하는 곳에서
viewModelScope.launch{
makeFlow("a").collect{
it -> //
}
}
이렇게 collect 라는 키워드를 통해서 가능하다. 코드를 간략하게 적었지만
1. 코루틴을 호출할 스코프 블럭을 만든다.
2. 생성자가 만들어준 flow 를 가져오고 (여기서는 makeFlow 함수)
3. 2에서 가져온 함수의 리턴으로 받아오는 flow 에 collect를 사용해서 데이터에 접근한다.
이런 순서다.
위의 설명들은 아주 간략한 설명이고 flow 를 사용하면서 발생 할 수 있는 문제들은 아직 남아있다.
추후 포스팅에서 다뤄보겠다.
'Android > Coroutine' 카테고리의 다른 글
코루틴에 관한 50가지 질문과 답 - 1 (0) | 2023.07.10 |
---|---|
StateFlow 원시성 보장하기 (1) | 2022.09.19 |
코루틴의 job 과 Deferred 의 차이 (0) | 2022.03.26 |
코루틴의 suspend 에 대해서 (0) | 2022.03.15 |
안드로이드 코루틴 flow의 StateFlow 와 SharedFlow (0) | 2022.03.05 |
Android Coroutine Flow - 2 (실제로 써보기) (0) | 2022.02.11 |