๐ 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
๋ฐ์ํ