본문으로 바로가기

[Kotlin] Flow Quick Note

category 개발이야기/Kotlin 2022. 6. 6. 19:49
반응형

이글은 medium의 19 Things to Know About Kotlin Flow - A Quick Note를 번역 및 의역한 글입니다.[1]

https://blog.canopas.com/19-things-to-know-about-kotlin-flow-a-quick-note-1b90eb74f3b0

 

19 Things to know about Kotlin Flow — A quick note

Flow is an asynchronous data stream that sequentially emits values and completes normally or with an exception. (We already know this very…

blog.canopas.com

필요한 경우 위 링크에서 원문 확인이 가능합니다. 다만 여기에서는 각 항목에서 사용된 용어들에 대한 자세한 설명은 따로 링크를 달았습니다. 추가로 몇가지 더하고 싶지만..일단 원문에 있는 항목들만 나열해 봅니다.

1. Flow는 기본적으로 cold stream 이지만, stateIn과 shareIn을 사용하여 hot stream으로 변경할 수 있습니다. [2]

2. StateFlowSharedFlow는 hot stream 입니다. [2]

3. StateFlows는 완료상태가 없습니다. (계속적으로 열려있는 stream임) 또한 초기값이 필요하고 내부적으로는 SharedFlow를 사용합니다.[2]

4. state/shared flow의 모든 method는 thread-safe 하기 때문에 여러 coroutine에 동시에 호출할때 synchronization을 신경 쓸 필요가 없습니다.[2]

5. flow interface는 자신이 hot 또는 cold인지를 구분할 수 있는 정보를 전달하지 않습니다.

6. map, filer, zip 같은 intermeiate operator는 suspend function이 아니기 때문에 flow 내부로직처럼 수행되지 않습니다.
이는 다음 연산을 위한 chain 역할을 할뿐이며, heavy한 작업을 넣지 말아야 하며, 빠르게 값을 return 해야 합니다. [3]

7. 반대로 single, toList, collects등의 terminal operation은 suspend function입니다. 종단 연산자이기 때문에 upstream에서 성공 또는 실패에 대한 결과나 exception을 전달받으면서 완료 됩니다.

8. catch operator로 exception을 handling 할수 있습니다만 이는 downstream에서 발생한 에러까지 처리 하지는 않습니다.[4]

9. StateFlow는 중복된 값을 내부적으로 filtering 합니다.[2]

10. flow는 lifecycle을 인지하지 않습니다. 따라서 UI layer에서 사용하려면 repeatOnLifecycle flowWithLifecycle을 사용해서 UI 상태를 인지하도록 할 수 있습니다.[2]

11. 여러개의 flow를 collect 하는 경우 repeatOnLifecycle를 사용하고, 한개의 flow를 collect할 경우 flowWithLifecycle을 사용하면 됩니다.[2]

12. repeatOnLifecycle을 사용하면 정해진 UI 상태에 맞춰 동작이 제한 되므로 resource낭비를 막을 수 있습니다.[2]

13. SharedFlow는 방송국 같아서 하나의 flow를 여러 수신자가 받는 형태로 동작 합니다. 만약 수신자가 없더라도 계속 data를 계속 broadcasting 합니다.[2]

14. 따라서 SharedFlow는 수신자가 준비된 상태가 아니라면 event를 못받을 수 도 있습니다.[2]

15. flow를 return 하는 function에서는 shareIn과 stateIn을 사용하면 안됩니다. 이는 호출될때마다 새로운 flow를 생성해서 반환하기 때문입니다.[2]

16. shareInstateIn에서 모든 collector가 떨어져 나간 이후에도 upstreamflow를 유지시키고자 한다면 StartedStrategy값을 WhileSubscribed로 설정해 놓으면 됩니다.[2]

17. StartedStrategy에서 EagerlyLazily는 주어진 coroutineScope이 유지되는 한 해당 flow도 계속 살아있을 수 있습니다.[2]

18. onCompletion operator는 exception 처리를 하지 않습니다. 따라서 catch operator를 사용하거나 외부에서 try/catch로 감싸야 합니다.[4]

19. flow{}의 emit과 collect는 동일한 context에서 수행되어야 합니다. 따라서 내부적으로 withContext()를 사용할수 없으며, 대신 flowOn을 사용해야 합니다.[4]

References

[1] https://blog.canopas.com/19-things-to-know-about-kotlin-flow-a-quick-note-1b90eb74f3b0

[2] 2021.12.01 - [개발이야기/Kotlin] - [Coroutine] State flow vs Shared flow with case study

[3] 2019.11.04 - [개발이야기/Kotlin] - [Kotlin] 코틀린 - 코루틴#10- Asynchronous Flow(1/2)

[4] 2019.11.16 - [개발이야기/Kotlin] - [Kotlin] 코틀린 - 코루틴#11- Asynchronous Flow(2/2)

반응형