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

switchMap을 사용하여 스크롤 이벤트를 처리하는 방법은?

_____
Q1: switchMap이 무엇인가요?
A1: switchMap은 RxJS에서 제공하는 연산자로, 이전 Observable의 처리가 완료되기 전에 새로운 Observable이 발행되면 이전 Observable의 구독을 취소하고 새로운 Observable로 전환합니다. 주로 최신 데이터에 집중하고 이전 요청을 무시할 때 유용합니다.

Q2: 스크롤 이벤트에 switchMap을 사용하는 이유는 무엇인가요?
A2: 스크롤 이벤트는 매우 빈번하게 발생하기 때문에, 각 이벤트마다 API 호출이나 무거운 작업을 실행하면 비효율적입니다. switchMap을 사용하면 가장 최신의 스크롤 이벤트만 처리하며 이전 요청이 완료되지 않은 경우 취소할 수 있어 성능 향상과 자원 낭비 방지에 도움됩니다.

Q3: switchMap으로 스크롤 이벤트를 처리하는 기본적인 방법은 어떻게 되나요?
A3: 일반적으로 RxJS의 `fromEvent`로 스크롤 이벤트를 구독한 뒤, debounceTime이나 throttleTime과 결합하여 이벤트 빈도를 조절한 후 switchMap으로 실제 작업(예: API 호출)을 처리합니다. 이렇게 하면 중복 요청을 방지하고 최신 스크롤 위치 기반 작업만 실행할 수 있습니다.

```typescript
import { fromEvent } from 'rxjs';
import { debounceTime, switchMap, map } from 'rxjs/operators';

// 예: 윈도우 스크롤 이벤트를 200ms debounce 후 처리
const scroll$ = fromEvent(window, 'scroll').pipe(
debounceTime(200), // 스크롤 이벤트 빈도 조절
map(() => window.scrollY), // 현재 스크롤 위치 추출
switchMap(position => {
// 스크롤 위치 기반 API 호출 또는 작업 수행
return fetchDataBasedOnScroll(position);
})
);

scroll$.subscribe(data => {
// API 응답 처리
});
```

Q4: scroll 이벤트를 debounce 대신 throttle과 함께 switchMap을 써도 되나요?
A4: 네, 가능합니다. debounceTime은 마지막 이벤트 발생 후 지정 시간 동안 이벤트가 없을 때 실행하지만, throttleTime은 지정 시간마다 한 번씩 이벤트를 발생시킵니다. 상황에 따라 적절한 연산자를 선택하고 switchMap을 사용하는 것이 좋습니다.

Q5: switchMap 내에서 API 호출 실패 시 어떻게 처리해야 하나요?
A5: switchMap 내부에서 에러가 발생하면 전체 스트림이 종료될 수 있기 때문에 `catchError`를 사용하여 에러를 처리하거나, `switchMap` 안에서 에러를 반환하는 Observable로 변환해야 합니다.

```typescript
import { catchError, of } from 'rxjs';

switchMap(position => fetchDataBasedOnScroll(position).pipe(
catchError(err => {
console.error(err);
return of(null); // 에러 시 기본값 반환
})
))
```

Q6: 스크롤 이벤트에 switchMap을 사용하면 사용자의 마지막 스크롤 위치 기반 작업만 수행할 수 있나요?
A6: 네, switchMap은 이전에 진행 중인 Observable을 취소하고 가장 최신 이벤트로 전환하기 때문에 항상 마지막 스크롤 위치에 기반한 작업 결과만 처리됩니다.

---

요약: switchMap은 스크롤 이벤트처럼 빠르게 반복되는 데이터 스트림에서 가장 최신 이벤트의 작업만 처리하도록 하여, 효율적인 비동기 처리와 리소스 절약에 매우 효과적입니다. debounceTime이나 throttleTime과 조합해 사용하면 더욱 안정적인 스크롤 이벤트 처리가 가능합니다.
switchMap은 RxJS에서 중요한 연산자 중 하나로, 주로 Observable을 변환하고 이전에 구독한 Observable을 취소할 때 사용합니다.

스크롤 이벤트를 처리할 때 switchMap을 사용하면, 사용자 스크롤 이벤트가 빠르게 발생하는 상황에서도 효율적으로 비동기 작업을 관리할 수 있습니다.

아래는 switchMap을 사용하여 스크롤 이벤트를 처리하는 방법에 대한 자세한 설명입니다.

1. 기본 아이디어 - 사용자의 스크롤 이벤트는 매우 자주 발생합니다.

- 스크롤 위치에 따라 데이터를 로드하거나, API 요청을 보낼 때 여러 요청이 중첩되는 것을 막아야 합니다.

- switchMap을 사용하면 새로운 스크롤 이벤트가 발생할 때마다 이전에 시작한 비동기 작업을 취소하고 새로운 작업을 시작할 수 있습니다.



2. 구체적인 예시: 무한 스크롤 구현에서 API 호출 제어 예를 들어, 스크롤하여 페이지 하단에 가까워지면 새로운 데이터를 가져오는 무한 스크롤 기능을 만들 때, 사용자가 빠르게 스크롤할 경우 여러 API 요청이 생길 수 있습니다.

이때 switchMap을 사용하면 마지막 요청만 유효하게 처리되고 이전 요청들은 취소됩니다.



3. 구현 단계 설명 (1) 스크롤 이벤트 감지 - RxJS의 `fromEvent` 연산자를 사용하여 스크롤 이벤트를 Observable로 만듭니다.

- 일반적으로 `window` 또는 특정 스크롤 가능 영역의 `scroll` 이벤트를 구독합니다.

```typescript import { fromEvent } from 'rxjs'; const scroll$ = fromEvent(window, 'scroll'); ``` (

2) 스크롤 위치 계산 및 기준 설정 - 스크롤 위치가 페이지 하단 일정 기준에 도달했는지 체크해야 합니다.

- 예를 들면, 전체 문서 높이 - (현재 스크롤 위치 + 뷰포트 높이)이 일정 값 이하인가를 판단합니다.

```typescript import { map, filter } from 'rxjs/operators'; const scrollPosition$ = scroll$.pipe( map(() => window.scrollY + window.innerHeight), filter(position => position >= document.body.scrollHeight - 100) // 하단 100px 도달 시 ); ``` (

3) switchMap으로 데이터 요청 처리 - `scrollPosition$`이 조건에 도달하면, 네트워크 요청 또는 비동기 작업을 시작합니다.

- 이때 network 요청 Observable을 `switchMap` 내부에 넣으면, 새로운 스크롤 이벤트가 발생해 다시 조건에 도달하면 이전 요청은 취소되고 새 요청이 시작됩니다.

```typescript import { switchMap } from 'rxjs/operators'; import { ajax } from 'rxjs/ajax'; const loadMore$ = scrollPosition$.pipe( switchMap(() => { // API 호출 Observable 반환, 예를 들어 페이지 번호를 관리한다면 추가 필요 return ajax.getJSON('https://api.example.com/items?page=nextPage'); }) ); ``` ---

4. 추가 고려사항 - 페이지 번호 및 상태 관리 : 무한 스크롤 시 현재 페이지 번호나 로드 가능한 상태를 관리해야 합니다.

이 상태는 별도의 Subject나 BehaviorSubject로 관리하고 switchMap 내부에서 참조할 수 있습니다.

- 디바운스 혹은 쓰로틀 적용 : 너무 잦은 스크롤 이벤트 발생 시 API 호출 빈도를 낮추기 위해 `debounceTime` 또는 `throttleTime`을 사용하는 것이 효과적입니다.

- 에러 처리 : API 호출 중 에러가 발생할 수 있으므로, `catchError`를 써서 적절히 처리해야 합니다.

- 중복 요청 방지 : 이미 마지막 페이지라면 더 이상 요청하지 않도록 조건을 걸어야 합니다.

---

5. 정리 - `switchMap`은 내부 Observable이 새로 만들어지면 기존 Observable 구독을 취소하므로, 스크롤에서 빈번히 발생하는 이벤트를 처리하는 데 적합합니다.

- 스크롤 이벤트를 RxJS `fromEvent`로 생성하고, 필요한 위치 조건을 필터링한 뒤 실제 비동기 작업을 `switchMap`으로 처리하면, 빠른 스크롤 시 중복된 요청을 깔끔하게 방지할 수 있습니다.

- 무한 스크롤, 검색 자동완성 등에서 매우 유용하며, 반응형 사용자 경험을 만드는 데 필수적인 RxJS 패턴입니다.

--- 필요하다면 실제 코드 예제를 좀 더 자세히 작성해 드릴 수도 있습니다.

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