RxJS
RxJS는 Reactive Extensions for JavaScript의 약자로, Observable 기반의 데이터 스트림을 다루는 라이브러리입니다. Angular에서는 주로 HTTP 요청, 이벤트 처리, 상태 관리 등에 활용됩니다.
주요 개념
- Observable: 비동기적으로 데이터 스트림을 생성하고 처리할 수 있는 객체입니다. 이벤트, HTTP 응답 등을 Observable로 변환하여 다룰 수 있습니다.
- Operators: Observable이 발행하는 데이터를 변환하거나 필터링하는 함수들입니다. 예를 들어, map, filter, mergeMap 등의 연산자가 있습니다.
- Subject: Observable과 마찬가지로 데이터 스트림을 발행할 수 있지만, 여러 구독자에게 데이터를 공유할 수도 있습니다.
Observable 사용법
1. Observable 생성
import { Observable } from 'rxjs';
protected subscriptions: Array<Subscription> = [];
private keydownObservable$: Observable<Event>;
2. Observable 사용
addKeyboardEvents() {
this.keydownObservable$ = fromEvent(window, 'keydown');
this.subscriptions.push(
this.keydownObservable$.pipe(debounceTime(1000)).subscribe(async (event) => {
await this.onKeyDown(event);
})
);
}
1. fromEvent() 함수 호출
this.keydownObservable$ = fromEvent(window, 'keydown');
- fromEvent() 함수는 RxJS의 함수 중 하나로, DOM 이벤트를 Observable로 변환하는 역할을 합니다. 여기서는 window 객체에서 keydown 이벤트를 Observable로 변환하여 keydownObservable$ 변수에 할당합니다.
2. pipe() 메서드와 연산자 사용
this.keydownObservable$.pipe(debounceTime(1000))
- pipe() 메서드는 Observable에 연산자(operators)를 적용하기 위해 사용됩니다. debounceTime(1000) 연산자는 이벤트가 발생한 후 일정 시간(여기서는 1000ms, 즉 1초) 동안 다음 이벤트가 발생하지 않을 때까지 기다린 후, 마지막 이벤트를 발행합니다. 이를 통해 연속적으로 발생하는 이벤트를 제어할 수 있습니다.
3. subscribe() 메서드 호출
.subscribe(async (event) => {
await this.onKeyDown(event);
})
- subscribe() 메서드는 Observable을 구독하며, Observable이 값을 발행할 때마다 실행할 로직을 정의합니다. 여기서는 keydownObservable$에서 발생한 이벤트를 구독하고, 이벤트가 발생할 때마다 onKeyDown() 메서드를 비동기적으로 호출합니다.
추가적인 설명
- this.subscriptions.push(...) 부분은 이 구독을 관리하기 위해 클래스에서 사용하는 배열인 subscriptions에 구독을 추가하는 것입니다. 이는 나중에 컴포넌트가 파괴되거나 더 이상 필요하지 않을 때, 해당 구독을 쉽게 해제할 수 있도록 도와줍니다.
- async와 await 키워드를 사용하여 onKeyDown(event) 메서드를 비동기적으로 호출하는 이유는, 이벤트 핸들러에서 비동기 작업을 수행할 필요가 있기 때문입니다. 예를 들어, 이벤트 핸들러 내에서 HTTP 요청을 보내거나 다른 비동기 작업을 처리할 수 있습니다
Subject, Subscription 사용법
1. Subject, Subscription 생성
import { Subject, Subscription } from 'rxjs';
private subscriptions: Array<Subscription> = [];
public totalSearch$ = new Subject();
2. Subject, Subscription 사용
async ngOnInit() {
this.subscriptions.push(
this.totalSearch$
.pipe(
debounceTime(this.dueTime),
switchMap((text) => this.service.getSearch(+this.userId, text))
)
.subscribe(({ data }) => {
this.setSearch(data);
})
);
}
search() {
this.totalSearch$.next(this.searchText);
}
1. this.subscriptions.push(...)
- this.subscriptions 배열에 Observable의 구독을 추가합니다. 이는 나중에 컴포넌트가 파괴되거나 더 이상 필요하지 않을 때 구독을 해제할 수 있도록 도와줍니다.
2. this.totalSearch$
- this.totalSearch$는 Subject 또는 BehaviorSubject입니다. Subject는 Observable이자 Observer 역할을 할 수 있는 객체로, 여기서는 검색어를 발행하는 데이터 스트림을 나타냅니다.
3. pipe(...) 메서드와 연산자들
- pipe() 메서드는 Observable에 연산자(operators)를 적용하기 위해 사용됩니다.
- debounceTime(this.dueTime): 사용자가 입력을 할 때, 입력의 끝을 감지하기 위해 일정 시간(this.dueTime) 동안 대기합니다. 이는 연속적으로 입력을 받을 때, 사용자의 마지막 입력을 기준으로 검색 요청을 보내기 위해 사용됩니다.
- switchMap((text) => this.service.getSearch(+this.userId, text)): 입력된 검색어(text)를 기반으로 HTTP 요청을 보냅니다. switchMap 연산자는 새로운 Observable을 반환하고, 이전 Observable의 구독을 해지합니다. 따라서 가장 최근의 검색어에 대한 검색 요청만 처리하게 됩니다.
4. subscribe(...)
- subscribe() 메서드는 Observable을 구독하고, Observable이 값을 발행할 때마다 실행할 로직을 정의합니다.
- ({ data }) => { this.setSearch(data); }: 구독할 Observable이 값을 발행할 때 실행될 콜백 함수입니다. 여기서는 HTTP 요청으로부터 받은 데이터를 처리하는 setSearch() 메서드를 호출합니다.
- this.setSearch(data);: 받아온 데이터를 처리하여 화면에 표시하거나 다른 작업을 수행합니다. 이 코드에서는 검색 결과 데이터(data)를 처리하여 컴포넌트의 상태에 반영합니다.
- ({ data }) => { this.setSearch(data); }: 구독할 Observable이 값을 발행할 때 실행될 콜백 함수입니다. 여기서는 HTTP 요청으로부터 받은 데이터를 처리하는 setSearch() 메서드를 호출합니다.
5. this.totalSearch$.next(this.searchText);
- search() 메서드는 사용자가 입력한 검색어(this.searchText)를 totalSearch$ Subject에 발행합니다. 이렇게 하면 ngOnInit()에서 구독하고 있는 Observable에서 검색어를 받아 처리할 수 있습니다.
'개발 공부 > Angular' 카테고리의 다른 글
| Angular LifeCycle (1) | 2024.11.02 |
|---|---|
| Angular Standalone (2) | 2024.10.27 |
| Angular 란 (0) | 2024.07.21 |
| Angular / @ngrx / store (0) | 2024.07.19 |
| Service Workers (1) | 2024.01.24 |