Subscription 관리가 중요한 이유는 뭔가요?
생성한 subscription을 관리하고 정리하는 방법에 대해 생각하지 않으면 애플리케이션에 일련의 문제가 발생할 수 있습니다.
이것은 Observer Pattern이 구현되는 방식 때문입니다.
obs$.subscribe(data => doSomethingWithDataReceived(data));
이 subscription을 관리하지 않으면
obs$가 새 값을 내보낼 때마다 doSomethingWithDataReceived가 호출됩니다.
Subscription 관리는 어떻게 하나요?
적절할 때 Observable을 complete하거나 unsubscribe 하는 것입니다.
즉, 적절할 때 정리해서 실행하면 안될 때 코드가 실행되는 것을 방지합니다.
Subscription을 어떻게 정리(Clean up)하나요?
subscription 관리가 RxJS 작업의 필수 부분이라는 것을 알았으니,
구독을 관리하는 데 사용할 수 있는 방법을 알아봅시다
수동으로 구독 해제(unsubscribing) - 뷰에 들어갈 때 / 나갈 때
한 가지 방법은 활성 구독이 더 이상 필요하지 않을 때 수동으로 구독을 취소하는 것입니다.
RxJS는 이를 수행하는 편리한 방법을 제공합니다.
Subscription의 .unsubscribe() 메서드 입니다.
let homeViewSubscription = null;
function onEnterView() {
homeViewSubscription = obs$.subscribe(data => doSomethingWithDataReceived(data));
}
function onLeaveView() {
homeViewSubscription.unsubscribe();
}
- 구독을 저장할 변수를 만듭니다.
- 뷰에 들어갈 때 구독을 변수에 저장합니다.
- 뷰를 떠날 때 구독을 취소합니다.
- 필요하지 않을 때 doSomethingWithDataReceived()가 실행되는 것을 방지하기 위해서 입니다
위의 예를 수정하여 이 작업을 수행하는 방법을 살펴보겠습니다.
const homeViewSubscriptions = [];
function onEnterView() {
homeViewSubscriptions.push(
obs$.subscribe(data => doSomethingWithDataReceived(data)),
anotherObs$.subscribe(user => updateUserData(user))
);
}
function onLeaveView() {
homeViewSubscriptions.forEach(subscription => subscription.unsubscribe());
}
- 구독을 저장할 배열을 만듭니다.
- 뷰애 들어갈 때 각 구독을 배열에 추가합니다.
- 뷰를 떠날 때, 배열 내의 구독 객체 전체의 구독을 취소합니다.
연산자 사용하기(Using Operator) - 조건부
RxJS는 조건이 충족되면 구독을 자동으로 정리하는 몇 가지 연산자를 제공하므로,
구독을 추적하기 위해 변수를 설정하는 것에 대해 걱정할 필요가 없습니다.
이 중 몇 가지를 살펴보겠습니다!
first
function onEnterView() {
obs$.pipe(first())
.subscribe(data => doSomethingWithDataReceived(data))
}
take
take 연산자를 사용하면 구독을 취소하기 전에 Observable에서 수신하려는 값의 수를 지정할 수 있습니다.
즉, 지정된 갯수의 값을 받으면 take가 자동으로 구독을 취소합니다.
function onEnterView() {
obs$.pipe(take(5))
.subscribe(data => doSomethingWithDataReceived(data))
}
takeUntil
takeUntil 연산자는
다른 notifier Observable이 새 값을 방출할 때까지 Observable에서 값을 계속 수신할 수 있는 옵션을 제공합니다.
예제를 봅시다.
const notifier$ = new Subject();
function onEnterView() {
obs$.pipe(takeUntil(notifier$)).subscribe(data => doSomethingWithDataReceived(data))
}
function onLeaveView() {
notifier$.next();
notifier$.complete();
}
- Subject를 사용하여 notifier$ Observable을 만듭니다. (여기(Creating Observables here)에서 Observable 생성에 대해 자세히 알아볼 수 있습니다.)
- 우리는 notifier$가 값을 방출할 때까지 값을 받기를 원한다는 것을 나타내기 위해 takeUntil을 사용합니다.
- 우리는 notifier$에게 값을 내보내도록 지시하고 뷰를 떠날 때 _(notifer$를 스스로 정리해야 함) 완료하여 원래 구독을 구독 취소할 수 있도록 합니다.
takeWhile
또 다른 옵션은 takeWhile 연산자입니다.
지정된 조건이 true로 유지되는 동안 계속 값을 받을 수 있습니다.
false가 되면 자동으로 구독 취소됩니다.
function onEnterView() {
obs$
.pipe(takeWhile(data => data.finished === false))
.subscribe(data => doSomethingWithDataReceived(data))
}
위의 예에서 우리는 방출된 데이터에 대해 종료된 속성이 false인 동안 계속 값을 수신할 것임을 알 수 있습니다.
true로 바뀌면 takeWhile이 구독을 취소합니다!
언제 해당 벙법중 하나를 사용해야 할까요?
Observable이 새로운 값을 방출할 때 더 이상 코드를 실행하고 싶지 않을 때
- SPA에서 뷰에서 뷰로 이동할 때입니다.
- Angular / Vue에서는 컴포넌트를 distroy할 때 사용합니다.
- 상태 관리와 결합하여 앱의 생명 주기 동안 변경되지 않을 것으로 예상되는 상태 조각을 한 번만 구독할 때 사용할 수 있습니다.
- 조건이 충족될 때 수행합니다. 이 조건은 사용자가 처음 클릭하는 것부터 일정 시간이 경과한 때 등 다양할 수 있습니다.
RxJS 및 Subscription으로 작업할 때
반드시 Observable에서 더 이상 값을 받고 싶지 않을 때를 생각하고
반드시 이를 위한 코드를 구현하세요!
'FrontEnd' 카테고리의 다른 글
RxJS로 HTTP 리턴 데이터 매핑하기 (0) | 2022.10.08 |
---|---|
RxJS를 이용하여 오류 처리하기 (0) | 2022.10.08 |
RxJS로 옵저버블을 만드는 방법 (0) | 2022.10.08 |
RxJS 기본 Operator와 사용방법 (0) | 2022.10.08 |
Rxjs 시작하기 (0) | 2022.10.08 |