2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

switchMap과 mergeMap의 차이는 무엇인가요?

_____
Q1: switchMap과 mergeMap이란 무엇인가요?
A1: switchMap과 mergeMap은 RxJS에서 사용할 수 있는 고차 연산자로, Observable이 방출하는 값을 기반으로 새로운 Observable을 생성하고, 그 결과를 합성하는 데 사용됩니다.

Q2: switchMap과 mergeMap의 기본 동작 방식은 어떻게 다른가요?
A2:
- mergeMap 은 소스 Observable이 방출하는 각각의 값을 모두 내부 Observable로 매핑하고, 이들 내부 Observables의 방출값을 병합하여 모두 방출합니다. 즉, 여러 내부 Observable들이 동시에 활성화될 수 있습니다.
- switchMap 은 소스 Observable이 새로운 값을 방출할 때마다 이전에 생성된 내부 Observable을 취소(구독 해지)하고, 최신 내부 Observable만 구독하여 그 결과만 방출합니다.

Q3: switchMap과 mergeMap의 주요 차이점은 무엇인가요?
A3:
- 구독 취소 행위
- switchMap: 새 값이 소스 Observable에서 방출되면 이전 내부 Observable을 즉시 취소합니다.
- mergeMap: 모든 내부 Observable을 취소하지 않고 동시에 모두 구독한 상태로 유지합니다.
- 동시 실행 가능 여부
- switchMap: 한 번에 하나의 내부 Observable만 활성화됩니다.
- mergeMap: 여러 내부 Observable이 병렬로 동시에 실행됩니다.

Q4: 언제 switchMap을 사용하면 좋은가요?
A4: 이전 요청이 불필요해지는 상황, 즉 사용자가 입력값을 빠르게 바꾸고 그에 대한 이전 요청을 무시해야 하는 경우에 적합합니다. 예를 들어, 사용자 검색어 자동완성, 타입어헤드 검색 등에서 사용합니다.

Q5: 언제 mergeMap을 사용하는 것이 좋은가요?
A5: 모든 내부 Observable의 결과를 병렬로 처리해서 각 결과를 모두 받아야 할 때 적합합니다. 예를 들어, 여러 개의 독립적인 HTTP 요청을 동시에 보내고 각각의 결과를 모두 처리할 때 사용합니다.

Q6: switchMap과 mergeMap의 사용 예시
- switchMap 예시
```typescript
inputObservable.pipe(
switchMap(value => http.get(`api/search?q=${value}`))
)
```
사용자가 입력을 바꿀 때마다 이전 요청을 취소하고 최신 요청 결과만 받음.
- mergeMap 예시
```typescript
clicks.pipe(
mergeMap(() => http.get('api/data'))
)
```
클릭 시마다 API 호출을 병렬로 실행하고 모든 결과를 방출.

Q7: 성능과 메모리 측면에서 차이는 있나요?
A7: switchMap은 이전 내부 Observable을 취소하므로 불필요한 작업을 줄이고 메모리 누수 위험이 적습니다. 반면, mergeMap은 내부 Observable이 많아질 경우 동시 구독 수가 많아져 자원을 더 많이 소비할 수 있습니다.

Q8: 동시 실행 제한이 필요한 경우 어떻게 하나요?
A8: mergeMap은 두 번째 인자로 동시 실행(concurrency) 수를 설정할 수 있습니다. 예: `mergeMap(fn, concurrency)`
switchMap은 동시 실행이 1로 고정됩니다.

---

요약:
- switchMap : 새 값이 들어올 때마다 이전 내부 Observable을 취소 → 최신 값만 처리
- mergeMap : 소스의 모든 값을 내부 Observable로 변환해 병렬 실행 → 모든 결과 병합
상황에 맞게 적절한 연산자를 선택해야 합니다.
switchMap과 mergeMap은 둘 다 RxJS에서 사용하는 연산자로, 모두 소스 옵저버블에서 방출된 값을 받아 내부에서 새로운 옵저버블을 만들고, 그 내부 옵저버블에서 방출되는 값을 다시 방출하는 역할을 합니다.

하지만 내부 옵저버블을 처리하는 방식에서 중요한 차이가 있으며, 이 차이가 두 연산자의 동작과 사용처를 구분짓습니다.

1. switchMap switchMap은 소스 옵저버블에서 새로운 값이 방출될 때마다 이전에 생성된 내부 옵저버블을 "취소"하거나 구독을 "해지"하고, 새로운 내부 옵저버블로 전환합니다.

즉, 이전 내부 옵저버블의 결과는 더 이상 방출되지 않으며 무시됩니다.

이 특성 때문에 switchMap은 일반적으로 "가장 최근의 요청만 처리하고 이전의 것은 무시해야 하는 상황", 예를 들어 사용자가 입력하는 실시간 검색(auto-complete) 기능에 주로 사용됩니다.

빠르게 여러 값을 방출해도 마지막에 방출된 값에 해당하는 내부 옵저버블만 처리하고, 이전에 요청한 데이터들이 도착하더라도 무시하기 때문에 불필요한 작업이나 오래된 데이터 처리를 막을 수 있습니다.



2. mergeMap 반면에 mergeMap은 소스 옵저버블에서 방출된 각 값을 모두 내부 옵저버블로 매핑하고, 이 내부 옵저버블에서 방출되는 값들을 모두 병합하여 동시에 방출합니다.

내부 옵저버블 구독을 취소하지 않고 모두 유지하며 모든 내부 옵저버블의 결과를 처리합니다.

즉, 병렬로 여러 내부 옵저버블을 실행시키고 그 결과를 하나의 스트림으로 합칠 때 사용됩니다.

예를 들어, 여러 개의 API 요청을 동시에 보내고 응답을 모두 받고자 할 때 적합합니다.

각 요청은 독립적으로 처리되고 그 결과가 늦게 도착해도 모두 방출됩니다.

--- 요약 - switchMap : 이전 내부 옵저버블을 취소하고 가장 최근의 것만 구독하기 때문에, 마지막 값만 중요하거나 이전 작업을 무시해야 할 때 사용한다.

(예: 실시간 검색) - mergeMap : 모든 내부 옵저버블을 유지하며 병렬로 처리하고, 모두의 결과를 방출한다.

(예: 여러 API 요청 동시 처리) 따라서, 두 연산자 선택은 "이전에 수행된 비동기 작업을 무시해도 되는가?"와 "모든 비동기 작업 결과를 처리해야 하는가?"의 여부에 따라 결정됩니다.

작성자: 정다현 [비회원] | 작성일자: 1년 전 2025-05-25 12:51:21
조회수: 188 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.