๐ŸŽ iOS/iOS Programming

[iOS] ReactiveX, Reactive Programming

TechYeon 2024. 11. 11. 23:20

Reactive Programming

  • Reactive Programming์ด๋ž€ ๋น„๋™๊ธฐ์  ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ์ „๋‹ฌ์— ๊ด€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.
  • Reative Programming์˜ ํ•ต์‹ฌ์€ ๋ชจ๋“  ๊ฒƒ์„ ๋น„๋™๊ธฐ์  ๋ฐ์ดํ„ฐ์˜ stream์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ง์ ‘ ์ •ํ•ด์„œ ์‹คํ–‰๋˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ์„ ๋•Œ, ์ด๋ฅผ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ๋Š” Reative Programming์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ์‹ค์‹œ๊ฐ„์„ฑ์„ ๊ฐ€์ง„๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•œ ์ˆœ์„œ์™€ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ๊ทธ์— ๋”ฐ๋ผ์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™”๋ฉด์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ง€์†์ ์œผ๋กœ ํŠน์ • ๊ฐ’์— ๋Œ€ํ•œ ๊ด€์ฐฐ์„ ํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ฐ’์„ ๊ด€์ฐฐํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ๊ฐ’์— ๋ณ€ํ™”๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ํŠน์ • ์—ฐ์‚ฐ์ด ์ด๋ค„์ง€๋Š” ๊ฒƒ์ด๋‹ค.
    • ์‚ฌ์šฉ์ž๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๋‹น ๊ฐ’์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š”๋ฐ, Reactive Programming์—์„œ๋Š” ์ด๋ฅผ ๋ฐ”๋กœ ํŒŒ์•…ํ•˜๊ณ  ํ™”๋ฉด ํ˜น์€ ๋‹ค๋ฅธ ๊ณณ์— ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๐Ÿค” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š๋‚˜์š”?
๋ฌผ๋ก  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ๊ด€์ฐฐ์ด ์•„๋‹Œ, ๋‹จ์ˆœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 
ํ•˜์ง€๋งŒ, ์—ฐ์†๋œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋˜๋Š” ๋“ฑ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ด€์ฐฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ !!!!

๋˜, ์ด๋ฏธ Swift์—๋Š” ๋น„๋™๊ธฐ API(Notification, Delegate, Grand Central Dispatch(GCD), Closures) ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ๋ถ€๋ถ„๋ณ„๋กœ ๋‚˜๋ˆ  ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๋ฐ›๊ณ  ๋‚œ ํ›„์— UI Update๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
๋ฐ˜๋ฉด RxSwift๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ UI๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์ค€๋‹ค.

 

Observable

  • Rx์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋ฐ์ดํ„ฐ์˜ ์ŠคํŠธ๋ฆผ์ด๋ฉฐ ์ด๋ฅผ Observable์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.
    • ๋ชจ๋“  ๊ฒƒ์€ ๋ฐ์ดํ„ฐ์˜ ์ŠคํŠธ๋ฆผ
  • Rx๋Š” ์ด๋Ÿฌํ•œ Observable์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฅผ ๊ตฌ๋…(Subscribe)ํ•œ๋‹ค.
    • RxSwift๋Š” ํฌ๊ฒŒ Observable๊ณผ Subscribe์™€์˜ ๊ด€๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„ ์ฝ”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Observable์ด ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๋ฉด → ํ•ด๋‹น Observable์„ ๊ตฌ๋…ํ•œ Subscriber๊ฐ€ Observable์ด ๋ฐฉ์ถœํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ–๊ณ  ์•ก์…˜์„ ์ทจํ•˜๋Š” ๊ฒƒ์ด Rx์˜ ํ•ต์‹ฌ ๋™์ž‘์ด๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ํ•œ๋‹ค.
      • ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ?
      • : ์–ด๋– ํ•œ ๊ฐ’์˜ ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ์„œ ์•ก์…˜์„ ์ทจํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • Observable์€ ํŠน์ • ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ์ „๋‹ฌํ•˜๋Š” ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋“ค์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ Observer๋ผ๋Š” ๊ฒƒ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • Observer๋Š” Observable์„ Subscribe
    • ๊ทธ๋Ÿฌ๋ฉด Observer๋Š” Observable์ด ๋ฐœํ–‰ํ•˜๋Š” ์•„์ดํ…œ์ด๋‚˜ ์ผ๋ จ์˜ ์‹œํ€€์Šค์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • ์ด๋Ÿฌํ•œ ํŒจํ„ด์€ ๋™์‹œ์ ์ธ ์ž‘๋™์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
    • ์™œ๋ƒํ•˜๋ฉด Observable์ด ์•„์ดํ…œ์„ ๋ฐœํ–‰ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š” ์—†์ด ํŠน์ • ์•„์ดํ…œ์ด ๋ฐœํ–‰๋˜๋ฉด ๊ทธ ์‹œ์ ์„ ๊ฐ์‹œํ•˜๋Š” ๊ด€์ฐฐ์ž๋ฅผ Observer ๋‚ด๋ถ€์— ๋‘๊ณ  ๊ทธ ๊ด€์ฐฐ์ž๋ฅผ ํ†ตํ•ด ๋ฐœํ–‰ ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Marble Diagram

์•„๋ž˜ ๋ณด์—ฌ์ง€๋Š” ๊ทธ๋ฆผ์€ "๋งˆ๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ"์œผ๋กœ, Observable์˜ ํ๋ฆ„๊ณผ ์ „ํ™˜์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ

 

  • ์œ„์˜ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ–ฅํ•˜๋Š” ํ™”์‚ดํ‘œ๋Š” Observable์˜ ํƒ€์ž„๋ผ์ธ์ด๋‹ค.
    • ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ๋ฆ„
  • ์œ„์˜ ํ™”์‚ดํ‘œ์— ์œ„์น˜ํ•˜๋Š” ์•„์ดํ…œ๋“ค์€ Observable์— ์˜ํ•ด ๋ฐœํ–‰๋˜๋Š” ์•„์ดํ…œ๋“ค
  • ์•„์ดํ…œ๋“ค๊ณผ ํ•จ๊ป˜ ์ˆ˜์ง ์ง์„ ์œผ๋กœ ๋ณด์ด๋Š” ํ™”์‚ดํ‘œ๋Š” Observable์ด ์„ฑ๊ณต์ ์œผ๋กœ completed ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ–ˆ์Œ์„ ์˜๋ฏธ
  • ์œ„์—์„œ ์•„๋ž˜๋กœ ํ–ฅํ•˜๋Š” ์ ์„  ํ™”์‚ดํ‘œ์™€ ๋ฐ•์Šค๋Š” Observable์—์„œ ํ–‰ํ•ด์ง€๋Š” ํŠน์ •ํ•œ ๋ณ€ํ™˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฐ•์Šค ์•ˆ์ชฝ์— ์ ํžŒ ํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ์ด๊ฒƒ์ด ์–ด๋–ค ๋ณ€ํ™˜์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • ์œ„์˜ ์ด๋ฏธ์ง€์—์„œ๋Š” ๋’ค์ง‘๋Š” ๋ณ€ํ™˜์„ ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์•„๋ž˜์˜ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ–ฅํ•˜๋Š” ํ™”์‚ดํ‘œ๋Š” Observable์˜ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ
  • ์•„์ดํ…œ๋“ค๊ณผ ํ•จ๊ป˜ ์—‘์Šค ํ‘œ์‹œ๋กœ ๋ณด์ด๋Š” ํ™”์‚ดํ‘œ๋Š” error๋ฅผ ์˜๋ฏธ

 

Observer ์ƒ์„ฑ

Observer๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.

  • onNext
    • Observable์ด ์•„์ดํ…œ์„ ๋ฐœํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” Observable์ด ๋ฐœํ–‰ํ•˜๋Š” ์•„์ดํ…œ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
  • onError
    • Observable์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ํ˜ธ์ถœ๋œ๋‹ค.
    • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด onNext ๋‚˜ onCompleted๋Š” ๋” ์ด์ƒ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ณ  ๋ผ์ดํ”„์‚ฌ์ดํด์ด ์ข…๋ฃŒ๋œ๋‹ค. ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” error ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
  • onCompleted
    • ์„ฑ๊ณต์ ์œผ๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์—†์ด ์ฃผ์–ด์ง„ ์‹œํ€€์Šค๋ฅผ ๋ชจ๋‘ ๋ฐœํ–‰ํ–ˆ๋‹ค๋ฉด ํ˜ธ์ถœ๋œ๋‹ค.

 

RxSwift ์žฅ์ 

  • Reactive Programming๋œ API๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…ํ™•ํ•˜๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์— ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๊ฒฐ๊ตญ ํ™•์žฅ์ด ์–ด๋ ค์› ๋˜ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด๊นŒ์ง€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝœ๋ฐฑ ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ์Šค๋ ˆ๋“œ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค.

 

RxSwift ๋‹จ์ 

  • ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋†’๋‹ค.
  • ์ž‘๋™ ๊ธฐ๋ฐ˜์ด ๋น„๋™๊ธฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค.
  • ํด๋กœ์ € ์‚ฌ์šฉ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ ์ˆœํ™˜์ฐธ์กฐ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋ก ์บก์ฒ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค.

 

๐Ÿค” ์™œ RxSwift๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ?

Swift๋Š” ARC๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํด๋กœ์ €์—์„œ self๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 
- RxSwift๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Observable ๊ฐ์ฒด๋Š” subscription์„ ํ•  ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ณ 
- ๊ฐ’์„ ๊ฐ–๊ณ  UI๋ฅผ ์ตœ์‹ ํ™” ํ•  ๋•Œ self.view์™€ ๊ฐ™์ด ViewController์˜ UI ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ํด๋กœ์ € ์•ˆ์—์„œ self์˜ ์‚ฌ์šฉ์ด ๋นˆ๋ฒˆํ•˜๋‹ค. 

๐Ÿ˜‡ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ?
1. ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์•ฝํ•œ ์ฐธ์กฐ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ 
2. ์„ ์–ธํ˜•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. 
(2๋ฒˆ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ property๋“ค์„ ํ•œ ๋ฒˆ์— ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์„ ์–ธํ˜• ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” RxCocoa์— ํฌํ•จ๋œ Binder<>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ํ•˜๋‚˜์˜ bindable property๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.)



728x90
๋ฐ˜์‘ํ˜•