RxJS 기본 Operator와 사용방법을 배워봅니다.
원문 링크입니다 : https://www.thisdot.co/blog/basic-rxjs-operators-and-how-to-use-them
이전 아티클에서 배운 Operators를 좀 더 확장할 것입니다.
또한 몇 가지 기본 Operator, Operator 하는 일, 사용 방법도 공유합니다.
RxJS Operators란 무엇인가요?
Operator는 복잡한 비동기 코드를 선언적 방식으로 쉽게 구성할 수 있도록 하는 필수 요소입니다.
Operator는 현재 Observable을 기반으로 새로운 Observable을 생성하는 함수입니다.
이것은 순수 연산입니다.
즉, 이전 Observable은 수정되지 않은 상태로 유지됩니다.
본질적으로 Operator는 Observable을 입력으로 받고
Observable에서 스트리밍된 값에 대해 일부 논리를 수행하고
원래 Observable을 변경하지 않고 이러한 값으로 새 Observable을 생성하는 기계와 같습니다.
Operator가 Observable1에서 값을 가져와 원래 Observable에 영향을 주지 않고
원래 Observable1 값의 변경된 값을 내보내는 새로운 Observable2을 생성하는 것을 볼 수 있습니다.
1. of - Creation Operator
of 연산자는 생성 Operator(creation Operator)입니다.
생성 Operator는 소스에서 Observable 스트림을 생성하는 함수입니다.
of Operator는 다양한 양의 값을 순차적으로 내보내는 Observable을 만들고
완료 알림을 방출합니다.
완료 알림은 Observable의 구독자에게 Observable이 더 이상 새 값을 내보내지 않을 것임을 알려줍니다.
이에 대해서는 후속 기사에서 더 자세히 다루겠습니다!
of를 살펴봅시다.
const arr = [1, 2, 3];
const arr$ = of(arr);
arr$.subscribe((values) => console.log(`Emitted Values: `, values));
of는 Observable을 생성하고 우리가 구독할 때 즉시 값을 방출하기 시작합니다.
위의 출력은 다음과 같습니다.
Emitted Values: [1, 2, 3]
of는 배열 [1, 2, 3]을 값으로 내보냅니다.
이것은 우리가 다음에 살펴볼 from과 다릅니다.
2. from - Creation Operator
이 연산자는 Promise를 Observable로 변환하여 보다 반응적인 방식으로 처리할 수 있도록 합니다.
Promise가 resolved되거나 reject되면 모든 구독자(subscribers)에게 완료 알림이 전송됩니다.
또한 of와 달리 전체 값이 아닌 Array 또는 Iterable의 각 요소를 순서대로 방출합니다.
Array 또는 Iterable의 모든 요소가 내보내지면 완료 알림이 모든 구독자에게 전송됩니다.
const arr = [1, 2, 3];
const arr$ = from(arr);
arr$.subscribe((values) => console.log(`Emitted Values: `, values));
Emitted Values: 1
Emitted Values: 2
Emitted Values: 3
여러 로그에서 볼 수 있듯이 from Operator는 각 숫자를 가져와 값으로 내보냅니다.
구독자는 각 값을 순서대로 수신하고 console.log를 세 번 호출했습니다.
const fromString$ = from("Hello");
fromString$.subscribe((value) => console.log(`Emitted Values: `, value));
Emitted Values: H
Emitted Values: e
Emitted Values: l
Emitted Values: l
Emitted Values: o
Promise는 다음과 같습니다.
const examplePromise = new Promise((resolve, reject) => {
// Do some async code and resolve and object with an id property
return resolve({ id: 1 });
});
const promise$ = from(examplePromise);
promise$.subscribe((value) => console.log(`Emitted Values: `, value));
Emitted Values: {id: 1}
3. map - Transformation Operator
map 연산자는 변환 연산자입니다.
하나의 Observable에서 값을 가져와 변환하고 변환된 값을 내보내는 새 Observable을 만듭니다.
map을 사용하면 Observable이 내보낸 값에 대한 간단한 변환을 수행할 수 있습니다.
두 가지 예를 살펴보겠습니다.
첫 번째 예에서는 from 연산자에 배열과 map을 사용하도록 변경합니다.
map도 사용하도록 수정합니다.
const arr = [1, 2, 3];
const fromArr$ = from(arr);
fromArr$
.pipe(map((value) => value + 10))
.subscribe((value) => console.log(`Emitted Values: `, value));
이 예에서 map은 변환 연산자이므로 Observable에서 받는 값을 변환할 수 있도록 .pipe() 호출 내에서 사용해야 합니다.
우리는 단순히 값에 10을 더하고 변환된 값을 내보냅니다.
Emitted Values: 11
Emitted Values: 12
Emitted Values: 13
map 연산자는 거의 모든 작업을 수행할 수 있지만
일반적인 사용 사례는 Observable 스트림에서 방출되는 객체에서 속성을 가져오는 것입니다.
우리는 Promise 예제를 사용하여 이것을 실제로 볼 수 있습니다:
const examplePromise = new Promise((resolve, reject) => {
// Do some async code and resolve and object with an id property
return resolve({ id: 1 });
});
const promise$ = from(examplePromise);
promise$
.pipe(map((obj) => obj.id))
.subscribe((value) => console.log(`Emitted Values: `, value));
우리는 map 연산자에게 Promise에서 resolved 객체의 id 속성을 반환하도록 지시하고 있습니다.
출력은 다음과 같습니다.
Emitted Values: 1
4. switchMap - Transformation Operator
switchMap 연산자는 또 다른 변환 연산자입니다.
switchMap은 Observable에서 내보낸 값을 받은 다음
기존 스트림이 아닌 다른 소스의 새 Observable을 반환합니다.
map은 값=>값이라면 switchMap은 값=>옵저버블을 값 => 값으로 바꿔줌
스트림 전환의 관점에서 이것을 생각하는 것이 유용할 수 있습니다.
하나의 Observable 스트림에서 다른 스트림으로 전환 중입니다.
예제를 봅시다.
const userDetails$ = from(this.userService.getActiveUserID())
.pipe(switchMap(id => this.userService.fetchUserForID(id)))
.subscribe(user => console.log("Found user ", user));
그런 다음 이 새로운 Observable 스트림을 구독하고
출력에서 볼 수 있듯이(this.userService.getActiveUserID())에서 방출된 값이 아니라
새로운 스트림이 방출하는 값을 수신합니다.
Found user {id: 1, name: "Test User", email: "test@test.com"}
switchMap 연산자는 원래(original,source) Observable 스트림에서 새 값을 수신하는 경우,
모든 in-flight 요청을 취소하므로 자동 검색 구현을 위한 훌륭한 후보가 됩니다!
5. tap - Utility Operator
탭을 사용하면 원본 스트림을 수정하거나 변경하지 않고도 Observable 스트림에서 액션이나 부작용을 수행할 수 있습니다.
값은 다음 Operator 또는 Subscriber에게 해당 함수가 없는것처럼 전달됩니다.
const arr = [1, 2, 3];
const fromArr$ = from(arr);
fromArr$
.pipe(tap((value) => console.log("Received value: ", value)))
.subscribe((value) => console.log(`Emitted Values: `, value));
Received value: 1
Emitted Values: 1
Received value: 2
Emitted Values: 2
Received value: 3
Emitted Values: 3
6. take - Filtering Operator
take 연산자는 Filtering Operator입니다.
필터링 연산자를 사용하면 Observable에서 방출된 값을 수락하는 방법과 시기를 선택할 수 있습니다.
take는 가장 일반적이고 가장 단순한 필터링 연산자 중 하나입니다.
Observable에서 수신하려는 최대 값 수를 지정할 수 있습니다.
배열의 요소를 내보내는 from 예제를 사용하고
이 연산자를 더 잘 이해하기 위해 take와 결합해 보겠습니다.
const arr = [1, 2, 3];
const fromArr$ = from(arr);
fromArr$
.pipe(take(1))
.subscribe((value) => console.log(`Emitted Values: `, value));
Emitted Values: 1
예를 들어 사용자가 앱을 처음 클릭하는 경우와 같이
처리하려는 사용자 생성 이벤트(fromEvent)의 수를 제한하려는 상황에서 사용할 수 있습니다.
Conclusion
이 기사에서 우리는 RxJS에 존재하는 가장 일반적인 연산자라고 생각하는 몇 가지를 간략하게 다루었습니다.
이 6가지 연산자를 이해하면 RxJS를 마스터하는 단계에 도달한 것입니다!
RxJS를 기반으로 하는 더 많은 연산자와 더 심층적인 주제에 대해 논의하는 더 많은 기사를 계속 지켜봐 주십시오.
'FrontEnd' 카테고리의 다른 글
RxJS Subscriptions(구독) 관리 모범 사례 (0) | 2022.10.08 |
---|---|
RxJS로 옵저버블을 만드는 방법 (0) | 2022.10.08 |
Rxjs 시작하기 (0) | 2022.10.08 |
리믹스와 엣지 컴퓨팅[Remix and “The Edge”] (0) | 2022.10.08 |
리액트 서버 컴포넌트와 리믹스[React Server Components and Remix] (0) | 2022.10.07 |