๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Œ Language/Swift

[RxSwift] Subject๋ž€?

by Fomagran ๐Ÿ’ป 2021. 1. 28.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” Foma ์ž…๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ RxSwift ์—์„œ ์•„์ฃผ ํฐ ๋น„์ค‘์„ ์ฐจ์ง€ํ•˜๋Š” Subject์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!!

 

๋ฐ”๋กœ ์‹œ์ž‘ํ• ๊ฒŒ์š”~


Subject๋ž€?

 

๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ๋‚˜์™€์žˆ๋Š” ๋‚ด์šฉ์„ ํ•ด์„ํ•˜๋ฉด

 

"Subject๋Š” Observable๊ณผ Observable ์—ญํ• ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Observer์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜ ์ด์ƒ์˜ Observable์„ ๊ตฌ๋… ํ•  ์ˆ˜ ์žˆ๊ณ , Observable์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ด€์ฐฐํ•œ ํ•ญ๋ชฉ์„ ์žฌ๋ฐœ์†กํ•˜์—ฌ ํ†ต๊ณผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒˆ ํ•ญ๋ชฉ์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค."

 

๋ผ๊ณ  ๋˜์–ด์žˆ๋Š”๋ฐ์š”. 

 

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์˜ต์ €๋ฒ„๋ธ”๊ณผ ์˜ต์ €๋ฒ„์˜ ์—ญํ•  ๋‘˜ ๋‹ค ํ•œ๋‹ค ๋ผ๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค!

 

๋จผ์ € ์˜ต์ €๋ฒ„๋ธ”์€ ๋ญ˜๊นŒ์š”?

 

์ง€๋‚œ ์‹œ๊ฐ„์— "์˜ต์ €๋ฒ„๋ธ”์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ํ๋ฆ„์ด๋‹ค."๋ผ๊ณ  ์„ค๋ช…๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์˜ต์ €๋ฒ„๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

 

๋‹น์—ฐํžˆ ํ๋ฆ„(์˜ต์ €๋ฒ„๋ธ”)์—์„œ ๋ฐฉ์ถœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์ด์ฃ !

 

๊ทธ๋Ÿฐ๋ฐ ์„œ๋ธŒ์ ํŠธ๋Š” ์ด ๋‘๊ฐ€์ง€ ๊ฒƒ์„ ๋ชจ๋‘ ํ•˜๋‹ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๊ธฐ๋„ ํ•˜๊ณ  ๊ทธ ๋ฐฉ์ถœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜๋„ ์žˆ๋Š”๊ฒƒ์ด์ฃ !

 

์ด๋ ‡๊ฒŒ ๋งํ•˜๋ฉด ์ดํ•ด๊ฐ€ ํž˜๋“œ๋‹ˆ ์˜ˆ์ œ๋กœ ์•Œ์•„๋ณผ๊ฒŒ์š”.


Example

 

Observable & Observer(Subscriber)

 

์˜ต์ €๋ฒ„๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด onNext(๋ฐ์ดํ„ฐ), onError,onCompleted ๋“ฑ์„ ๋ฐฉ์ถœํ•˜๋Š” ๋…€์„์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋งจ ์•„๋žซ์ค„์— subcriber๋Š” ๊ทธ ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…ํ•˜์—ฌ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๊ฒƒ์„ ๋ฐฉ์ถœํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๊ด€์ฐฐํ•˜๋Š” ๋…€์„์ด์ฃ !

Subject

 

ํ•˜์ง€๋งŒ ์„œ๋ธŒ์ ํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž๊ธฐ ์ž์‹ ์„ ๊ตฌ๋…ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜์—ฌ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋…์„ ํ•œ ๋’ค์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ง˜๋Œ€๋กœ ๋ฐฉ์ถœํ•˜๊ณ  ๊ตฌ๋…ํ•œ ํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ !

 

 

์ด๋Ÿฌํ•œ ์„œ๋ธŒ์ ํŠธ๋Š” 4๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


AsyncSubject

 

AsyncSubject๋Š” ์•„๋ž˜ ๋งˆ๋ธ”๊ณผ ๊ฐ™์ด ๋งจ ๋งˆ์ง€๋ง‰์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ปดํ”Œ๋ฆฟ์ด ๋์„๋•Œ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์ด ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœ๋˜๋„ ์ปดํ”Œ๋ฆฟ์ด ๋˜๊ธฐ์ „๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณค comleted์ด ๋˜๋Š” ์ˆœ๊ฐ„

 

๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„์‹œ์—” ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค.)

 


PublishSubject

 

PublishSubject๋Š” AsyncSubject์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฉ์ถœ๋˜๋ฉด ๊ทธ ์ฆ‰์‹œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ตฌ๋…ํ•˜๊ธฐ์ „ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•œ ๊ฒƒ์€ ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  ๊ตฌ๋… ์ดํ›„์— ๋ฐฉ์ถœ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด Publish 1์ด ๊ตฌ๋…ํ•˜๊ธฐ์ „์— ๋ฐฉ์ถœ๋ฉ๋‹ˆ๋‹ค. 

 

์ถœ๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ตฌ๋… ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  ๊ตฌ๋… ์ดํ›„ ๋ฐฉ์ถœ๋œ Publish2,Publish3๋งŒ ์ „๋‹ฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ปดํ”Œ๋ฆฟ์ด๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐฉ์ถœ๋˜๋ฉด ์ปดํ”Œ๋ฆฟ๊ณผ ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ๋ฆ„์ด ๋๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


BehaviorSubject

 

BehaviorSubject๋Š” PublishSubject์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ ์€ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

PublishSubject๋Š” ์•„๋ฌด๋Ÿฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„๋•Œ ๊ตฌ๋…ํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ BehaviorSubject๋Š” ๊ตฌ๋…์ด์ „์— ์•„๋ฌด๋Ÿฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์ค€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ๊ตฌ๋… ์ด์ „์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฉ์ถœ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋… ์ดํ›„์— ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด BehaviorSubject์— ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ Behavior 1์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ๊ตฌ๋…ํ•˜๋ฉด ๊ทธ ์ฆ‰์‹œ Behavior์ด ์ „๋‹ฌ๋˜๊ณ 

 

๊ทธ ๋’ค๋กœ ๋ฐฉ์ถœ๋œ Behavior2 Behavior 3๊ฐ€ ์ „๋‹ฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


ReplaySubject

 

๋งˆ์ง€๋ง‰์œผ๋กœ ReplaySubject๋Š” ์ƒ์„ฑ์‹œ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ buffersize๋ผ๋Š” ๊ฒƒ์„ ์ •ํ•ด์ฃผ์–ด ๊ตฌ๋…์ด์ „์— ๋ฐฉ์ถœํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด

 

๋์—์„œ๋ถ€ํ„ฐ ์–ผ๋งŒํผ ๊ฐ€์ ธ์˜ฌ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

BehaviorSubject์™€ PublishSubject์™€ ๊ฐ™์ด ๊ตฌ๋… ์ดํ›„ ๋ฐฉ์ถœ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ”๋กœ ์ „๋‹ฌ๋˜๊ฒŒ ๋˜๊ณ  ์ปดํ”Œ๋ฆฟ์ด๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ

 

์ปดํ”Œ๋ฆฟ๊ณผ ์—๋Ÿฌ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ํ๋ฆ„์ด ๋๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์ด bufferSize๋ฅผ 2๋กœ ์ฃผ๊ณ  ๊ตฌ๋… ์ „์— Replay 1 Replay 2 Replay 3 ์„ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ๊ตฌ๋…์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ตฌ๋… ์ด์ „์— ๋ฐฉ์ถœ๋˜์—ˆ๋˜ ๋ฐ์ดํ„ฐ ์ค‘ ๋์—์„œ๋ถ€ํ„ฐ 2๊ฐ€์ง€์ธ Replay2์™€ Replay 3์ด ์ „๋‹ฌ๋˜๊ณ 

 

๊ทธ ๋’ค๋กœ ๋ฐฉ์ถœ๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ณง๋ฐ”๋กœ ์ „๋‹ฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


 

์˜ค๋Š˜์€ ์ด๋ ‡๊ฒŒ Subject์˜ ๊ฐœ๋…๊ณผ ์ด 4๊ฐ€์ง€์˜ Subject๊ฐ€ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š”.

 

์•„์ง์€ ์ €๋„ ์ด๋ ‡๊ฒŒ ์ด๋ก ๋งŒ ๊ณต๋ถ€๋งŒ ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด์ง„ ๋ชปํ–ˆ๋Š”๋ฐ 

 

๋งŒ์•ฝ ์ ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํฌ์ŠคํŒ…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

๊ทธ๋ฆฌ๊ณ  ๊ถ๊ธˆํ•˜์‹  ๋‚ด์šฉ์ด ์žˆ๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ์ ์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜ ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์„ธ์š”~~!

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€