ย Hello, TCA
ย Redux์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ฐฉ์
โข
๊ธฐํ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์กด์ฌ โ TCA๋ ๊ทธ ์ค์์ ํ๋
โข
Ex) Reswift, ReactorKit ๋ฑ๋ฑ
๋์์ธ ํจํด
โข
์ฝ๋๊ฐ ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋, ์ ํํ๋ ํ๋์ ๊ท์น์ ์ ์ํ๋ ๊ฒ
์ํคํ ์ณ ํจํด
โข
์ ๋ฆฌ๋ ์ฝ๋๋ค์ ๋ ์ถ์ํ๋ ๋น์ฆ๋์ค์ ๋ฌธ์ ํด๊ฒฐ ๊ด์ ์ผ๋ก ์ ๋ฆฌํ๋ ๊ท์น
SwiftUI๋ก ์ ์ธํ UI๋ฅผ ๊ตฌํํ๋ ํ๊ฒฝ์์๋ MVVM ํจํด์ด ๊ณง์ ์ฑํ๋๊ณ ๋ ํ๋ค. ๊ทธ ์ธ, ํน์ํ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ธฐ๋ฅ์ ์ค๊ณ ๋ฑ์ ๋ฐ๋ผ RIBs, VIPER, MVP, Clean ๋ฑ์ ์ํคํ
์ณ ํจํด์ด ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
๋๋ถ๋ถ์ ์ํคํ
์ณ๋ ๊ธฐ์
๊ณผ ๊ฐ์ธ์ด ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์์ ์์ฃผ ๋ฐ์ํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ค๊ณ๋ฅผ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํด ์ฐฝ์๋์๋ค.
๊ฐ์ฅ ์ต๊ทผ๊น์ง๋ SwiftUI๋ฅผ ํ์ฉํ ํ๋ก์ ํธ์ ์ํคํ
์ณ๋ ์ฌ๋ฌ ํํ๋ก ๋ถํ๋์ด ์๋ค. 2019๋
์ ์๊ฐ๋ ์ดํ, ์ด ์ ์ธํ UI ํ๋ ์์ํฌ์ ์ ํฉํ ์ฌ๋ฌ ์ํคํ
์ณ๊ฐ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ์ ํ์ง๋ก ๊ฑฐ๋ก ๋์๋ค. MVC์์ View์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ฑ
์์ ๊ฐ๋ ๊ฐ์ฒด, ์ฆ Controller๋ SwiftUI์ ์ด๋ฅด๋ฌ ViewModel์ ํํ๋ก ๋ณํํ๊ฒ ๋์๊ณ , ์ฐ๋ฆฌ์๊ฒ ์ต์ํ MVVM ์ํคํ
์ณ๊ฐ ๋ฑ์ฅํ๋ค. ๊ทธ๋ฌ๋ SwiftUI์ ๋ฐ์ ๊ณผ ํจ๊ป MVVM ์ํคํ
์ณ๋ฅผ ์ ์ฉํด์ผ ํ๋ค๋ ์ฃผ์ฅ์ด ์ ์ ์ค์ด๋ค์๋ค.. ๊ทผ๊ฑฐ๋?
โข
ViewModel ๊ฐ์ฒด์ ์กด์ฌ ์ด์ ์๋ State-Binding์ด SwiftUI์ ์ ์ฐํ UI์ ์ด๋ฏธ ๋ฐ์๋์ด ์๋ค๋ ์ !
โข
Reactive Programming์ ๊ตฌ์ฑํ๊ธฐ ์ํด ๊ณง์ ํ์ฉ๋์๋ RxSwift ํ๊ฒฝ์์, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ์ฑ
์์ง ๊ฒ์ด ๋ฐ๋ก ViewModel ๊ฐ์ฒด์๋ค.
โข
๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ View ๋ ๋ฒจ์์ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ธํ UI์ธ SwiftUI๊ฐ ๋ฑ์ฅํ๋ฉด์ RxSwift๊ฐ ์๊ตฌํ๋ ViewModel์ ๊ทธ ์๋ฏธ๋ฅผ ์์๋ค.
์ด๋ฌํ ๋ฐฐ๊ฒฝ ์์์ TCA(The Composable Architecture)๊ฐ ๋ฑ์ฅํ์๋ค.
TCA๋ ๊ฐ ํ์
์ ๊ธฐ๋ฐํ์ฌ ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์ ์ํ๋ฅผ ์ผ๊ด์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํ์ค์ ์ ์ํ๊ณ ์ ํ๋ค.
์ต์ ๊ธฐ๋ฅ ๋จ์๋ก ๊ตฌ์ฑ๋ ๊ฐ Unit ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก์ ๊ฒฐํฉ-๋ถ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ค.
์ด๋ก์จ TCA๋ฅผ ํ์ฉํ ํ๋ก์ ํธ๋ ์ผ๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๊ณ , ํ
์คํธ์ ์ ์ฐ์ฑ์ ํ๋ณดํ ์ ์๊ฒ ๋๋ค.
TCA๋ MVVM ์ํคํ
์ณ๊ฐ ๊ฐ๋ ์ฅ์ ์ ๋๋ถ๋ถ์ ๊ฐ์ ธ์ค๋ฉด์, ์กฐ๊ธ ๋ ํน๋ณํ ์ด์ ์ ๊ฐ๋๋ค.
โข
๊ฐ ํ์
์ ๊ธฐ๋ฐํ ์์ ์ ์ธ State ์ ๋ณํ
โข
์ ์ ํ๋์ ๋ํ ๋ก์ง์ ์ฒ๋ฆฌํ๋ Action ๊ณผ Effect ์ ์ผ๊ด์ฑ
โข
๊ฐ์ฒด ๊ฐ ๊ฒฐํฉ๊ณผ ๋ถ๋ฆฌ์ ์ ์ฉ์ฑ
โข
๋น๊ต์ ํธ๋ฆฌํ ํ
์คํธ
ย ๋ง๋ณด๊ธฐ
โข
State
โฆ
๋ง ๊ทธ๋๋ก ๋ฐ์ดํฐ ์ํ - ์ฆ, ๋๋ฉ์ธ ์ํ
โข
Action
โฆ
๋๋ฉ์ธ ์ก์
โช
ex) ๊ฒ์์ด๋ผ๋ฉด ๊ฒ์์ด ์
๋ ฅ, ๊ฒ์์ด ์ญ์ ๋ฑ
โช
ex) ํ ์ผ์ด๋ผ๋ฉด ํ ์ผ ์ญ์ , ํ ์ผ ์ถ๊ฐ ๋ฑ
โข
Reducer
โฆ
Action-State๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ญํ
โช
๋ค์ด์จ Action์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ณํ์์ผ์ฃผ๋ ์ญํ
โข
Store
โฆ
์ํ, ์ก์
์ ๊ฐ์ง๊ณ ์๋ค โ ๋ค ํฌํจํ๋(์ปค๋งจ๋ ์ผํฐ๋ผ๊ณ ์๊ฐ)
โ ์ ํ ์ง์?
1.
Swift์ ํ์
์ ๋ํ ์ดํด
a.
๊ฐ ํ์
๊ณผ ์ฐธ์กฐ ํ์
์ ๋น๊ตํ ์ ์๋ ์์ค
b.
ํ์
ํ๋ผ๋ฏธํฐ(์ ๋ค๋ฆญ)์ ๋ํด ๊ฐ๋จํ ์ค๋ช
ํ ์ ์๋ ์์ค
2.
SwiftUI์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด
a.
view ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด @State, @Published ๋ฑ์ ํ๋กํผํฐ ๋ํผ ํน์ @Observable ๋งคํฌ๋ก๋ฅผ ์จ์ผํ๋ ์ด์ ๋ฅผ ๊ฐ๋จํ ์ค๋ช
ํ ์ ์๋ ์์ค
3.
input ํค์๋์ ๋ํ ์ดํด
a.
ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ๊ฐ ํ์
์ ๋ณํํ ์ ์๋ ์์ค
b.
copy-in copy-out ๊ตฌ์กฐ์ ๋ํด ์ค๋ช
ํ ์ ์๋ ์์ค
4.
KeyPath ์ ๋ํ ์ดํด
a.
KeyPath ์ ๋ํด ๋ค์ด๋ณด๊ณ ์์ ์ฝ๋๋ฅผ ์ฝ์ ์ ์๋ ์์ค
b.
KeyPath ๋ฅผ ํ์ฉํ์ฌ ํ์
์ ๋ํ key-value ์ ๊ทผ์ ๊ตฌํํ ์ ์๋ ์์ค