Mobile/RxJava

[RxJava] flatMap, concatMap, switchMap

개발왕 금골드 2023. 7. 26. 22:13
반응형
  • Observable transformation
  • flatMap()
  • concatMap()
  • switchMap()
  • Conclusion

Observable transformation

현재 구독 중인 Observable 객체가 있고 이 객체의 결과 값을 변환해야 하는 경우가 종종 있다. 반드시 확장하고 더 풍부한 객체를 만들기 위함이 아니라, Observable 객체에서 반환되는 각각의 요소들을 merge 하는 과정을 거쳐 이러한 작업을 수행할 수도 있다.

flatMap()

flatMap() 메서드는 Original Observable 함수에서 새로운 Observable 함수를 생성한다. Original Observable에 적용된 결과를 Merge하여 내보낸다. 값을 변환하는 중 새로운 값이 앞으로 끼어들 수 있는데, flatMap은 인터리빙을 허용하기 때문에 순서가 보장되지 않는다. 단순하게 생각했을 때 merge 연산자는 비동기 코드로써 결과값의 순서를 보장할 수 없다. (마블 다이어그램을 보면 두 번째 스레드에 있는 병합된 Observable 결과 값 중 초록색과 파란색 결과가 섞여 있는 것을 볼 수 있다.)

concatMap()

concatMap() 메서드는 flatMap과 거의 유사하지만 리턴 값에 차이가 있다. concatMap은 인터리빙을 막아주고 변환된 값을 순차적으로 내보낸다. flatMap()은 merge 연산자를 사용하지만, concatMap()은 concat 연산자를 사용한다. concat 연산자는 비동기 코드가 아니기 때문에 순서가 중요한 경우 사용하는데, 자칫 잘못 사용하면 비동기 코드를 망치게 된다. (마블 다이어그램을 보면 색깔별로 순서가 보장되는 것을 볼 수 있다.)

switchMap()

switchMap() 메서드는 순서를 보장하기 위해 기존에 계산중이던 값을 중단한다. 설명만 보면 어디다 쓰는 메서드일지 궁금하지만, 처리 값은 중단되더라도 결과 값을 내보내는 것을 보장하기 때문에 최종값만 필요한 센서를 활용한 개발을 할 때 유용하게 쓰인다고 한다. (마블 다이어그램을 보면 초록색 사각형이 처리되던 중 파란색 마름모가 들어오는 것을 볼 수 있다.)

Conclusion

매우 비슷하지만 하나의 가장 큰 차이점은 함수 내부에서 merge된 최종 결괏값이 다르다는 것이다. 간단한 연산이면서 순서가 중요한 경우라면 concatMap()을 사용해야 할 수도 있다. 다만, 주의할 점은 비동기 코드를 망칠 수 있다는 점이다. flatMap()은 비동기로 작동하기 때문에 순서가 중요한 경우는 예상과 다른 결과를 얻게 될 수도 있다. switchMap 역시 과정보다는 최종 값이 중요한 경우 용이하게 사용할 것으로 생각된다. 각자 그 쓰임에 알맞게 사용하기 위해 RxJava에서 제공하는 다양한 연산자에 대해서 공부할 필요가 있다고 생각된다.

 


 

참고자료 :

https://reactivex.io/documentation/operators/flatmap.html

https://fernandocejas.com/2015/01/11/rxjava-observable-tranformation-concatmap-vs-flatmap/

https://beomseok95.tistory.com/32

https://youngest-programming.tistory.com/454

반응형

'Mobile > RxJava' 카테고리의 다른 글

[RxJava] Observable, Single, Completable  (0) 2023.10.18