iOS ๐/iOS
RxSwift : ๋ค์ด๊ฐ๊ธฐ์ ์์
yongmin.Lee
2021. 5. 16. 17:01
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ((Imperative programming)
- ๋ฌด์(What)์ ํ ๊ฒ์ธ์ง ๋ํ๋ด๊ธฐ๋ณด๋ค ์ด๋ป๊ฒ(How) ํ ๊ฑด์ง๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ์
- ์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ: ์ํ๋์ด์ผ ํ ์์ฐจ์ ์ธ ์ฒ๋ฆฌ ๊ณผ์ ์ ํฌํจํ๋ ๋ฐฉ์ (C, C++)
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ: ๊ฐ์ฒด๋ค์ ์งํฉ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ํธ์์ฉ์ ํํ (C++, Java, C#)
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ(declarative programming)
- ์ด๋ป๊ฒ ํ ๊ฑด์ง(How)๋ฅผ ๋ํ๋ด๊ธฐ๋ณด๋ค ๋ฌด์(What)์ ํ ๊ฑด์ง๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ์
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ: ์์ ํจ์๋ฅผ ์กฐํฉํ๊ณ ์ํํธ์จ์ด๋ฅผ ๋ง๋๋ ๋ฐฉ์ (ํด๋ก์ , ํ์ค์ผ, ๋ฆฌ์คํ)
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ํจ์(function)๋ฅผ ์ด์ฉํด์ ์ฌ์ด๋ ์ดํํธ ์๋๋ก ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ๋ ๊ฒ
- ํ๋ก๊ทธ๋จ์ด ์ํ์ ๋ณํ ์์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ์ ํจ์ ๊ณ์ฐ์ผ๋ก ์ทจ๊ธ
- ์์ํ๊ฒ ํจ์์ ์ ๋ฌ๋ ์ธ์๊ฐ๋ง ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ฏ๋ก ์ํ๊ฐ์ ๊ฐ์ง ์๊ณ ์์ํ๊ฒ ํจ์๋ก๋ง ๋์
- ์ด๋ค ์ํฉ์์ ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ผ๋ ์ผ์ ํ๊ฒ ๊ฐ์ ๊ฒฐ๊ณผ ๊ฐ ๋์ถ ๊ฐ๋ฅ
- ํจ์ ํธ์ถ์ด ๊ฐ๊ฐ ์ํธ ๊ฐ์ญ์์ด ๋ฐฐํ์ ์ผ๋ก ์คํ๋๋ฏ๋ก ๋ณ๋ ฌ์ฒ๋ฆฌํ ๋ ์ฌ์ด๋ ์ดํํธ๊ฐ ๊ฑฐ์ ์๋ค
- ํ์ํ ๋งํผ ํจ์๋ฅผ ๋๋์ด ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค์ผ์ผ์ ํ ์ ์๊ธฐ๋๋ฌธ์ ๋๊ท๋ชจ ๋ณ๋ ฌ์ฒ๋ฆฌ์ ๊ฐ์ ์ด ์๋ค
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ฅ์
- ์ฌ๋ฌ๊ฐ์ง ์ฐ์ฐ์ฒ๋ฆฌ ์์ ์ด ๋์์ ์ผ์ด๋๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ฝ๋ค
- ๋ฉํฐ ์ฝ์ด ํน์ ์ฌ๋ฌ ๊ฐ ์ฐ์ฐ ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ๋ ์์คํ ์์ ํจ์จ์ ์ธ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ฝ๋ค
- ์ํ๋ณํ์ ๋ฐ๋ฅธ ๋ถ์์ฉ์์ ์์ ๋ก์์ง๋ฏ๋ก ์์ํ๊ฒ ๊ธฐ๋ฅ๊ตฌํ์ ์ด์ ์ ๋ง์ถฐ ์ค๊ณ๊ฐ๋ฅ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํน์ง
- ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด(First-class object)๋ก ๋ค๋ฃฌ๋ค
- ์ผ๊ธ๊ฐ์ฒด๋ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ ์ ์๋ค
- ์ผ๊ธ๊ฐ์ฒด๋ ๋์ ํ๋กํผํฐ ํ ๋น์ด ๊ฐ๋ฅ
- ์ผ๊ธ๊ฐ์ฒด๋ ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ ๋ด์ ์ ์๋ค
- ์ผ๊ธ๊ฐ์ฒด๋ ๋ฐํ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค
- ์ผ๊ธ๊ฐ์ฒด๋ ํ ๋นํ ๋ ์ฌ์ฉ๋ ์ด๋ฆ๊ณผ ๊ด๊ณ์์ด ๊ณ ์ ํ ๊ฐ์ฒด๋ก ๊ตฌ๋ณ ๊ฐ๋ฅ
- ๊ณ ์ฐจํจ์ (High-orde Function)
- ํจ์์ ์ธ์๋ก๋ก ํจ์๋ฅผ ๋ฐ๊ฑฐ๋ ๋ฐํ๊ฐ์ผ๋ก ํจ์๋ฅผ ๋ฐํํ๋ ํจ์
- ์ค์ํํธ์์ ํจ์๋ ์ผ๊ธ๊ฐ์ฒด๋ก ์ทจ๊ธ๋๊ธฐ์ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ฌ์ฉ๋ ์ ์๋ค
- ์ด๋ฅผ ํตํด ํจ์์ ๋ด๋ถ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ธ๋ถ์์ ์คํ ํ๋ฆ์ ์ถ๊ฐํ ์ ์๊ฒ๋๋ฉฐ ํจ์์ ์ฌํ์ฉ์ฑ, ์ฌ์ฌ์ฉ์ฑ์ด ์ฆ๊ฐ
- ๋ถ๋ณ์ฑ (Immutablility)
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ณํ ์ ์๋๋ฐ, ์ด๋ฅผ ๋ถ๋ณ์ฑ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋ค.
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ, ์๋ณธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ๊ทธ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋ณ๊ฒฝํ ๋ณต์ฌ๋ณธ์ ์ฌ์ฉํด ์์ ์ ์งํํ๋ค.
- ๋ฐ์ดํฐ ๋ณํ : ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ์ฃผ๋ ๋๊ตฌ๋ค์ด ํ์ํ๋ค.
- ๊ฐ๋ณ ๋ณ์์ ์ํด ๋ฐ์ํ๋ ๊ฒฝํฉ(race)์กฐ๊ฑด, ๊ต์ฐฉ์ํ(deadlock), ๋์ ์ ๋ฐ์ดํธ(concurrent update)๋ฌธ์ ๋ก๋ถํฐ ์์ ๋กญ๋ค.
- ์์ ํจ์ (Pure function)
- ์์ ํจ์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํ์ํ ๊ฐ๋ ์ผ๋ก ์๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํจ์๋ฅผ ๋ปํ๋ค.
- ๋์ผํ ์ ๋ ฅ์๋ ํญ์ ๊ฐ์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
- ํจ์์ ์คํ์ ํ๋ก๊ทธ๋จ์ ์คํ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํ๋ค. (Side effect ๊ฐ ์์ด์ผ ํ๋ค)
Reactive Programming, ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ
- Reactive Programming์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ธฐ๋ฐ์ ๋๊ณ ๊ทธ๊ฒ์ ๋ฐ์ํด์ ๋ฌด์ธ๊ฐ๋ฅผ ํ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๊ทธ ๋ณํ๋ ๋ง์น ๊ฐ๊ณผ ๊ฐ์์ ์ด๋ฅผ ๊ด์ฐฐํ๊ฑฐ๋ ํํฐ๋งํ๊ฑฐ๋ ๋ค๋ฃฐ ์ ์์ผ๋ฉฐ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์ํ ์๋ก์ด ํ๋ฆ์ ๋ง๋ค๊ธฐ ์ํด ๋ค๋ฅธ ํ๋ฆ๊ณผ ๋ณํฉํ ์๋ ์๋ค
- ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ Functional Programming์ ํ์ฉ
=> ๋ณํํ ์ ์๋ ์ํ์ ์ฝ๊ฒ ๋์ฒํ ์ ์๊ณ ์ด๋ฒคํธ๋ค์ ์์,์ฌ์ฌ์ฉ์ฑ์ ํฅ์ ์ํฌ ์ ์๋ค
=> ๋น๋๊ธฐ์(์ฌ๋ฌ ์์ ์ ๋์์ ์งํ) ํ๋์ ์ฝ๊ณ ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ํ๋ค - ์ค์ํํธ๋ Reactive Programming์ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ ์ ๊ณต
- @escaping : handler to catch the end point of asynchoronous task
- Dispatchqueue : For making task asynchoronously
- willSet, didSet : makes observing specific variable reactively
RxSwift
- RxSwift = Reactive eXtensions + Swift
- Rx๋ Reactive Programming ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋์ด์๋ API
- RxSwift๋ฅผ ์ด์ฉํ๋ฉด Reactive Programming ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ผ๋ฉฐ, RxSwift ์ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์๋ค
- RxSwift makes reactive code readable and short
-> You donโt need to use those Dispatchqueue, willSet, and DidSet - RxSwift operators make stream extensive
- RxSwift makes reactive code readable and short