티스토리 뷰
0. Introduction
RxJava에서 Subject는 여러 구독자에게 값을 멀티캐스트하는 데 사용할 수 있는 Observable 유형입니다. item이 Subject로 방출되면 Subject는 현재 모든 구독자에게 item을 전달합니다.
PublishSubject 및 BehaviorSubject를 포함하여 RxJava에서 사용할 수 있는 여러 유형의 Subject가 있습니다.
1. Subject Class
Subject 클래스는 RxJava의 모든 유형의 Subject에 대한 기본 클래스입니다. Observer 인터페이스를 구현합니다.
즉, 다른 Observable처럼 구독할 수 있습니다. 또한 구독자에게 item을 내보내고 구독 목록을 관리하는 방법도 제공합니다.
다음은 Kotlin에서 Subject를 생성하는 예입니다.
val subject = Subject.create<Int>()
2. PublishSubject vs. BehaviorSubject
PublishSubject 동작 방식
item이 PublishSubject로 내보내지면 현재 모든 구독자에게 즉시 멀티캐스트됩니다.
방출 후에 추가된 구독자는 방출된 항목을 받지 못하지만 PublishSubject로 방출되는 후속 item을 받게 됩니다.
다음은 Kotlin에서 PublishSubject를 사용하는 예입니다.
val subject = PublishSubject.create<Int>()
subject.subscribe { println("Subscriber 1: $it") }
subject.onNext(1)
subject.subscribe { println("Subscriber 2: $it") }
subject.onNext(2)
subject.subscribe { println("Subscriber 3: $it") }
subject.onNext(3)
Output:
Subscriber 1: 1
Subscriber 2: 1
Subscriber 1: 2
Subscriber 2: 2
Subscriber 3: 2
Subscriber 1: 3
Subscriber 2: 3
Subscriber 3: 3
이 예제에서 첫 번째 구독자는 PublishSubject로 내보내는 모든 item을 받는 반면 두 번째 및 세 번째 구독자는 구독한 후에 내보내는 item만 받습니다.
BehaviorSubject 동작 방식
item이 BehaviorSubject로 내보내지면 즉시 모든 현재 구독자에게 멀티캐스트됩니다.
방출 후에 추가된 구독자는 가장 최근에 방출된 item과 BehaviorSubject로 방출된 후속 item을 수신합니다.
다음은 Kotlin에서 BehaviorSubject를 사용하는 예입니다.
val subject = BehaviorSubject.createDefault("Hello")
subject.subscribe { println("Subscriber 1: $it") }
subject.onNext("World")
subject.subscribe { println("Subscriber 2: $it") }
subject.onNext("!")
subject.subscribe { println("Subscriber 3: $it") }
Output:
Subscriber 1: Hello
Subscriber 1: World
Subscriber 2: World
Subscriber 1: !
Subscriber 2: !
Subscriber 3: !
이 예제에서 모든 구독자는 BehaviorSubject로 내보낸 가장 최근 item과 모든 후속 item을 받습니다.
3. PublishSubject와 BehaviorSubject 비교
PublishSubject와 BehaviorSubject의 유사점
- PublishSubject 및 BehaviorSubject는 둘 다 여러 구독자에게 값을 멀티캐스트하는 데 사용할 수 있는 주제 유형입니다.
- 둘 다 Subject 클래스의 메서드와 동작을 상속합니다.
PublishSubject와 BehaviorSubject의 차이점
새 구독자가 구독할 때의 동작에 있습니다.
- PublishSubject는 구독 후에 방출되는 항목만 내보냅니다.
- BehaviorSubject는 가장 최근에 방출된 항목과 모든 후속 항목을 방출합니다.
PublishSubject 및 BehaviorSubject의 사용 사례
PublishSubject
: 여러 구독자에게 이벤트를 내보내야 하지만 이벤트에 특정 시작 시간이 없는 경우에 유용합니다.
- 실시간 채팅 응용 프로그램: 실시간 채팅 응용 프로그램에서 PublishSubject를 사용하여 사용자의 메시지를 채팅방의 다른 모든 사용자에게 내보낼 수 있습니다. 새 메시지가 전송되면 PublishSubject로 내보낼 수 있으며 메시지를 모든 현재 구독자에게 멀티캐스트합니다. 이를 통해 채팅방에서 사용자 간의 실시간 커뮤니케이션이 가능합니다.
- 이벤트 버스: PublishSubject를 이벤트 버스로 사용하여 여러 구독자에게 이벤트를 보낼 수도 있습니다. 예를 들어 Android 애플리케이션에서 PublishSubject를 사용하여 버튼 클릭 또는 네트워크 응답과 같은 이벤트를 내보낼 수 있습니다. 그러면 UI 구성 요소 또는 네트워크 처리기와 같은 구독자가 PublishSubject를 수신하고 이벤트에 응답할 수 있습니다.
BehaviorSubject
: 새 구독자에게 최신 값을 제공하고 모든 구독자에게 후속 항목을 계속해서 내보내야 하는 상황에서 유용합니다.
- 캐싱: BehaviorSubject는 애플리케이션에서 캐싱을 구현하는 데 사용할 수 있습니다. 예를 들어 애플리케이션이 원격 서버에서 데이터를 가져와야 하는 경우 데이터를 BehaviorSubject에 저장할 수 있습니다. 애플리케이션이 데이터를 표시해야 하는 경우 캐시된 데이터를 가져오기 위해 BehaviorSubject를 구독할 수 있습니다. 그러면 BehaviorSubject가 사용 가능해지면 새 데이터로 업데이트할 수 있으므로 애플리케이션이 최신 데이터를 사용자에게 표시할 수 있습니다.
- 상태 관리: BehaviorSubject는 애플리케이션의 상태 관리에도 사용할 수 있습니다. 예를 들어 애플리케이션에 백그라운드 작업의 상태를 반영해야 하는 사용자 인터페이스가 있는 경우 BehaviorSubject를 사용하여 작업의 상태를 저장할 수 있습니다. 사용자 인터페이스는 BehaviorSubject를 구독하여 작업의 현재 상태를 가져올 수 있으며 BehaviorSubject는 작업이 진행됨에 따라 새 상태로 업데이트될 수 있습니다.