Promise만으로 다루기 어렵습니다. RxJS는 데이터를 하나의 '흐름(Stream)'으로 보고 선언적으로 제어합니다.현대적인 웹 개발에서 비동기 처리는 피할 수 없습니다. API 호출, 사용자 클릭 이벤트, 웹소켓 메시지 등 수많은 데이터가 서로 다른 시점에 발생합니다.
단순한 비동기 작업은 Promise나 async/await로 충분합니다. 하지만 다음과 같은 상황이 닥치면 코드가 빠르게 복잡해집니다.
이런 '시간의 흐름'이 섞인 데이터를 제어하기 위해 RxJS가 등장했습니다.
RxJS는 데이터를 하나의 '흐름(Stream)'으로 봅니다. 데이터가 발생할 때마다 미리 설계해 둔 '파이프라인'을 따라 흐르며 자동으로 가공되고 전달됩니다. 이렇게 하면 복잡한 상태 관리와 비동기 로직을 선언적으로, 즉 무엇을 할지를 기술하는 방식으로 작성할 수 있습니다.
RxJS의 아키텍처는 정수기 시스템과 비슷합니다.
filter), 물의 성분을 바꾸는(map) 역할을 합니다.NestJS 인터셉터는 RxJS의 힘을 빌려 응답 데이터를 깔끔하게 가공합니다.
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { map, tap } from 'rxjs/operators'; @Injectable() export class ResponseInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { // next.handle()은 데이터가 흐르기 시작하는 '수도꼭지'입니다. return next.handle().pipe( // tap: 데이터 흐름을 방해하지 않고 옆에서 지켜보기 (로깅) tap(() => console.log('데이터가 지나갑니다...')), // map: 데이터를 예쁜 봉투(공통 포맷)로 감싸기 map(data => ({ success: true, data, timestamp: new Date().toISOString() })) ); } }
사용자의 입력을 실시간으로 처리할 때 서버 부하를 줄이는 전형적인 패턴입니다.
import { fromEvent } from 'rxjs'; import { debounceTime, map, distinctUntilChanged } from 'rxjs/operators'; const searchInput = document.getElementById('search'); // 입력 이벤트를 '스트림'으로 만듭니다. fromEvent(searchInput, 'input').pipe( map(event => event.target.value), debounceTime(300), // 0.3초 동안 입력이 멈춰야 다음으로 넘김 distinctUntilChanged(), // 이전 값과 같으면 무시 ).subscribe(value => { console.log('최종 검색어:', value); // 여기서 API 호출 수행 });
네트워크 불안정으로 실패했을 때 자동으로 다시 시도하는 로직도 단 몇 줄로 가능합니다.
http$.pipe( retry(3), // 실패하면 최대 3번까지 자동으로 다시 요청 catchError(err => of('에러 발생 시 보여줄 기본 데이터')) ).subscribe(data => console.log(data));
도입 이점
if문과 setTimeout, 플래그 변수가 사라지고 선언적인 파이프라인만 남습니다.Trade-off (한계점)
subscribe)을 시작했다면, 필요 없을 때 반드시 해제(unsubscribe)해야 합니다. 그렇지 않으면 메모리 누수가 생깁니다.RxJS는 단순한 라이브러리를 넘어 '데이터를 대하는 새로운 관점'을 제시합니다. 모든 것을 흐르는 스트림으로 바라보고, 이를 Operator로 조립하는 경험은 비동기 코드를 다루는 방식 자체를 바꿔 줍니다.
처음에는 수많은 Operator 때문에 혼란스러울 수 있습니다. map, filter, tap 같은 기본 필터부터 하나씩 익혀 보세요. 어느새 비동기 코드가 정수기 물처럼 깨끗해져 있을 것입니다.
참고 자료