๐ค
๊ฐ๋ 6๏ธโฃ Cold Observable vs Hot Observable
RxJava์์๋ Observable
์ subscribeํ๋ Observer
๊ฐ ์กด์ฌํ๋ค. Observer
๋ Observable
์ด ์์ฐจ์ ์ผ๋ก ๋ฐํํ๋ ๋ฐ์ดํฐ์ ๋ํด์ ๋ฐ์ํ๋ค. Observable์ ๊ตฌํํ๋ ๋ฐฉ์์์ Observable๊ณผ Observer ์ฌ์ด์ ๋์ ์ฐจ์ด๊ฐ ์๋๋ฐ, ์ด๋ฅผ Cold Observable๊ณผ Hot Observable์ด๋ผ๊ณ ํ๋ค.
1๏ธโฃ Cold Observable
Cold Observable
์ Observable์ ๊ตฌ๋
์ ์์ฒญํ๋ฉด ์์ดํ
์ ๋ฐํํ๊ธฐ ์์ํ๋ค. ์์ดํ
์ ์ฒ์๋ถํฐ ๋๊น์ง ๋ฐํ๋๊ณ , ์์๋ก ์ข
๋ฃ์ํค์ง ์๋ ์ด์ ์ฌ๋ฌ ๋ฒ ์์ฒญํด๋ ์ฒ์๋ถํฐ ๋๊น์ง ๋ฐํํ๋ ๊ฒ์ ๋ณด์ฅํ๋ค. interval ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ 1์ด๋ง๋ค ์์ดํ
์ ๋ฐํํ๋ Cold Observable ์์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด์.
val src = Observable.interval(1, TimeUnit.SECONDS)
src.subscribe{
value -> println("#1: $value")
}
Thread.sleep(3000)
src.subscribe {
value -> println("#2: $value")
}
Thread.sleep(3000)
#1: 0
#1: 1
#1: 2
#1: 3
#2: 0
#1: 4
#2: 1
#1: 5
#2: 2
Observable์ ๊ตฌ๋ ํ๊ณ 3์ด ๋ค์ ์๋ก์ด ๊ตฌ๋ ์๋ก ๋ค์ ๊ตฌ๋ ํ์ ๋๋ ์ฒ์๋ถํฐ ๋ค์ ์์ดํ ์ ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
2๏ธโฃ Hot Observable
๋ฐ๋ฉด์ Hot Observable
์ ์์ดํ
๋ฐํ์ด ์์๋ ์ดํ๋ก ๋ชจ๋ ๊ตฌ๋
์์๊ฒ ๋์์ ๊ฐ์ ์์ดํ
์ ๋ฐํํ๋ค. ๋ง์ฝ์ ์ฒซ ๋ฒ์งธ ๊ตฌ๋
์๊ฐ ์์ดํ
์ ๋ฐํํ๋ Observable
๋ฅผ ๊ตฌ๋
ํ๊ณ , ๋ช ์ด ๋ค์ ๋ ๋ฒ์งธ ๊ตฌ๋
์๊ฐ ๋๊ฐ์ Observable
์ ๊ตฌํ๋ค๋ฉด, ๋์ ๊ฐ์ ์์ดํ
์ ๋์์ ์์ ํ์ง๋ง, ๋ ๋ฒ์งธ ๊ตฌ๋
์๋ ๊ตฌ๋
ํ๊ธฐ ์ ์ ๋ฐํ๋ ์์ดํ
์ ๋์น ์ ์๋ค.
Subject
Subject
๋ Observable๊ณผ Observer๋ฅผ ๋ชจ๋ ๊ตฌํํ ์ถ์ ํ์
์ด๋ฉฐ, ํ๋์ ์์ค์์ ์ฌ๋ฌ ๊ตฌ๋
์์๊ฒ ๋ฉํฐ์บ์คํ
์ ํ ์ ์๋ค. Subject๋ Observer๋ฅผ ๊ตฌํํ๋ฏ๋ก, onNext(), onError(), onComplete() ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ์ฌ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
์๋ค์๊ฒ ์ ๋ฌํ ์ ์๋ค. Subject๋ฅผ ๊ตฌํํ ํ์
์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ (1) PublishSubject
์ (2) BehaviorSubject
์ ๋ํด ์์๋ณด์.
1๏ธโฃ PublishSubject
PublishSubject
๋ Subject๋ฅผ ๊ตฌํํ ๊ฐ์ฅ ๋จ์ํ ํ์
์ค ํ๋์ด๋ค. PublishSubject
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ๋จํ ์ด๋ฒคํธ๋ฅผ ๋ธ๋ก๋์บ์คํ
ํ๋ ์์ ๋ฅผ ํ์ธํด๋ณด์.
val src: Subject<String> = PublishSubject.create()
src.subscribe({item -> println("A: $item")},
{t -> Timber.e(t)},
{ -> println("A: onComplete")})
src.subscribe({item -> println("B: $item")},
{t -> Timber.e(t)},
{ -> println("B: onComplete")})
src.onNext("Hello")
src.onNext("World")
src.onNext("!!!")
src.onComplete()
A: Hello
B: Hello
A: World
B: World
A: !!!
B: !!!
A: onComplete
B: onComplete
create() ๋ฉ์๋๋ก Subject ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. Subject
๋ Observable์ด๋ฉด์, Observer์ด๋ฏ๋ก ๋ฐํ๊ณผ ๊ตฌ๋
์ ๋ชจ๋ Subject ๊ฐ์ฒด๋ฅผ ํตํด ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค(onNext, subscribe). Subject๋ฅผ ์ด์ฉํ ๋ ์ฃผ์ํ ์ ์ Subject
๊ฐ Hot Observable์ด๋ผ๋ ๊ฒ์ด๋ค.
์๋์ ์ฝ๋์ ๊ฐ์ด ์์ดํ
์ ๋ฐํํ ๋ค ๊ตฌ๋
ํ๋ฉด ์์ดํ
์ 1๋ ์๋นํ ์ ์๋ค.
val src: Subject<String> = PublishSubject.create()
src.onNext("Hello")
src.onNext("World")
src.onNext("!!!")
src.onComplete()
src.subscribe({item -> println("A: $item")},
{t -> Timber.e(t)},
{ -> println("A: onComplete")})
src.subscribe({item -> println("B: $item")},
{t -> Timber.e(t)},
{ -> println("B: onComplete")})
A: onComplete
B: onComplete
Subject
๋ Observer์ด๊ธฐ๋ ํ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ Observable์ ๊ตฌ๋
์๋ก์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์๋ ์๋ค. ์๋นํ๋ ์์ดํ
์ ๋ค์ Observable๋ก ๊ตฌ๋
ํ์ฌ ๋ค๋ฅธ ๊ตฌ๋
์์๊ฒ ์ ๋ฌํ๋ ์์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด์.
val src1 = Observable.interval(1, TimeUnit.SECONDS)
val src2 = Observable.interval(500, TimeUnit.MILLISECONDS)
val subject: Subject<String> = PublishSubject.create()
src1.map{item -> "A: $item"}.subscribe(subject)
src2.map{item -> "B: $item"}.subscribe(subject)
subject.subscribe(System.out::println)
Thread.sleep(5000)
B: 0
B: 1
A: 0
B: 2
B: 3
A: 1
B: 4
B: 5
A: 2
B: 6
A: 3
B: 7
B: 8
B: 9
A: 4
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด PublishSubject์ธ subject๋ฅผ ํตํด ๊ตฌ๋ ํ๊ณ ์์ดํ ์ ์ฌ๋ฐํํ๋ฉฐ, ๋ Observable ์์ค๋ฅผ ๋ฌถ์ด์ ์ด๋ฒคํธ ๊ด๋ฆฌํ ์ ์์์ ์ ์ ์๋ค(System.out::println์ผ๋ก src1+src2 ์์ดํ ์ด ๊ฐ์ด ๋์ด!).
2๏ธโฃ BehaviorSubject
๋ ๋ค๋ฅธ Subject์ ์๋ธ ํด๋์ค๋ก BehaviorSubject
๊ฐ ์๋ค. BehaviorSubject
๋ PublishSubject์ ๋์ผํ๊ฒ ๋์ํ์ง๋ง, ์๋ก์ด Observer๋ฅผ ํตํด ๊ตฌ๋
ํ ๋, ๊ฐ์ฅ ๋ง์ง๋ง ์์ดํ
๋ง์ ๋ฐํํ๋ค๋ ์ฐจ์ด์ ์ด ์๋ค. BehaviorSubject๋ ๊ฐ์ฅ ์ต๊ทผ ์ํ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ค์ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
val subject: Subject<Int> = BehaviorSubject.create()
subject.subscribe{item->println("A: $item")}
subject.onNext(1)
subject.onNext(2)
subject.subscribe{item->println("B: $item")}
subject.onNext(3)
subject.subscribe{item->println("C: $item")}
A: 1
A: 2
B: 2
A: 3
B: 3
C: 3
์์์ ํ์ธํ ๊ฒ๊ณผ ๊ฐ์ด BehaviorSubject
๋ ๊ตฌ๋
์ ์์ํ ๋ Subject๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ฐํํ ์์ดํ
์ ๊ฐ์ ธ์ค๋ฉฐ, ์ดํ์ ๋ฐํ๋๋ ์์ดํ
๋ค์ ๋ชจ๋ PublishSubject์ ๋์ผํ๊ฒ ๋ชจ๋ ์์ ํ ์ ์๋ค.