데이터 스트림을 결합하는 방법에 대해 알아보고 있습니다. 지난 포스트에서는 combineLatest를 다뤘습니다. 이번 포스트에서는 http 통신에서 자주 사용되는 forkJoin 생성자에 대해 알아보고, 하나의 옵저버블의 변경에만 반응하는 withLatestFrom 파이프 연산자에 대해 알아보도록 하겠습니다.
forkJoin 이란?
forkJoin은 각 입력 옵저버블의 마지막 값을 사용해서 출력 옵저버블을 생성합니다. forkJoin의 핵심은 마지막 값이라는 점입니다.
위 예는 3개의 옵저버블에서 하나의 옵저버블을 생성하고 있습니다. forkJoin으로 생성한 옵저버블은 단 한번의 값을 방출합니다. 값을 방출할때는 입력 옵저버블이 모두 완료될때 입니다. 이때 방출된 값은 각 옵저버블의 마지막 값이 배열로 결합된 형태 갖습니다. frokjoin은 파이프 연산자가 아닌 정적 생성함수임을 기억해주세요.
forkJoin 마블 다이어그램
forkJoin의 마블 다이어 그램을 살펴보겠습니다.
forkJoin은 각 옵저버블에서 방출된 마지막 값만 이용합니다. 방출된 데이터는 [2,B,b] 입니다. 각 옵저버블의 마지막 값이 포함된 배열이 방출되었습니다. 마블 다이어그램의 작대기 | 는 옵저버블이 완료(complete)를 의미합니다. complete상태가 되어야 마지막 값을 이용할 수 있습니다. 즉 영영 완료되지 않는 옵저버블을 입력 옵저버블로 사용하면 값이 방출되지 않습니다.
forkJoin 정리
공식적으로 forkJoin은 조합 생성 함수(combination function) 입니다. forkJoin을 사용해서 옵저버블 세트를 입력받아 각각 구독하고 출력 옵저버블을 만듭니다. 모든 입력 옵저버블이 완료되면 출력 옵저버블에 값을 방출하고 complete(완료) 됩니다. 출력 옵저버블에 방출된 값은 각 입력 옵저버블에서 마지막으로 방출된 값을 배열로 가집니다.
forkJoin은 언제 사용하나?
forkJoin은 여러 http request를 동시에 보내고 모든 request가 완료될 때까지 결과를 처리하고 싶지 않을 때 사용할 수 있습니다. 또 request가 개별 항목을 반환하고 항목을 단일 배열로 내보내려고 하는 경우에 활용할 수 있습니다. forkJoin을 사용할 때 주의해야 할 점이 있습니다. forkJoin은 모든 옵저버블이 완료될 때까지 값을 방출하지 않습니다. 따라서 유저 액션 스트림과 같이 완료되지 않는 옵저버블과 함께 사용해서는 안됩니다.
forkJoin은 여기까지 입니다. 이제 withLatestFrom 연산자를 알아보도록 하겠습니다.
withLatestFrom 이란?
withLatestFrom은 각 입력 옵저버블의 최신 값을 사용하여 옵저버블을 생성합니다. 하지만 소스 옵저버블의 항목이 방출될 때만 출력 옵저버블에 값을 방출합니다.
위 예제에서 소스 옵저버블은 a$입니다. a$ 옵저버블의 파이프를 통해 두 개의 다른 옵저버블 b$, c$를 withLatestFrom을 이용해서 결합해 주고 있습니다. 그리고 withLatestFrom은 다시 하나의 옵저버블을 만들어 줍니다. 이 결합으로 생겨나는 옵저버블은 시작은 a$ 소스 옵저버블입니다. 소스 옵저버블에서 항목이 방출되지 않으면 아무일도 일어나지 않습니다. 따라서 결합된 옵저버블은 소스 옵저버블인 a$가 방출될 때만 출력 옵저버블로 방출됩니다.
withLatestFrom 마블 다이어그램
a$ 옵저버블이 방출되면 다른 옵저버블에서 가장 최근에 방출된 값을 가져와 배열에 넣고 출력 옵저버블에서 방출 됩니다. b$, c$ 옵저버블에서 값을 방출한다 하더라도 소스 옵저버블인 a$가 값을 방출하지 않는 한 다른 값을 방출하지 않습니다.
방출 값이 하나 비어있다고 생각 할 수도 있습니다. a$가 1일때 방출값이 없는데요. 그 이유는 withLatestFrom은 모든 옵저버블이 적어도 하나의 값을 방출할 때까지 방출하지 않기 때문입니다.
withLatestFrom 정리
공식적으로 withLatestFrom은 조합 연산자(combination operator)입니다. 옵저버블 세트를 입력받아 각각 구독하고 출력 옵저버블을 만듭니다. 항목이 소스 옵저버블에서 방출될 때 모든 입력 옵저버블이 한 번 이상 방출된 경우 출력 옵저버블에 값을 방출 합니다. 방출 값은 각 입력 옵저버블에서 가장 최근에 방출된 값을 배열로 결합합니다. 소스 옵저버블이 complete 되면 완료됩니다.
withLatestFrom은 언제 사용하나?
withLatestFrom을 사용하여 옵저버블 중 하나의 변경에만 이벤트를 처리하거나 소스 옵저버블을 사용해서 다른 옵저버블의 출력을 조절할 때 사용합니다.
여기까지 수고하셨습니다. 다음 포스트에서는 데이터 스트림 결합 실습을 해보도록 하겠습니다.
'프로그래밍 > Angular' 카테고리의 다른 글
[RxJS / angular] 17. 데이터 스트림과 액션 스트림, Subject를 사용하는 이유 (0) | 2022.07.28 |
---|---|
[RxJS / angular] 16. combineLatest 옵저버블 결합하기 (0) | 2022.07.25 |
[RxJS / angular] 14. combineLatest 생성 함수 (0) | 2022.07.19 |
[RxJS / angular] 13. 옵저버블 데이터 스트림 결합, 결합 연산자 유형 (0) | 2022.07.14 |
[RxJS / angular] 12. http response 매핑하기(포멧 바꾸기) (0) | 2022.07.13 |
댓글