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

switchMap을 이용한 API 응답 처리 예시는 무엇인가요?

_____
Q: switchMap을 이용한 API 응답 처리 예시는 무엇인가요?

A: `switchMap`은 RxJS에서 주로 비동기 작업을 처리할 때 사용되는 연산자로, 이전 Observable이 완료되거나 새 값이 발생하면 이전 Observable을 취소하고 새 Observable로 전환합니다. API 호출과 같이 응답이 올 때까지 기다리는 작업에서 유용합니다. 특히, 사용자가 빠르게 입력을 변경할 때 이전 API 호출을 취소하고 가장 최근 요청에 대한 응답만 처리하고 싶을 때 많이 사용됩니다.

아래는 Angular에서 `switchMap`을 이용해 API 응답을 처리하는 간단한 예시입니다.

```typescript
import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { debounceTime, distinctUntilChanged, switchMap, catchError } from 'rxjs/operators';
import { of } from 'rxjs';

@Component({
selector: 'app-search',
template: `


  • {{ user.name }}


{{ errorMessage }}


`
})
export class SearchComponent {
searchControl = new FormControl('');
users: any[] = [];
errorMessage = '';
constructor(private http: HttpClient) {
this.searchControl.valueChanges.pipe(
debounceTime(300), // 입력이 300ms 동안 멈출 때까지 대기
distinctUntilChanged(), // 이전값과 다를 때만 실행
switchMap(searchTerm =>
this.http.get(`https://api.example.com/users?name=${searchTerm}`).pipe(
catchError(err => {
this.errorMessage = '검색 중 오류가 발생했습니다.';
return of([]); // 에러시 빈 배열 반환하여 스트림 유지
})
)
)
).subscribe(users => {
this.errorMessage = '';
this.users = users;
});
}
}
```

설명
- `searchControl.valueChanges`는 사용자가 입력 필드에 입력할 때마다 값을 방출하는 Observable입니다.
- `debounceTime(300)`은 입력이 300ms 멈출 때까지 기다려 불필요한 API 호출을 줄입니다.
- `distinctUntilChanged()`는 이전 값과 다른 경우에만 다음 연산자를 실행합니다.
- `switchMap`은 새 검색어 입력이 들어오면 이전 API 호출을 자동 취소하고 새 API 호출을 실행합니다.
- API 호출 도중 에러가 발생하면 `catchError`를 통해 에러 메시지를 처리하고 빈 배열을 반환해 컴포넌트가 정상 동작하도록 합니다.
- 최종적으로 API 응답을 받아 `users` 배열에 저장해 화면에 출력합니다.

이와 같이 `switchMap`을 이용하면 불필요한 API 중복 호출을 방지하고, 가장 최근 검색어에 대한 데이터만 처리할 수 있어 사용자 경험이 향상됩니다.
switchMap은 RxJS에서 많이 사용되는 연산자 중 하나로, 주로 비동기 작업을 처리할 때 사용합니다.

특히, API 요청과 같은 비동기 스트림에서 이전 요청을 취소하고 최신 요청만 처리하고자 할 때 유용합니다.

switchMap을 이용한 API 응답 처리 예시는 다음과 같습니다.

예를 들어, 사용자가 검색어를 입력할 때마다 해당 검색어에 대한 API 요청을 보내고, 가장 최근에 입력된 검색어에 대한 결과만 받아서 처리하고 싶다고 가정해 봅시다. 이때 switchMap을 사용하면 이전에 보낸 API 요청이 완료되지 않았더라도 취소하고, 최신 요청만 처리할 수 있습니다.

```typescript import { fromEvent } from 'rxjs'; import { debounceTime, map, switchMap } from 'rxjs/operators'; import { ajax } from 'rxjs/ajax'; // input 요소 선택 const searchBox = document.getElementById('search'); // input 이벤트를 기반으로 스트림 생성 const search$ = fromEvent(searchBox, 'input').pipe( // 사용자가 입력을 멈출 때까지 300ms 대기 debounceTime(300), // 이벤트 객체에서 입력값 추출 map((event: Event) => (event.target as HTMLInputElement).value), // 입력값을 API 요청 스트림으로 변환, 이전 요청은 취소 switchMap(searchTerm => ajax.getJSON(`https://api.example.com/search?q=${searchTerm}`) ) ); // 구독하여 결과 출력 search$.subscribe( results => { console.log('API 응답 결과:', results); // 여기에 UI 업데이트 코드 작성 가능 }, error => { console.error('API 요청 중 에러 발생:', error); } ); ``` 이 코드의 핵심은 다음과 같습니다: 1. fromEvent 를 통해 input 요소의 키 입력 이벤트 스트림을 만듭니다.



2. debounceTime(300) 으로 사용자가 입력을 멈출 때까지 대기하여 불필요한 요청을 줄입니다.



3. map 연산자로 이벤트 객체에서 텍스트 입력값만 뽑아냅니다.



4. switchMap 을 써서 입력값을 기반으로 API 요청 스트림으로 변환합니다.

만약 사용자가 입력을 빠르게 여러번 한다면, 이전 요청은 자동으로 취소되고 최신 입력에 대한 요청만 남아 응답을 받습니다.



5. 최종적으로 subscribe에서 API 응답 결과를 받아서 처리하거나 오류를 관리합니다.

이와 같이 switchMap을 이용하면 특히 검색, 필터링, 자동완성 같은 실시간 사용자 입력에 기반한 API 호출에서 매우 효과적으로 비동기 흐름을 관리할 수 있습니다.

이전 요청에 대한 응답이 나중에 도착하더라도 무시하고 최신 요청에 대한 응답만 처리하므로 UI가 깜빡이거나 불필요한 데이터 처리 문제를 방지할 수 있습니다.

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