비동기 병렬 처리는 성능 향상에 큰 도움이 되지만,
데이터의 처리 순서가 중요한 상황도 많습니다.
예를 들어 데이터베이스 작업이나 파일 처리와 같이 순서가 중요한 작업에서는 순차적 처리가 필수적이지요.
RxJava에서는 이러한 순차적 처리를 보장해주는 concatMap 연산자를 제공해 주는데요.
오늘은 이를 살펴보고,
비동기 처리에 사용하는 flatMap과 비교하며 이해해 보겠습니다.
1. concatMap 의 특징
1-1. 순서보장과 순차적 실행
concatMap은 실행순서에 있어서 다음과 같은 특징을 가지고 있습니다.
- 원본 Observable의 항목 순서를 엄격히 유지
- 원본 Observable에서 방출된 각 항목에 대해 생성된 Observable들을 순차적으로 실행
- 이전 Observable이 완료된 후에만 다음 Observable을 구독
- 결과 스트림의 항목들도 원본 Observable의 순서와 동일하게 방출
핵심은 순서입니다.
순차적으로, 동기적으로 코드를 실행해줍니다.
다만 flatMap에 비해서 상대적으로 느릴 수 있는데요.
이는 병렬 처리가 아닌 순차 처리이기 때문입니다.
코드를 보면 아래와 같습니다.
Observable
.just("정군", "이군", "박군");
.concatMap(name -> doSomethingAsyncWork(name))
.subscribe(
result -> System.out.println(result),
error -> System.err.println(error),
() -> System.out.println("Completed")
);
1-2. 비동기 작업에 유용
concatMap은 각 항목에 대해 비동기 작업을 수행하면서도 순서를 유지해야 할 때 유용합니다.
네트워크 요청이나 데이터베이스 쿼리와 같은 비동기 작업들을,
순차적으로 처리해야 할 때 유용합니다.
예를 들어, 첫 번째 API 호출의 결과를 사용하여,
두 번째 API를 호출해야 하는 경우에 적합합니다.
2. flatMap과의 차이점
concatMap이 순차적 처리에 유용하다면,
flatMap은 독립적인 비동기 작업을 병렬로 처리하고자 할 때 유용한데요.
둘의 차이를 표로 비교해 보겠습니다.
concatMap | flatMap |
원본 Observable의 순서를 엄격히 유지 | 병렬처리로 순서를 보장하지 않음 |
이전 Observable이 완료된 후, 다음 Observable을 구독 |
여러 Observable을 동시에 구독하고, 병렬로 실행 |
순차 처리로 인해, flatMap보다상대적으로 느릴 수 있음. |
병렬 처리로 인해 일반적으로 더 빠름. |
한 번에 하나의 Observable만 처리하므로, 메모리 사용이 효율적 |
여러 Observable을 동시에 처리하므로, 메모리 사용량이 더 높을 수 있음. |
순서가 중요한 작업이나, 이전 작업의 결과가 다음 작업에 영향을 미치는 경우에 적합 |
독립적인 비동기 작업을 병렬로 처리하고자 할 때 유용 |
다시 한번 정리해 보면,
concatMap은 순서를 보장하고 순차적으로 처리하는 반면,
flatMap은 순서를 보장하지 않지만 병렬 처리로 더 빠른 실행이 가능합니다.
작업의 특성과 요구사항에 따라 적절한 연산자를 선택해야 하는 것 이지요.
'Android 개발 > RxJava, RxAndroid' 카테고리의 다른 글
RxJava CompositeDisposable의 clear()와 dispose()의 차이점 (0) | 2024.11.15 |
---|---|
RxJava fromAction()과 andThen() 으로 구현하는 순차적 실행 코드 (0) | 2024.11.08 |
RxJava flatMapCompletable 과 flatMap + ignoreElement 조합의 차이 이해하기 (0) | 2024.11.02 |
RxJava ignoreElements() 연산자에 대한 이해 (1) | 2024.10.30 |
댓글