반응형
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를 깊이 이해하고 활용하면 더욱 생산적인 개발이 가능해질 것입니다.
반응형
'어질어질 개발노트 > Android' 카테고리의 다른 글
[Android] 안드로이드 개발에서 Private 함수 테스트: 실전 팁과 예제 (0) | 2025.01.15 |
---|---|
[Android] Abstract Class vs Interface: 무엇을 선택해야 할까? (0) | 2025.01.14 |
[Android] 클린 아키텍처 (Clean Architecture): 소프트웨어 설계의 정수 (0) | 2025.01.11 |
[Android] Sealed Class와 Enum의 차이점과 적절한 사용법 - Kotlin 개발자를 위한 가이드 (0) | 2025.01.10 |
[Android] ListAdapter vs RecyclerViewAdapter: 무엇을 선택해야 할까? (0) | 2025.01.10 |
[Android] [Kotlin] Compose 기초 - 시작하기 (0) | 2024.08.27 |
[Android] Hilt 적용하기(2) - ViewModel (0) | 2024.06.27 |
[Android] Hilt 적용하기(1) - Hilt란 무엇인가 (1) | 2024.06.26 |