어질어질 개발노트/Android
[Android] RxJava: flatMap vs switchMap - 차이를 명확히 이해하기
tia.mom
2025. 1. 10. 22:43
반응형
RxJava는 비동기 작업을 효율적으로 처리하기 위한 강력한 라이브러리로, 다양한 연산자를 제공합니다. 특히 flatMap과 switchMap은 데이터 스트림을 변환하고 결합하는 데 매우 유용한 연산자입니다. 하지만 이 두 연산자는 서로 다른 동작 방식을 가지고 있으며, 사용 목적도 다릅니다. 이 글에서는 두 연산자의 차이와 사용 사례를 자세히 살펴보겠습니다.
flatMap이란?
flatMap은 원본 Observable에서 방출된 각 항목을 새로운 Observable로 변환하고, 생성된 모든 Observable에서 방출된 데이터를 병합하여 단일 스트림으로 제공합니다.
주요 특징:
- 모든 Observable 데이터를 병합: 모든 데이터 스트림을 병렬로 처리합니다.
- 순서가 보장되지 않음: 데이터 처리 순서는 원본 스트림의 순서를 따르지 않을 수 있습니다.
사용 사례:
- 병렬로 실행되는 여러 비동기 작업을 처리할 때 적합합니다.
- 예: 여러 API 요청을 병렬로 실행한 후 결과를 하나로 합치는 작업.
예제 코드:
Observable.just("A", "B", "C")
.flatMap(item -> Observable.just(item)
.delay(100, TimeUnit.MILLISECONDS)
.map(data -> "Processed " + data))
.subscribe(result -> System.out.println(result));
출력 예:
Processed A
Processed B
Processed C
처리 순서는 보장되지 않을 수 있습니다.
switchMap이란?
switchMap은 원본 Observable에서 새로운 항목이 방출되면 이전 항목의 Observable을 취소하고 새로운 Observable로 전환합니다.
주요 특징:
- 최신 항목만 처리: 이전 항목에 대한 처리를 중단하고 새로운 항목으로 전환합니다.
- 단일 데이터 스트림 유지: 항상 최신 데이터만 방출됩니다.
사용 사례:
- 최신 상태나 이벤트만 처리해야 할 때 유용합니다.
- 예: 검색 필드에서 실시간으로 사용자의 최신 검색어만 처리.
예제 코드:
Observable.just("A", "B", "C")
.switchMap(item -> Observable.just(item)
.delay(100, TimeUnit.MILLISECONDS)
.map(data -> "Processed " + data))
.subscribe(result -> System.out.println(result));
출력 예:
Processed C
이전 작업이 취소되고 가장 마지막 항목만 처리됩니다.
flatMap vs switchMap 차이점
특징 | flatMap | switchMap |
동작 방식 | 모든 Observable의 데이터를 병합하여 처리 | 최신 Observable로 전환하고 이전 데이터를 취소 |
사용 사례 | 여러 비동기 작업을 병렬로 처리해야 할 때 | 최신 상태만 처리하거나 이전 데이터를 무시할 때 |
순서 보장 | 보장되지 않음 | 최신 데이터만 처리 |
실제 사용 사례
flatMap을 활용한 병렬 API 호출
여러 사용자 ID로 동시에 데이터를 가져오고 싶을 때:
Observable.fromArray(1, 2, 3)
.flatMap(id -> apiService.getUserData(id)) // 병렬로 호출
.subscribe(data -> System.out.println(data));
switchMap을 활용한 실시간 검색
검색어가 바뀔 때마다 최신 검색 결과만 가져오고 싶을 때:
searchInputObservable
.switchMap(query -> apiService.search(query)) // 이전 검색 요청은 무시
.subscribe(result -> System.out.println(result));
결론
flatMap과 switchMap은 RxJava에서 데이터 스트림을 처리하는 데 필수적인 연산자입니다. 프로젝트의 요구 사항에 따라 적절한 연산자를 선택하여 비동기 작업을 효율적으로 처리할 수 있습니다.
- 여러 비동기 작업을 병렬로 처리하려면 flatMap.
- 최신 데이터만 처리하려면 switchMap.
RxJava를 깊이 이해하고 활용하면 더욱 생산적인 개발이 가능해질 것입니다.
반응형