Subject

Subject는 옵저버와 옵저버블의 역할을 하는 ReactiveX의 일부 구현에서 사용할 수 있는 일종의 bridge 또는 proxy이다. Subject는 옵저버이기 때문에 하나 이상의 옵저버블을 구독할 수 있다. 또한 옵저버블이기 때문에 관찰한 항목을 다시 방출해 넘겨줄 수 있으며, 새 항목을 방출할 수도 있다.

Subject가 옵저버블을 구독하기 때문에 옵저버블이 항목의 방출을 시작하도록 트리거한다(옵저버블이 “Cold”인 경우. 즉, 옵저버블이 항목의 방출을 시작하기 전에 구독을 기다리는 경우). 이 방법으로 생성된 Subject가 원래 “Cold” 옵저버블을 “Hot” 옵저버블로 변형하는 효과를 가질 수 있다.

Varieties of Subjects

특정 사용 사례를 위해 설계된 subject에는 네 가지 종류가 있다. 모든 구현에서 이들 모두를 사용할 수 있는 것은 아니며 일부 구현에서는 다른 명명법을 사용한다. (예: RxScala 에서는 이 문서에서 “PublishSubject”라고 하는 것을 간단히 “Subject”라고 함.)

1️⃣ AsyncSubject

S.AsyncSubject_Marble_Complete.jpg

AsyncSubject는 소스 옵저버블이 방출한 최근 값(오직 최종 값만)을 해당 소스 옵저버블이 완료된 후에 방출한다. (소스 옵저버블이 값을 방출하지 않으면 AsyncSubject도 값을 방출하지 않고 완료된다.)

S.AsyncSubject_Marble_Error.jpg

또한 동일한 최종 값을 후속 옵저버에게 방출한다. 그러나 소스 옵저버블이 오류와 함께 종료되면 AsyncSubject는 항목을 방출하지 않고 단순히 소스 옵저버블의 오류 알림을 전달한다.

2️⃣ BehaviorSubject

S.BehaviorSubject_Marble_complete.jpg

옵저버가 BehaviorSubject에 구독하면 소스 옵저버블에서 가장 최근에 방출된 항목(또는 아직 방출되지 않은 경우 시드 / 기본값)을 방출하는 것으로 시작한 다음 소스 옵저버블에서 나중에 방출된 다른 항목을 계속 내보낸다.

S.BehaviorSubject_Marble_Error.jpg