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

switchMap을 사용하여 에러의 종류에 따른 처리 방법은 무엇인가요?

_____
Q1: RxJS의 switchMap에서 에러가 발생했을 때 기본 동작은 무엇인가요?
A1: switchMap 내부에서 Observable이 에러를 발생시키면, 해당 에러가 외부 Observable로 전파되어 전체 스트림이 종료됩니다. 기본적으로 에러 전파로 인해 스트림이 멈추기 때문에 별도의 처리 없이 에러가 발생하면 구독이 종료됩니다.

Q2: 에러의 종류별로 switchMap에서 다르게 처리하려면 어떻게 해야 하나요?
A2: switchMap 내부 Observable에서 에러를 catchError 연산자를 사용해 잡고, 에러 종류에 따라 분기 처리하면 됩니다. 예를 들어, HTTP 404 에러는 빈 데이터로 대체하고, 500 에러는 재시도하거나 사용자에게 알리는 방식으로 다르게 대처할 수 있습니다.

Q3: switchMap 안에서 catchError를 사용하면 스트림이 계속 진행되나요?
A3: 네, catchError로 에러를 내부에서 처리하여 Observable을 정상적으로 반환하면 외부 스트림이 종료되지 않고 계속 진행됩니다. 단, catchError에서 에러를 다시 throw하면 스트림은 종료됩니다.

Q4: 에러 종류별 분기 처리 예제는 어떻게 작성하나요?
A4:
```typescript
source$.pipe(
switchMap(value =>
someApiCall(value).pipe(
catchError(err => {
if (err.status === 404) {
// 404일 경우 빈값 반환
return of([]);
} else if (err.status === 500) {
// 500일 경우 사용자에게 알리기
alert('서버 오류가 발생했습니다.');
return EMPTY;
} else {
// 그 외 에러 재전파
return throwError(err);
}
})
)
)
)
```

Q5: 에러가 발생해도 switchMap이 새로운 값 처리에 문제는 없나요?
A5: 내부 Observable에서 에러를 처리하여 스트림이 종료되지 않으면 switchMap은 새로 들어오는 값을 계속 받아 처리합니다. 그러나 에러를 재전파하면 전체 스트림이 종료되어 이후 값은 처리되지 않습니다.

요약:
- switchMap 내부 Observable 에러는 기본적으로 외부로 전파되어 스트림 종료.
- catchError로 에러를 잡아 스트림을 유지할 수 있음.
- 에러 종류별 조건 분기하여 적절한 처리(빈값 반환, 알림, 재시도 등) 가능.
- 재전파하지 않고 처리하면 switchMap은 계속 정상 동작함.
switchMap 연산자는 RxJS에서 내부 Observable을 전환할 때 주로 사용됩니다.

에러 처리 측면에서 switchMap을 사용할 때는 에러가 발생했을 때 어떻게 대응할지에 대해 신중히 설계해야 합니다.

switchMap 내부 Observable이 에러를 발생시키면 기본적으로 그 에러가 상위 Observable로 전파되어 전체 스트림이 종료됩니다.

따라서 에러의 종류에 따라 다르게 처리하려면 다음과 같은 방법들을 고려할 수 있습니다.

1. catchError를 내부에 사용하기 switchMap 안에서 반환하는 Observable에 catchError 연산자를 적용하여 에러를 잡아 처리합니다.

예를 들어, HTTP 요청이 실패했을 때 특정 에러이거나 네트워크 문제라면 다른 복구 로직(예: 재시도, 기본값 반환)을 실행하고, 치명적인 에러라면 그대로 throw할 수 있습니다.



2. 에러 판단 로직 구현하기 catchError 내부에서 에러 객체의 속성이나 타입을 체크해서 에러 종류(예: 타임아웃, 인증 실패, 서버 오류 등)에 따라 다른 대응 방식을 결정할 수 있습니다.

이를 통해 예를 들어 네트워크 오류는 재시도 처리, 인증 오류는 로그아웃 처리, 기타 오류는 에러 메시지 출력 등 다양하게 분기할 수 있습니다.



3. 외부에서 전역 에러 처리하기 내부에서 에러를 무조건 처리하지 않고, throwError를 통해 다시 상위로 전달하고, outer Observable 쪽에서 catchError로 한 번 더 잡아 총괄적으로 처리하는 방법도 있습니다.

이 경우 switchMap 내부에서는 특정 에러만 선별적으로 처리하거나 그대로 던지고, 상위에서 전역 에러 메시지 UI 노출, 로깅, 알림 등 공통 처리를 구현합니다.



4. retry 연산자 사용해서 조건부 재시도 구현 특정 에러가 발생했을 때 재시도(retry 또는 retryWhen)를 하는 경우 에러 타입을 판단해서 재시도 여부를 결정합니다.

switchMap 내부 Observable에 retry나 retryWhen을 조합해 에러 유형별로 재시도 정책을 달리 구현할 수 있습니다.

switchMap 내부 Observable에서 발생하는 에러를 종류별로 다르게 처리하려면 내부에 catchError를 두고 에러 구분 로직을 구현하거나, 일부는 내부에서 처리하고 일부는 상위 스트림으로 던져서 전역적으로 처리하는 방법을 적절히 조합해야 합니다.

이런 방식으로 에러를 세밀하게 분류하고 대응책을 마련할 수 있습니다.

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