Hot vs Cold Observables

reactivex
๐Ÿฅถ Observable VS. ๐Ÿ”ฅ Observable

์ด ๋‚ด์šฉ์€ ๋™์ผํ•œ ์ œ๋ชฉ์˜ ์˜์–ด ์›๋ฌธ Medium ํฌ์ŠคํŠธ๋ฅผ ๋ฒˆ์—ญํ•œ ๊ฒƒ์ž„

COLD is when your observable creates the producer

Cold ๋ฐฉ์‹์€ Observable์ด producer๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋ฅผ ์ผ์ปซ์Œ

// COLD ๐Ÿฅถ
var cold = new Observable((observer) => {
  var producer = new Producer();
  // have observer listen to producer here
});

HOT is when your observable closes over the producer

Hot ๋ฐฉ์‹์€ Observable ๋ฐ–์—์„œ producer๊ฐ€ ์กด์žฌํ•  ๋•Œ๋ฅผ ์ผ์ปซ์Œ

// HOT ๐Ÿ”ฅ
var producer = new Producer();
var hot = new Observable((observer) => {
  // have observer listen to producer here
});

Getting deeper into whatโ€™s going onโ€ฆ

Hot๊ณผ Cold? ์ด๊ฒƒ์ด ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์žโ€ฆ

Observable ๋งŒ๋“ค๋ฉด์„œ Observable ๋ฐฐ์šฐ๊ธฐ ๋ผ๋Š” ํฌ์ŠคํŠธ์—์„œ Observable์ด ๋‹จ์ˆœํ•œ function์ž„์„ ์„ค๋ช…ํ–ˆ๋‹ค. ๊ทธ ํฌ์ŠคํŠธ์—์„œ์˜ ๋ชฉํ‘œ๋Š” Observable ์ž์ฒด์— ๋Œ€ํ•œ ์„ค๋ช…์ด์—ˆ๋Š”๋ฐ, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด Observable์— ๋Œ€ํ•ด ํ˜ผ๋™ํ•˜๊ณ  ์žˆ๋Š” Hot๊ณผ Cold์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋Š” ์„ค๋ช…ํ•˜์ง€ ์•Š์•˜๋‹ค.

Observables are just functions!

Observable์€ ๊ทธ๋ƒฅ ํ•จ์ˆ˜์ผ ๋ฟ์ด๋‹ค.

Observable์€ producer์™€ observer๋ฅผ ์„œ๋กœ ์—ฎ์–ด์ฃผ๋Š” ํ•จ์ˆ˜์ผ ๋ฟ์ด๋‹ค. ๊ทธ๊ฒŒ ๋‹ค๋‹ค. Observable ๋‚ด๋ถ€์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ producer๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๋Š” ์—†๊ณ , ๋‹จ์ง€ producer๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” observer๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š”, listenr๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๋ถ„ํ•ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์—ญ์ž ์ฃผ : ์•„๋งˆ complete๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค) subscription ํ•˜๋Š” ํ–‰์œ„๋Š” Observable์„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜๊ณ , ๊ตฌ๋… ๊ฐ’๋“ค์„ Observer์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Whatโ€™s a โ€œProducerโ€?

Producer๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

Producer๋Š” Observable์— ๋ฐœํ–‰๋  ๊ฐ’๋“ค์˜ ์›์ฒœ(source)์ด๋‹ค. Websocket์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ , DOM events๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, iterator๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ , ๋‹จ์ˆœํžˆ array๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, Observer.next(value)์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ชจ๋“  ํ˜•ํƒœ์˜ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

Cold Observables: Producers created inside

Cold Observable : Producer๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑ๋จ

Cold Observable์€ ๊ตฌ๋… ์ค‘์— producer๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ™œ์„ฑํ™” ๋˜๋Š” Observable์„ ๋œปํ•œ๋‹ค. ์ฆ‰, ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Observable์„ function์— ๋น„์œ ํ•˜์ž๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ producer๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ™œ์„ฑํ™”๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • โ‘  creates the producer (producer๋ฅผ ์ƒ์„ฑ)
  • โ‘ก activates the producer (producer๋ฅผ ํ™œ์„ฑํ™”)
  • โ‘ข starts listening to the producer (producer ์ˆ˜์‹ ์„ ์‹œ์ž‘)
  • โ‘ฃ unicast (๋‹จ์ผ ๋ฐœ์‹ ์ž <-> ๋‹จ์ผ ์ˆ˜์‹ ์ž)

Observable์„ ๊ตฌ๋…ํ•˜๋Š” ์ˆœ๊ฐ„์—์„œ์•ผ Observable ์„ ์–ธ ๋‚ด๋ถ€์—์„œ WebSocket์ด ์ƒ์„ฑ๋˜๊ณ  ์ˆ˜์‹ ๋˜๋ฏ€๋กœ, ์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” cold๋กœ ์ž‘์„ฑ๋œ ๊ฒƒ์ด๋‹ค.

const source = new Observable((observer) => {
  const socket = new WebSocket("ws://someurl");
  socket.addEventListener("message", (e) => observer.next(e));
  return () => socket.close();
});

์–ด๋–ค ๊ฒƒ์ด๋“  ์œ„ ์˜ˆ์ œ ์ฝ”๋“œ์˜ source๋ผ๋Š” ๋ณ€์ˆ˜์˜ Observable์„ ๊ตฌ๋…ํ•˜๋ฉด, ๊ทธ ๊ตฌ๋…์— ๋Œ€ํ•œ ๋…๋ฆฝ์ ์ธ WebSocket Instance๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๊ณ , ๊ตฌ๋…์„ ํ•ด์ง€(unsubscribe)ํ•˜๋ฉด, ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ close()ํ•  ๊ฒƒ์ด๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ source๊ฐ€ unicast ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. producer๊ฐ€ ์˜ค์ง ํ•œ observer์—๊ฒŒ๋งŒ ๊ฐ’์„ ๋ฐœํ–‰ํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (Cold Observable Example Codes JSBin)

Hot Observables: Producers created outside

Hot Observable : Producer๊ฐ€ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋จ

๊ตฌ๋…์˜ ๋ฐ”๊นฅ ๋ถ€๋ถ„์—์„œ ์ƒ์„ฑ๋˜๊ณ  ํ™œ์„ฑํ™”๋˜๋Š” producer๋ฅผ ์ด์šฉํ•˜๋Š” Observable์„ Hot Observable์ด๋ผ ์นญํ•œ๋‹ค.

  • โ‘  shares a reference to a producer (producer์˜ ๊ฐ’์„ shareํ•˜๋Š” ํ˜•ํƒœ)
  • โ‘ก starts listening to the producer (producer์˜ ๋ฐœํ–‰์„ ์ˆ˜์‹ ํ•˜๊ธฐ ์‹œ์ž‘)
  • โ‘ข multicast (๋ณต์ˆ˜์˜ ์ˆ˜์‹ ์ž)

๋‹ค์Œ ์˜ˆ์ œ ์ฝ”๋“œ์™€ ๊ฐ™์ด, WebSocket์˜ ์ƒ์„ฑ์„ Observable์˜ ์ •์˜ ์™ธ๋ถ€์— ํ•œ๋‹ค๋ฉด hot Observable์ด ๋œ๋‹ค.

const socket = new WebSocket("ws://someurl");
const source = new Observable((observer) => {
  socket.addEventListener("message", (e) => observer.next(e));
});

์ด์ œ source ๋ณ€์ˆ˜์˜ producer๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์€ ๊ฐ™์€ WebSocket Instance๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ชจ๋“  ๊ตฌ๋…์ž๋“ค์—๊ฒŒ unicast๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ด ๋ฐฉ๋ฒ•์˜ ๋ฌธ์ œ์ ์€ ๋” ์ด์ƒ Observable์ด WebSocket์— ๊ด€ํ•œ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, Observable๋กœ๋Š” error๋‚˜ complete๋‚˜ unsubscribe๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค. ๋” ์ด์ƒ Observable๋กœ๋Š” ์†Œ์ผ“์„ ๋‹ซ์„ ์ˆ˜ ์—†๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง„์งœ ์›ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๋“ค์˜ cold Observable์„ hot์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. (์—ญ์ž ์ฃผ : producer๋ฅผ Observable ๋‚ด๋ถ€์— ์„ ์–ธํ•˜๋˜, unicast ๋ฐฉ์‹์ด ๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ณด์ž„) (Hot Observable Example Codes JSBin)

Why Make A โ€œHotโ€ Observable?

์™œ Hot Observable์„ ์ƒ์„ฑํ•˜๋Š”๊ฐ€?

Cold Observable์˜ ์—์ œ์—์„œ ๋ณด์•˜๋“ฏ์ด, ๋ชจ๋“  ๋•Œ์— ๋ชจ๋“  Observable์„ Cold๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด๋ณด์ผ ๊ฒƒ์ด๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด, WebSocket ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ˆ˜์‹  ๋˜๋Š” ๊ฐ’์„ ํ™€์ˆ˜์™€ ์ง์ˆ˜๋กœ ๊ตฌ๋ถ„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ด ๊ฒฝ์šฐ 2 ๊ฐœ์˜ Observable์„ ์ƒ์„ฑํ•˜๊ณ  2๊ฐœ์˜ ๊ตฌ๋…์„ ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ํ•œ ๋ฒˆ์˜ ๊ตฌ๋…์„ ํ†ตํ•ด ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ์ด ์ปดํ“จํŒ… ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž„์€ ์ž๋ช…ํ•˜๋‹ค.

source.filter((x) => x % 2 === 0).subscribe((x) => console.log("even", x));
source.filter((x) => x % 2 === 1).subscribe((x) => console.log("odd", x));
// ๋‘ ๋ฒˆ์˜ ๊ตฌ๋…์ด ๋ฐœ์ƒํ•จ

Rx Subjects

Cold Observable์„ Hot์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์ „์—, (multicast๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์ „์—,) rx์˜ Subject ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. Subject๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์ด ์žˆ๋‹ค.

  • โ‘  Observable์ด๋‹ค. Observable๊ณผ ํ˜•ํƒœ๊ฐ€ ์œ ์‚ฌํ•˜๊ณ , ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Operator ๋˜ํ•œ ์™„์ „ ๋™์ผํ•˜๋‹ค.
  • โ‘ก Observer์ด๋‹ค. Observer๋ฅผ duck-typingํ•œ๋‹ค. ์ฆ‰, Observer์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. Observable๋กœ์„œ ๊ตฌ๋…๋˜๋ฉด, next()๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์„ ๋ฐœํ–‰ ๋ฐ ์ˆ˜์‹ ์„ ๋™์‹œ์— ํ•œ๋‹ค.
  • โ‘ข multicastํ•œ๋‹ค. subscribe()๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ ๋ชจ๋“  Observer๊ฐ€ ๋‚ด๋ถ€ Observer ๋ฆฌ์ŠคํŠธ์— ๋“ฑ๋ก๋œ๋‹ค.
  • โ‘ฃ ๋๋‚˜๋ฉด ๋๋‚œ๊ฑฐ๋‹ค. Subjcet๋Š” unsubscribe, complete, error ์ดํ›„์—๋Š” ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋‹ค.
  • โ‘ค ๋ฐ”๋กœ ์•ž์˜ 2๋ฒˆ ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๊ทธ ์ž์ฒด๋กœ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋ฉด์„œ๋„ ์ˆ˜์‹ ๋„ ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, Subject๋Š” 4๊ฐœ์˜ Observer-Pattern ์•ˆ์—์„œ addObserver ๋ฉ”์†Œ๋“œ์™€ ํ•จ๊ป˜ ๊ฐ์ฒด๋กœ ์ •์˜ ๋˜์–ด์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” addObserver ๋ฉ”์†Œ๋“œ๊ฐ€ subscribe๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. (Rx Subject Behavior JSBin)

Making A Cold Observable Hot

Cold Observable์„ Hot์œผ๋กœ ๋งŒ๋“ค๊ธฐ

Subject์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, functional Programming์˜ ๋ฐฉ๋ฒ•์„ ์•ฝ๊ฐ„ ์‚ฌ์šฉํ•ด์„œ Cold Observable์„ Hot์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

function makeHot(cold) {
  const subject = new Subject();
  cold.subscribe(subject);
  return new Observable((observer) => subject.subscribe(observer));
}

์œ„ ์˜ˆ์ œ์˜ makeHot ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ, ์ด ํ•จ์ˆ˜์— ์–ด๋–ค Cold Observable ์ด๋“ ๊ฐ„์— ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์„œ Subject๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Hot์œผ๋กœ ๋ฐ”๊ฟ” ์ค„ ์ˆ˜ ์žˆ๋‹ค. (Cold -> Hot Example Codes JSBin)

๊ทธ๋Ÿผ์—๋„ ์•„์ง ๋ฌธ์ œ์ ์€ ์žˆ๋Š”๋ฐ, ๊ตฌ๋…์ด source๋ฅผ ํŠธ๋ž™ํ‚นํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด๋‹น Observable์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์‹œ์ ์— ํ•ด์ œ ๋ฐ ์ข…๋ฃŒ (tear down) ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด reference counting์„ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•œ๋‹ค.

function makeHotRefCounted(cold) {
  const subject = new Subject();
  const mainSub = cold.subscribe(subject);
  let refs = 0;
  return new Observable((observer) => {
    refs++;
    let sub = subject.subscribe(observer);
    return () => {
      refs--;
      if (refs === 0) mainSub.unsubscribe();
      sub.unsubscribe();
    };
  });
}

์ด์ œ Observable์„ hot์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ์›ํ•  ๋•Œ์— Observable์„ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. refs๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ -0 ์ด๋˜๋ฉด Cold Observable์˜ source๊ฐ€ ์ œ๋Œ€๋กœ unsubscribe๋  ๊ฒƒ์ด๋‹ค. (Cold -> Hot Example Codes with Reference Counting JSBin)

In RxJS, Use publish() or share()

RxJS์—์„œ๋Š” publish()๋‚˜ share()๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

์•ž์„  ๊ตฌํ˜„์ฒ˜๋Ÿผ makeHot ํ•จ์ˆ˜๋Š” ์•„๋งˆ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๊ฐ™์€ ๋™์ž‘์ด publish()๋‚˜ share()๋ผ๋Š” operator๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Cold Observable์„ hot์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ฃผ ๋งŽ๋‹ค. ๊ทธ๋ž˜์„œ RxJS๋Š” ๊ทธ๋Ÿฌํ•œ ๋™์ž‘์„ ํšจ์œจ์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ๋” operator๋กœ ๊ตฌํ˜„ํ•ด ๋†“์€ ๊ฒƒ์ด๋‹ค.

RxJS 5์—์„œ share() ์—ฐ์‚ฐ์ž๋Š” Observable์„ hot์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉฐ, refCounted Observable์ด ์‹คํŒจ์‹œ์—๋Š” ์žฌ์‹œ๋„๋ฅผ, ์„ฑ๊ณต์‹œ์—๋Š” ๋ฐ˜๋ณตํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. ์ด๋Š” Subject๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ๊ตฌ๋… ํ•ด์ง€ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. share() ์—ฐ์‚ฐ์ž๋Š” ์ฃฝ์€ Subject๋ฅผ ์žฌํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์žฌ๊ตฌ๋…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ๊ตฌํ˜„๋˜์—ˆ๋‹ค.

share() Example Codes JSBin

The โ€œWarmโ€ Observable

๋”ฐ๋œปํ•œ Observable

ํ•˜๋‚˜์˜ ๊ตฌ๋…์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋‘ ๊ฐœ์˜ Subject๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ผ์€ ๋‚˜์œ ๋ฏธ์‹ ์ด๋‹ค.

โ€œHotโ€ and โ€œColdโ€ Are All About The Producer

โ€œHotโ€๊ณผ โ€œColdโ€๊ฐ€ producer์˜ ์ „๋ถ€์ด๋‹ค.

Observable ์•ˆ์—์„œ shared reference๋ฅผ closeํ•œ๋‹ค๋ฉด, hot ๋ฐฉ์‹์ด๋‹ค. Observable ๋‚ด๋ถ€์—์„œ ์ƒˆ๋กœ์šด producer๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด cold ๋ฐฉ์‹์ด๋‹ค. ๋งŒ์•ฝ์— ๋‘˜๋‹คํ•œ๋‹ค๋ฉดโ€ฆ ๋ญ˜ ํ•˜๋Š”๊ฑฐ์ง€? ์•„๋งˆ๋„ Warm ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™๋‹ค.

TL;DR

์ง์ ‘ producer๋ฅผ ๊ณ„์†ํ•ด์„œ ์ƒ์„ฑํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด, Observable์„ HOT ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

References

Hot vs Cold Observables ์›๋ฌธ

Observable ๋งŒ๋“ค๋ฉด์„œ Observable ๋ฐฐ์šฐ๊ธฐ

Cold Observable Example Codes JSBin

Hot Observable Example Codes JSBin

Rx Subject Behavior JSBin

Cold -> Hot Example Codes JSBin

Cold -> Hot Example Codes with Reference Counting JSBin

share() Example Codes JSBin