본문 바로가기
Android 개발/Coroutine , Flow, Channel

flatMapLatest 이용해서 값이 들어오는 것을 기다리기 # Coroutine

by Developer88 2023. 4. 18.
반응형

오늘은 flapMapLatest 를 활용해서 특정한 값이 들어오는 것을 기다리다가,

값이 들어오면 특정 코드를 실행시키는 방법에 대해서 정리해 보겠습니다.

물론, Coroutine 의 supsend 함수를 이용하면 어려운 일은 아니지만,

만약, Global 한 변수에 들어오는 값에 대해서라면 조금 다른 접근이 필요하기 때문입니다.

 

1. FlatMapLatest

이 API는 Kotlin Coroutine 의 Flow API인데요.

Flow에서 흘러나오는 데이터 스트림에서, 가장 최근의 값만 취하기 위해서 만들어 졌습니다.

새로운 값이 흘러나오면 기존 flow는 cancel 시켜버리도록 되어 있습니다.

 

 

2. 값이 들어오는 것 기다리기 구현

가장 최근 값이 들어오는 것을 기다릴 때도, flatmapLatest 는 유용한데요.

 

아래 코드는 itemId 값이 변경되서 들어오면 실행하기 위해서 작성된 코드입니다.

처음에는 유효하지 않은 ID값으로 초기화 되어있는 item이 MutableStateFlow 타입으로 존재하구요.

 

itemId 값이 initialize 되는 시점을 모를 때, 아래와 같이 observe 하고 있다가,

flatMapLatest 을 이용해 최신 값을 기준으로 코드를 실행시키도록 할 수 있습니다.

 

만약 초기값이 다시 흘러 들어오는 것을 막으려면, 아래와 같이  filter operator를 추가해주면 확실하게 방어가 됩니다.

 

private val _itemId = MutableStateFlow<Long>(EMPTY_ID)
val itemId = _itemId.asStateFlow()

val items: Flow<Long> = 
    itemId.filter { it != EMPTY_ID }
          .flatMapLatest { itemId ->
              itemRepository.getItem(itemId)
           }

 

 

값이 들어오는 것을 기다리는 것에는 여러가지 구현 방법이 있겠지만,

그 중 FlatMapLatest를 이용하는 것도 괜찮은 방법이라고 생각이 됩니다.

 

3. Experimental

Kotlin의 Coroutnine에서는 널리 사용되고 있음에도 불구하고,

experimental 딱지를 붙이고 있는 API들이 있는데요.

그 중 하나가 flatMapLatest 입니다.

 

 

사실상 널리 사용되고 있는 것으로 알려져 있어서,

크게 API 를 변화시키지는 않을 것으로 보이는데요.

 

 

그래도 조심해서 나쁠 것은 없으니,

프로덕트 레벨에 적용할 때는 주의가 필요 합니다.

대체할 수 있는 API로는 switchMap 이 있는데요.

다만, 해당 API는 현재는 Deprecated 되었습니다.

728x90

댓글