안드로이드/Flow

[android/안드로이드] flow flatMapConcat 사용하기

최효식 2022. 8. 6. 20:42

 

  • flatMapConcat

 

flatMapConcat 은 flow 간의 연결이 필요할 때 사용하는 연산자 입니다.

아래에서 예시를 들어보겠습니다.

 

 

 

먼저 클린 아키텍처 구조에 viewModel 에서 api 를 호출하는 경우라고 생각하겠습니다.

 

서버로부터 token을 가져와서 token을 실어서 다른 api 를 호출하는 경우라고 생각해보겠습니다.

 

그렇다면,

1. token 을 가져오는 api 하나

2. token 을 실어서 호출하는 api 하나

 

이렇게 두가지의 데이터 스트림을 형성해야 합니다.

즉 , flow 가 두개가 필요하고 이 flow들을 순서대로 연결하기 위해 flatMapConcat을 사용해보겠습니다.

 

    @Test
    fun `FlatMapConcat 테스트`() = runTest {
        
        /** 서버로부터 token 을 가져오는 flow */
        val flow1 = flow<String> { emit("token") }

        /** flow1 으로부터 token 을 받아서 새로운 flow 에 넣어준다. */
        val flow2 = flow1.flatMapConcat { token ->
            flow {
                emit("$token result")
            }
        }
            /** 새로운 flow 로부터 collect을 통해 데이터를 소비한다. */
            flow2.collectLatest {
                println(it)
            }
    }

 

flow1 : 서버로부터 token을 가져오는 데이터 스트림

flow2 : flow1으로부터 받아온 token을 싣는 새로운 데이터 스트림 (위에선 예제로 token을 그대로 emit에 넣었습니다. 전달받은 token이 잘 출력되는지 보기위해서 말입니다. 실제 구현이었다면 Usecase(token = token) 에 실어서 api를 호출하여 response 데이터를 flow에 emit 했을 것입니다.)

 

collectLatest 를 통해 출력한 결과는

 

 

잘 나왔습니다. 위에서는 flow를 블럭별로 변수를 나누어 본것이며 나눌 필요 없이

 

    @Test
    fun `FlatMapConcat 테스트`() = runTest {

        flow<String> {
            emit("token")
        }.flatMapConcat { token ->
            flow {
                emit("$token result")
            }
        }.collectLatest {
            println(it)
        }
    }
}

붙여서 호출을 해도 잘 작동합니다.

 

 

하지만! flatMapConcat 에도 주의해야 할점이 있습니다.

새로운 flow를 생성하는데 시간이 오래걸린다면 처음 flow를 생성하는 시점은 빠른데 새로운 flow를 생성하고 발행하는데 느려서 첫 데이터 생성과 최종적으로 소비하는 시점의 시간 차가 많이 발생하게 됩니다.

배압 처리의 문제가 발생할 수 있다고 생각하시면 될거 같습니다.

 

그래서 collectLatest 처럼 flatMapLatest 를 다음글에서 알아보겠습니다.

 

 

'안드로이드 > Flow' 카테고리의 다른 글

[android/안드로이드] Flow 란?  (0) 2022.08.02
[android/안드로이드] LiveData VS StateFlow  (0) 2022.07.27