본문 바로가기
어질어질 개발노트/Android

[Android] RxJava: flatMap vs switchMap - 차이를 명확히 이해하기

by tia.mom 2025. 1. 10.
반응형

RxJava는 비동기 작업을 효율적으로 처리하기 위한 강력한 라이브러리로, 다양한 연산자를 제공합니다. 특히 flatMapswitchMap은 데이터 스트림을 변환하고 결합하는 데 매우 유용한 연산자입니다. 하지만 이 두 연산자는 서로 다른 동작 방식을 가지고 있으며, 사용 목적도 다릅니다. 이 글에서는 두 연산자의 차이와 사용 사례를 자세히 살펴보겠습니다.


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));

결론

flatMapswitchMap은 RxJava에서 데이터 스트림을 처리하는 데 필수적인 연산자입니다. 프로젝트의 요구 사항에 따라 적절한 연산자를 선택하여 비동기 작업을 효율적으로 처리할 수 있습니다.

  • 여러 비동기 작업을 병렬로 처리하려면 flatMap.
  • 최신 데이터만 처리하려면 switchMap.

RxJava를 깊이 이해하고 활용하면 더욱 생산적인 개발이 가능해질 것입니다.

반응형