๋ชฉ์ฐจ
1. Identifiable ํ๋กํ ์ฝ์ ํตํ ๋ฐ์ดํฐ ๋ฟ๋ฆฌ๊ธฐ
2. SwiftUI์ ๋ทฐ ์ ๋ฐ์ดํธ ๋ฐฉ์
3. SwiftUI์ ์ํ๊ด๋ฆฌ
(์ฃผ์: WWDC์์ ์๊ฐ๋ ๋ด์ฉ ์ค ์ค์ํ์ง ์๋ค๊ณ ํ๋จ๋ ๋ด์ฉ์ ์ ์ธ์์ผฐ์)
Identifiable ํ๋กํ ์ฝ์ ํตํ ๋ฐ์ดํฐ ๋ฟ๋ฆฌ๊ธฐ
SwiftUI๋ ๊ป๋ฐ๊ธฐ UI๋ค์ ์ปดํฌ์ง์ ๋์ผ๋ก ๋ง๋ ๋ค ์์์์ Source Of Truth ๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ํ์ ๋ทฐ๋ค์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ฆฌ๋ ํํ์ด๋ค. List(UIKit์์์ ํ ์ด๋ธ๋ทฐ์ ์ปฌ๋ ์ ๋ทฐ ๋์ฒด)๋ฅผ ์๋ก ๋ค์๋ฉด ํ ์ด๋ธ๋ทฐ์ ๊ฐ ์ ์ ๋ด์ฉ๋ฌผ์ ํ๋์ ์ ๊ป๋ฐ๊ธฐ๋ง ๋ง๋ค์ด ๋ฐ๋ณต์ผ๋ก ๋๋ฆฌ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ง, ํ ์คํธ์ ๋ชจ์, ์์น, ์๊ณผ ๊ฐ์ ๊ป๋ฐ๊ธฐ๋ ๊ฐ๋ค. ์ด์ ๋ฌธ์ ๋ ์ด๋ป๊ฒ ๊ฐ ์ ๋ง๋ค ๋ค๋ฅธ ๋ด์ฉ๋ฌผ์ ๋ฟ๋ ค์ค ๊ฒ์ธ๊ฐ์ด๋ค.
์๊ฐํด๋ณด๋ฉด ๋ชจ๋ธ์ ๋๊ฐ๋ค. ์ฌ์ง-Roomํ์ดํ-์ฌ๋์ธ์์ ๋ฑ์ด๋ค. ๋ค๋ง ๋ค๋ฅธ ๋ด์ฉ๋ฌผ์ด ์ฑ์์ง ๋ฟ์ด๋ค. SwiftUI์ List๋ ๊ฐ์ ํ์ (๋ชจ๋ธ)์ด์ง๋ง ์๋ก๋ค๋ฅธ ๋ด์ฉ๋ฌผ์ ๊ตฌ๋ถํด์ ๋ฟ๋ ค์ฃผ์ด์ผํ๋ค. ๋ฐ๋ผ์ ๊ฐ ์ธ์คํด์ค๊ฐ ๊ฐ์ ํ์ ์ด์ด๋ ๊ตฌ๋ถํ ์ ์๋ ์ฆ๊ฑฐ๊ฐ ํ์ํ๋ค. ์ด๋ฌํ ๊ตฌ๋ถ๋ ์ธ์คํด์ค๋ฅผ ์ฐ์ด๋ผ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํด์ฃผ๋ ์ฆํ๊ฐ ๋ฐ๋ก Identifiable Protocol ์ด๋ค.
๋น์ฐํ ์ด์ผ๊ธฐ์ด์ง๋ง ๊ฐ ์ธ์คํด์ค๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ผญ UUID๋ฅผ ์ฌ์ฉํ ํ์๋ ์๋ค. ๊ตฌ๋ถ ๊ฐ๋ฅํ ํ๋กํผํฐ ํ๋๋ง ๊ฐ์ง๋ฉด Identifiable Protocol ์ ์ฑํํ ์ ์๋ค. ์ด๋ ๊ตฌ๋ถ๊ฐ๋ฅํ ํ๋กํผํฐ๋ Hashable ํ์ ์ ์ฑํํ๊ณ ์๊ธฐ๋ง ํ๋ฉด ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ Hashable ํ๋กํ ์ฝ์ ์ฑํํ ํ์ ์ ์ธ์คํด์ค๋ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํ ๊น? Hashable ํ์ ์ ์ด๋ฏธ Equatable ํ์ ์ ์ฑํํ๊ณ ์๊ธฐ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ํตํด Hashable ํ์ ์ ์ฑํํ ์ธ์คํด์ค๋ ๊ฐ์ฒด๋ฅผ ๊ณ ์ ํ ์ ์๋ก ๋ํ๋ธ๋ค ๊ตฌ๋ถํ ์ ์๋ค. ์ด ๊ณผ์ ์ ์๋ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝํ ์ ์๋ค.
Equatable (๋๋ฑ์ฑ ๋น๊ต๊ฐ๋ฅ) -> Hashable(๊ฐ์ฒด๋ฅผ ํด์๊ฐ์ผ๋ก ๋ณํ ๊ฐ๋ฅ) -> Identifiable (๊ณ ์ ํ ์๋ณ์๋ฅผ ํตํด ๊ตฌ๋ถ ๊ฐ๋ฅ)
Identifiable ํ๋กํ ์ฝ์ ์ฑํํ Room ํ์ ๋ฐฐ์ด์ List์ ๋ฃ์ด ๊ฐ์ UI ๊ป๋ฐ๊ธฐ์ ๊ตฌ๋ถ๋ ๋ด์ฉ๋ฌผ๋ค์ ์ฑ์์ค ์ ์๋ค.
SwiftUI์ View ์ ๋ฐ์ดํธ ๋ฐฉ์
View Protocol์ ๋จ ํ๋์ ๋ด์ฉ๋ฌผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๋ฐ๋ก body์ด๋ค. ํ์ง๋ง ์ด ๋ฐ๋๋ ๊ฒฐ๊ตญ View ํ์ ์ typeAlias์ด๊ธฐ ๋๋ฌธ์ View๋ฅผ ๊ฐ์ง๊ณ ์๋ค ๋ณผ ์ ์๋ค. SwiftUI์์ View๋ฅผ ๋ ๋๋งํ๋ค๋ ๊ฒ์ body๋ฅผ ๋ ๋๋งํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค. ๋ํ ๋ทฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋๋ ๊ฐ์ ์ฐธ์กฐํ์ง ์๊ณ ๊ฐ์ด ๋ฐ๋๋ฉด ๊ทธ๋ฅ ์๋ก ํ ๋ฒ๋ ๊ทธ๋ ค์ฃผ์ด์ผํ๋ค. ๊ทธ๋ ๋ค๋ฉด View๋ body์ ๋ณํ๋ฅผ ์ด๋ป๊ฒ ์์์ฑ๊ณ ์ ๋ฐ์ดํธํ ๊น?
์ด๋ก์์ ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ์ด๊ณ ๋ณด๋ผ์์ SwiftUI๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค. UI๊ป๋ฐ๊ธฐ๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ @State ํ๋กํผํฐ ๋ํผ๋ฅผ ํตํด ์ค์ ๊ฐ ๋ฐ์ธ๋ฉ์ ๊ด๋ฆฌํด์ค๋ค. ์ด๋ ๊ฒ SwiftUI ํ๋ ์์ํฌ๊ฐ ๋ฐ์ดํฐ ๋ณํ ๊ฐ์ง๋ฅผ ๋๋งก์ ํ๋ฉด์ ์ค๋ฅธ์ชฝ ์ฌ์ง๊ณผ ๊ฐ์ด ๋ทฐ๊ฐ ๋ฐ์ดํฐ ๋ณํ ๊ฐ์ง์ ์คํจํ๋ ์ผ์ ๊ฑฐ์ ์ผ์ด๋์ง ์๊ฒ๋๋ค.
์ฌ์ง์ ๋ณด๋ฉด ์๋ก ๋ค๋ฅธ UI ์ธ ๊ฐ์ ๊ป๋ฐ๊ธฐ์ ํ๋์ ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ฐฐ์ด์ด ๋ค์ด๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ ๋ทฐ์ ๋ฟ๋ ค์ง๊ณ ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. SwiftUI ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ข ๋ฅ๋ก ๋๋ ์ ์๋ค. ๋ฐ๋ก Source Of Truth์ Derived Value ์ด๋ค.
์ฝ๋๋ฅผ ํตํด ๋ณด๋ฉด room์ด SourceOfTruth ๋ก ๋ฐ์ดํฐ์ ์์ฒ์ด๋ผ ๋ณผ ์ ์๊ณ ๊ฐ๊ธฐ ๋ฟ๋ ค์ง๋ ๋ฐ์ดํฐ๊ฐ Derived Value๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ด๋ฌํ ๋ ์ข ๋ฅ์๋ฐ์ดํฐ๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ ๊ฒ์ธ๊ฐ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ ์ ํ ๊ฒ์ด๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ ์ธํ๋ค.
๋ง์ฝ ์ฝ๊ธฐ ์์ ๋ง ํ๋ค๋ฉด ๋จ์ํ ์์์ ์ธ์ ํด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ์์ผ์ฃผ๋ฉด ๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด View๋ ์ฒ์ ์์ฑ๋ ๋ ๋ฐ์ดํฐ๋ง ์ฝ๊ณ ๊ทธ ์ดํ์ ๋ฐ์ดํฐ ๋ณํ๋ ์์์ฑ๊ธฐ ํ๋ค์ด์ง๋ค. ๋ง์ฝ ์ฐ๊ธฐ ์์ ์ด ๋ค์ด๊ฐ๊ณ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์งํด์ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํด์ผํ๋ค๋ฉด Source Of Truth ์๋ @State ํ๋กํผํฐ ๋ํผ๋ฅผ ๋ถ์ด๊ณ Derived Value์์๋ @Binding ํ๋กํผํฐ ๋ํผ๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ๋ง ํ๋ค.
SwiftUI์ ์ํ๊ด๋ฆฌ
์ ์ ํ์ Source Of Truth ๋ผ๋ ์์ด๋์ด๋ฅผ ๊ฐ์ ธ์์๊น?
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ UI๊ป๋ฐ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ฆฌ๊ณ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋๋ฉด UI๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ View๋ ์๋ฌต์ ์ผ๋ก Data์ ๋ํ ์์กด์ฑ์ด ์๊ธด๋ค. ๊ฐ๋ฐ์๋ฅผ ํ๋ค๊ฒ ํ๋ ๊ฒ์ ๊ฐ๋ณํ๋ ๋ฐ์ดํฐ ์ํ์ ๋ํ ์์กด์ฑ ๊ด๋ฆฌ์ด๋ค.
์ ์ํ๊ด๋ฆฌ๊ฐ iOS๊ฐ๋ฐ์ ์์ด์ ์ค์ํ๊ฐ๋ ์ ์์ ๋ฅผ ํตํด ์ดํด๋ณผ ์ ์๋ค.
๋ง์ฝ ํ๋์ ๋ทฐ์์ 4๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํด๋ณด์. ์ด๋ฌํ 4๊ฐ์ง ์ํ๊ฐ ๋ํ๋ผ ์ ์๋ ๋ทฐ์ ์ํ๋ 4 x 3 x 2 x 1 ๋ก 24๊ฐ์ง ๋ทฐ๋ฅผ ํํํ ์ ์๋ค.
๋๋ถ์ด ์ํ๊ฐ ๋คํธ์ํฌ๋ DB๊ฐ์ I/O์์ ์ผ๋ก ๋ค์ด์ค๊ฑฐ๋ ๋ฐ๋๋ฉด ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋์ด ์ํ๊ด๋ฆฌ์ ๋ํ ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋์ฑ ์ปค์ง๋ค. ์ด์ ๊ฐ์ ์ํฉ์์ ๋ฒ๊ทธ๋ฅผ ์ค์ด๋ ๊ฒ์ ํต์ฌ์ ์ํ๊ด๋ฆฌ๋ฅผ ์ต๋ํ ๋จ์ํ ์ํค๋ ๊ฒ์ด๋ค.
SwiftUI์์ ๋ณํํ๋ ์ํ์ ๋์ํ๋ ์ฝ๋ฐฑ ๋ฉ์๋๋ฅผ ํ๋์ ๋ฉ์๋๋ก ์์ถ์์ผฐ๋ค.
๋ฐ๋ก View Protocol ์ body์ด๋ค. ์๋ฌด๋ฆฌ ์ฌ๋ฌ๊ฐ์ง ์ํ๋ผ๋ SwiftUI์์๋ ๊ฒฐ๊ตญ body๋ผ๋ ๋จ์ผ ์ํ๊ด๋ฆฌ๋ก ํ์น ์ ์๊ฒ๋๋ค.
์ฐธ๊ณ ์ถ์ฒ
WWDC19 Introducing SwiftUI: https://developer.apple.com/videos/play/wwdc2019/204/
'๐ฆ Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Combine | 2. Operators and Subjects (0) | 2024.05.07 |
---|---|
ViewController์ ์๋ช ์ฃผ๊ธฐ (0) | 2024.05.06 |
| Combine | 1. Getting Started (0) | 2024.05.05 |
UserDefaults ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฒด์ Codable ์ ์ฑํํ ์ด์ (0) | 2024.05.05 |
WWDC 19 SwiftUI Essentials (0) | 2024.04.22 |