Search
Duplicate

RxSwift - Observable, Observer, Subscribe

Created
2023/09/15 06:39
Tags
RxSwift

RxSwift - Observable, Observer, Subscribe

ย RxSwift?

RxSwift๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์ˆœ์ฐจ์  ํ˜•ํƒœ์™€ ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๊ฒŒ๋” ๋„์™€์ค€๋‹ค.
โ†’ RxSwift๋Š” ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ด ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ „ํŒŒ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
โ€ข
๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์ˆœ์ฐจ์ ์ธ ํ˜•ํƒœ โ†’ Observable
โ€ข
ํ•ด๋‹น ์ด๋ฒคํŠธ์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ ์ „ํŒŒ ๋ฐ›๋Š” ๊ฒƒ โ†’ Observer

ย Observable๊ณผ Observer

ย 1. Observable

์–ด๋–ค ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ ๋กœ ๋งŒ๋“ ๋‹ค
โ€ข
๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ โ†’ Observable
Observable ์€ ๊ด€์ฐฐ์ด ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์œผ๋กœ, ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ์˜ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ
ย RxSwift์˜ Observable์˜ ์ •์˜
์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ์–ด๋–ค ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€,
๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ Observable์ด๋ž€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ ์ด๋‹ค.
์˜ˆ๋ฅผ๋“ค๋ฉด,
๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ UIButton ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ณด์ž.
๋ฒ„ํŠผ์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์œ ์ €์— ์˜ํ•ด ์–ธ์ œ ๋ฐœ์ƒํ• ์ง€ ์„ ์–ธํ•  ๋‹น์‹œ์—๋Š” ๋ชจ๋ฅธ๋‹ค.
โ†’ ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์˜€๋‹ค.
โ†’ ๋งŒ์•ฝ ๋ฒ„ํŠผ์ด sync ๋™์ž‘์ด์—ˆ๋‹ค๋ฉด, ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆด ๋•Œ๊นŒ์ง€ ์•„๋ฌด ์ž‘์—…๋„ ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.
โ†’ ๋”ฐ๋ผ์„œ ๋ฒ„ํŠผ์€ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ!
๊ทผ๋ฐ Reactive Programming ์ด๋ž€,
๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ „ํŒŒํ•˜๋Š”๋ฐ ์ค‘์ ์„ ๋‘” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค.
๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„ํŠผ,
๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฒ„ํŠผ์ด ํด๋ฆญ ๋œ๋‹ค๋Š” ๊ฒƒ
๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฒ„ํŠผ์˜ ํ๋ฆ„ ๋ณ€๊ฒฝ์„ ์ „ํŒŒํ•˜๊ธฐ ์œ„ํ•ด์„ 
์ด ๋ฒ„ํŠผ์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ โ€˜๊ด€์ฐฐ์ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœโ€™
์ฆ‰, Observable ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.
ย ์ •๋ฆฌ
โ€ข
๋ฒ„ํŠผ์˜ ํด๋ฆญ์„ ๋‚˜ํƒ€๋‚ด๋Š” UIButton์˜ tap ์ด๋ฒคํŠธ๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋กœ,
โ€ข
๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”์— ๋Œ€ํ•ด ๊ด€์ฐฐ์ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ,
โ€ข
์ฆ‰, RxSwift์—์„œ ์ด๋ฅผ Observable ํ˜•ํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์ด ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋ƒ๋ฉฐ๋Š
๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ๋‹ค โ†’ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด ๋ณ€๊ฒฝ ๋˜์—ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด ๋ฒ„ํŠผ์˜ tap event์— ๋Œ€ํ•œ Observable ์€
๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ(๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ), ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด โ€œํ•ญ๋ชฉ(item)โ€ ์ด๋ž€ ๊ฒƒ์„ โ€œ๋ฐฉ์ถœ(emit)โ€ ํ•œ๋‹ค.
Observable์„ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ์˜ โ€˜์‹œํ€€์Šคโ€™๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ
์‹œํ€€์Šค๋ผ๊ณ  ํ•œ ์ด์œ ๊ฐ€, ๋ฒ„ํŠผ์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋ˆŒ๋ฆฌ๋ฉด, ๊ทธ๋งŒํผ Observable์€ ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ •๋ฆฌํ•˜์ž๋ฉด,
๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๊ฒƒ์ด Observable ์ด๊ณ ,
์ด Observable ์€ ์‹ค์ œ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ, ์ด๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด
ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ํ•ญ๋ชฉ(item)์„ ์‹œํ€€์Šค๋กœ ๋ฐฉ์ถœํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์ด ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐฉ์ถœํ•˜๋Š” ํ•ญ๋ชฉ์„ ๋ˆ„๊ฐ€ ๋ฐ›์„๊นŒ? โ†’ Observer

ย 2. Observer

Observer๋Š” Observable์„ ๊ตฌ๋…ํ•œ๋‹ค.
Observer๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” Observable์ด ์žˆ์„ ๋•Œ,
ํ•ด๋‹น โ€˜Observable์„ ๊ตฌ๋…โ€™ ์„ ํ•  ๊ฒฝ์šฐ,
๊ทธ Observable์ด ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋˜์–ด ํ•ญ๋ชฉ(item)์„ ๋ฐฉ์ถœ ํ–ˆ์„ ๋•Œ,
๊ทธ ํ•ญ๋ชฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค!
๊ทธ๋Ÿฌ๋ฉด Observer๋Š” ๋„๋Œ€์ฒด Observable ๊ตฌ๋…์„ ์–ด๋–ป๊ฒŒ ํ•˜์ง€? โ†’ Subscribe ๋ฉ”์„œ๋“œ!
๋˜ํ•œ Observer๊ฐ€ ์ด Subscribe๋ฅผ ํ†ตํ•ด Observable์„ ๊ตฌ๋… ํ–ˆ์„ ๋•Œ,
์ด ์„ธ ๊ฐ€์ง€ ํด๋กœ์ €๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค˜์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ
Subscribe ๋ผ๋Š” ๋ฉ”์„œ๋“œ์˜ ์›ํ˜•์„ ๋ณด๋ฉด
public func subscribe( onNext: ((Element) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil ) -> Disposable
Swift
๋ณต์‚ฌ
์œ„์™€ ๊ฐ™์ด onNext, onError, onCompleted ๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๊ณ , ๋ชจ๋‘ ํƒ€์ž…์ด ํด๋กœ์ € ํƒ€์ž…์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๊ธฐ์กด์— ์–ด๋–ค ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๋„˜๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ, ํด๋กœ์ €๋กœ ๋„˜๊ฒผ์—ˆ๋Š”๋ฐ, ๊ฐ™์€ ๋งฅ๋ฝ์ด๋‹ค.
ย onNext:
โ€ข
Observable์ด ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ(item)์„ ๋ฐฉ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ด ํด๋กœ์ €๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
โ€ข
์ด๋•Œ Observable์ด ๋ฐฉ์ถœํ•˜๋Š” ํ•ญ๋ชฉ์„ ํด๋กœ์ €์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.
ย onError:
โ€ข
Observable์€ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ,
โ€ข
์ด ์˜ค๋ฅ˜๋ฅผ ๊ตฌ๋…์ž์ธ Observer์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
ย onCompleted:
โ€ข
Observable์€ ์ด๋ฒคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ๋”์ด์ƒ ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ๋•Œ,
โ€ข
์ด๋ฒคํŠธ๊ฐ€ ์™„๋ฃŒ ๋˜์—ˆ์Œ์„ ๊ตฌ๋…์ž์ธ Observer์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
ย ์š”์•ฝ
๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๊ฒƒ โ†’ Observable
Observable์€ ํ•ด๋‹น ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ญ๋ชฉ(item)์„ ๋ฐฉ์ถœํ•จ
๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ์ธ Observable์„ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ โ†’ Observer
Subscribe(onNext:โ€ฆ) ๋ฉ”์„œ๋“œ ๋ฅผ ํ†ตํ•ด Observable์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,
Observable์—์„œ ํ•ญ๋ชฉ์ด ๋ฐฉ์ถœ๋์„ ๋•Œ, ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๋•Œ, ์ด๋ฒคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํด๋กœ์ €๋กœ ์ž‘์„ฑํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

ย UIButton ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ ๋ณด๋Š” Observable๊ณผ Observer, Subscribe

RxSwift์—๋Š” UIKit์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†๋‹ค!
๊ทธ๋ž˜์„œ UI์™€ ๊ด€๋ จ๋œ Reactive Programming์„ ํ•˜๋ ค๋ฉด RxCocoa ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
import RxCocoa import RxSwift
Swift
๋ณต์‚ฌ
UIButton์€ UIKit์— ์†ํ•ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, RxCocoa๋ฅผ import ํ•ด์„œ UIButton์˜ tap์— ๋Œ€ํ•œ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. (tap ์ด๋ฒคํŠธ โ†’ .touchUpInside์— ๋Œ€ํ•œ ๋™์ž‘)
hjButton.rx .tap .subscribe(onNext: { print("Observable์ด ํ•ญ๋ชฉ์„ ๋ฐฉ์ถœ ํ–ˆ๋‹ค!") }, onError: { error in print("์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค!") }, onCompleted: { print("ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋๋‚ฌ๋‹ค!") }) .disposed(by: disposedBag)
Swift
๋ณต์‚ฌ
hjButton์— ๋Œ€ํ•ด tap event๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ,
subscribe(onNext:โ€ฆ)๋ฅผ ํ†ตํ•ด โ€˜๊ตฌ๋…โ€™์„ ํ•ด์„œ
ํ•ด๋‹น Observable์ด ๋ฐฉ์ถœํ•˜๋Š” ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ ,
์ด๋•Œ ์ด ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ
onNext (ํ•ญ๋ชฉ์ด ๋ฐฉ์ถœ ๋์„ ๋•Œ, ์ฆ‰ ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ์‹คํ–‰์‹œํ‚ฌ ํด๋กœ์ €)
onError (์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ ์‹คํ–‰์‹œํ‚ฌ ํด๋กœ์ €)
onCompleted (์ด๋ฒคํŠธ๊ฐ€ ์ข…๋ฃŒ๋์„ ๋•Œ ์‹คํ–‰์‹œํ‚ฌ ํด๋กœ์ €)
๋ฅผ ๊ฐ๊ฐ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.
์—ฌ๊ธฐ์„œ
Observer๋ฅผ ๋งŒ๋“  ์ ์ด ์—†๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ Observable์ด ๊ตฌ๋…์ด ๋˜์–ด ํ•ญ๋ชฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”๊ฑธ๊นŒ?
์ด๊ฒƒ์€ subscribe(onNext: โ€ฆ)๋กœ ํด๋กœ์ €๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ
์ž์ฒด์ ์œผ๋กœ AnonymousObserver ๋ž€ ๊ฒƒ์„ ์ƒ์„ฑํ•ด์„œ, ํ•ด๋‹น Observable์— subscribe๋ฅผ ํ•ด์ค€๋‹ค.
ย ๊ฒฐ๋ก 
subscribe(onNext:โ€ฆ) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์˜ต์ €๋ฒ„๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ
์šฐ๋ฆฌ๊ฐ€ ๋”ฐ๋กœ Observer๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํด๋กœ์ €๋งŒ ๋„˜๊ฒจ์ค˜๋„
Observable์„ ๊ตฌ๋…ํ•˜์—ฌ ๋ฐฉ์ถœํ•˜๋Š” ํ•ญ๋ชฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

ย Reference

RxSwift) Observable, Observer, Subscribe ํ๋ฆ„ ์ดํ•ดํ•˜๊ธฐ
์•ˆ๋…•ํ•˜์„ธ์š”, ์†Œ๋“ค์ž…๋‹ˆ๋‹ค ๐Ÿฎ 12์›” ํ•œ ๋‹ฌ.. ๋ง๋‚˜๋‹ˆ์ฒ˜๋Ÿผ ๋…ผ ์—…๋ณด๋ฅผ ์ฒญ์‚ฐํ•˜๋Ÿฌ ์™”์Šต๋‹ˆ๋‹ค.. OTL.. ์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„  RxSwift๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๊ฐœ๋…์ ์ธ ์ดํ•ด๋งŒ ํ–ˆ์ž–์•„์š”?? ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  Observable Observer Subscribe ์˜ ํ๋ฆ„์— ๋Œ€ํ•ด ์ข€ ์ดํ•ด๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹น! ๋‹น์žฅ Observable๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ๋ญ๊ณ  ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๊ณ ๋ฅผ ๋ฐฐ์šฐ๊ณ  ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ด๋“ค์ด ์–ด๋–ค ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด๋ฃจ๋Š”์ง€์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ ํฌ์ŠคํŒ…์ด์—์š”! ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋” ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃฐ ๋‚ด์šฉ์€ ๋‹ค์Œ ํฌ์ŠคํŒ…๋ถ€ํ„ฐ ์ง„ํ–‰ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ์ด์ „ ํฌ์ŠคํŒ… ๋‚ด์šฉ์„ ์ˆ™์ง€ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์“ฐ๊ธฐ ๋•Œ๋ฌธ์—, Reactive Programming์ด ๋ญ”์ง€ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด ๋จผ์ € ๋ณด๊ณ ์˜ค์‹œ๊ธธ ๋ฐ”๋ผ..