Search
Duplicate

Hello, TCA

Created
2024/02/15 02:46
Tags
TCA
ํƒœ๊ทธ

ย 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 ์ ‘๊ทผ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€