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

switchMap을 사용할 때 발생할 수 있는 에러는 무엇인가요?

_____
Q: switchMap을 사용할 때 주로 발생하는 에러는 무엇인가요?

A: switchMap을 사용할 때 흔히 발생할 수 있는 에러는 다음과 같습니다.

1. Type Error (유형 오류)
- 원인: switchMap 안에서 반환하는 값이 Observable이 아닌 경우 발생합니다. switchMap은 내부 함수가 반드시 Observable을 반환해야 작동합니다.
- 해결법: 내부 함수에서 항상 Observable을 반환하는지 확인하세요. 예를 들어, `of()`, `from()` 등의 연산자를 사용해 Observable을 반환해야 합니다.

2. Memory Leak (메모리 누수)
- 원인: 구독 취소를 하지 않거나, switchMap 내부에서 생성된 Observable이 무한히 흐르는 경우 발생할 수 있습니다.
- 해결법: 컴포넌트가 사라질 때 구독을 적절히 해제하거나, takeUntil 같은 연산자를 사용해 구독을 관리하세요.

3. Unexpected Behavior due to Concurrency
- 원인: switchMap은 이전 Observable을 취소하고 새로운 Observable에 구독하기 때문에, 이전 요청이 의도치 않게 취소되어 결과가 누락될 수 있습니다.
- 해결법: 요청 순서나 취소가 중요한 경우 concatMap, exhaustMap 등 다른 연산자를 고려하세요.

4. Error Propagation Issues
- 원인: 내부 Observable에서 에러가 발생할 때, catchError를 적절히 사용하지 않으면 전체 스트림이 종료될 수 있습니다.
- 해결법: 내부 Observable에서 에러를 처리하거나, switchMap 바깥에서 에러 처리를 구현하세요.

5. Null or Undefined Returns
- 원인: 반환값이 null 또는 undefined일 때 에러가 발생합니다.
- 해결법: 반환값이 항상 Observable인지 확인하고, null 체크를 반드시 하세요.

---

Q: switchMap 내부에서 반환하는 Observable이 제대로 생성됐는지 확인하는 방법은?

A: 내부 함수가 반환하는 값을 `console.log`로 출력하거나 타입체킹을 하며, RxJS 연산자(`of()`, `from()`, `ajax()`) 등을 이용해 Observable을 반환하고 있는지 확인하세요.

---

Q: switchMap 사용시 메모리 누수를 방지하는 방법은?

A: 컴포넌트나 서비스가 소멸할 때 구독을 적절히 취소합니다. Angular에서는 `takeUntil` 조합으로 Destroy 신호를 받아 구독을 해제하고, RxJS 내장 기능을 활용하세요.

---

Q: switchMap을 쓰면서 ‘Cannot read property of undefined’ 같은 에러가 나요. 이유는 무엇인가요?

A: 내부 Observable의 결과가 undefined이거나 null일 때 발생하는 에러입니다. switchMap 내에서 반환되는 데이터를 반드시 null 체크하고, 객체의 프로퍼티 접근 전에 존재 여부를 확인해야 합니다.

---

Q: switchMap이 기존 요청을 취소하는데, 이로 인해 데이터가 누락돼요. 어떻게 하나요?

A: switchMap은 새 Observable이 시작되면 기존 Observable을 취소합니다. 요청 취소가 문제라면 switchMap 대신 concatMap(순차 처리), exhaustMap(첫 요청이 끝날 때까지 무시) 등을 사용하세요. 또는 요청 취소가 필요없는 로직인지 확인해야 합니다.

---

이 외에도 switchMap을 쓸 때는 내부 함수가 항상 Observable을 반환하고, 각 이벤트 스트림이 적절히 관리되고 있는지를 꼼꼼히 체크하는 것이 중요합니다.
switchMap을 사용할 때 발생할 수 있는 주요 에러나 문제 상황들은 다음과 같습니다: 1. 내부 Observable에서 발생하는 에러 미처리 switchMap은 내부에서 새로운 Observable을 구독하면서 값들을 변환합니다.

이때 내부 Observable에서 에러가 발생하면, 기본적으로 전체 스트림이 종료됩니다.

만약 에러 처리를 하지 않으면 전체 스트림이 끊어질 수 있습니다.

따라서 내부 Observable 내에서 적절한 catchError 등의 연산자를 사용하여 에러를 처리하거나, switchMap 외부에서 전체 스트림 에러핸들링을 구현해야 합니다.



2. 비동기 데이터 흐름의 중복 처리 문제 switchMap은 가장 최근에 발생한 Observable만 구독하고 이전 Observable 구독은 취소합니다.

따라서 이전 요청이 완전히 끝나기 전에 새로운 값이 들어오면 이전 요청은 취소됩니다.

만일 실제 API 호출이 이미 서버에서 처리 중이고 네트워크 연결을 취소할 수 없으면, 중복 요청이 발생할 수 있고, This may cause race condition or 불필요한 부하가 발생할 수 있습니다.

(이것은 에러라기보다는 성능 및 로직 문제입니다.

)

3. null 또는 undefined 값 전달 시 에러 switchMap 내부에서 map 혹은 다른 연산자로 값을 변환할 때, null 혹은 undefined 값을 예상치 못하게 전달하면 TypeError가 발생할 수 있습니다.

예를 들어, Observable 소스가 null 값을 방출하거나 내부 함수가 undefined를 반환하면, 내부 Observable 생성 과정에 문제가 생기기도 합니다.



4. switchMap의 반환값이 Observable이 아닐 때 발생하는 에러 switchMap 콜백 함수는 반드시 Observable을 반환해야 하는데, 실수로 Promise, null, 또는 일반 값 등을 반환하면 "You provided 'X' where a stream was expected" 와 같은 에러가 발생합니다.

따라서 반드시 Observable로 감싸서 반환해야 합니다.



5. RxJS 버전 차이 또는 import 오류에 따른 문제 RxJS 버전에 따라 switchMap의 동작이 미세하게 다르거나, 잘못된 import 경로로 인해 switchMap 함수가 제대로 동작하지 않는 경우가 있습니다.

예를 들면, import { switchMap } from 'rxjs/operators'가 아닌 다른 경로를 사용했다면 에러가 날 수 있습니다.



6. Unsubscription 문제로 인한 메모리 누수 switchMap은 내부 Observable 구독을 취소하기 때문에 일반적으로 메모리 누수 문제는 적지만, 외부에서 명시적으로 구독 취소를 하지 않는다면(특히 Angular 컴포넌트 라이프사이클에서) 계속 데이터 스트림이 유지되어 예상치 못한 동작이나 메모리 누수가 발생할 수 있습니다.

switchMap을 사용할 때 발생하는 에러는 주로 내부 Observable의 에러 미처리, 잘못된 반환값, 예기치 않은 null값 처리 실패, 그리고 비동기 취소 전략에 따른 로직 오류 등입니다.

따라서 switchMap을 사용할 때는 내부 Observable에서 올바른 에러 핸들링을 구현하고, 반환값이 정확히 Observable인지 확인하며, 취소가 필요한 이전 요청 문제를 고려해야 합니다.

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