๐ณ ์ฒญ์ ๊ตฌ์ญ
์ฒญ๋
๋ค์ ์ํ ์ ์ฑ
์ ์๋ ค์ฃผ๋ ์ฒญ์ ๊ตฌ์ญ
๐ ๋ชฉ์ฐจ
- ์๊ฐ
- ๊ฐ๋ฐํ๊ฒฝ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๊ธฐ๋ํจ๊ณผ
- ๊ธฐ๋ฅ์ค๋ช
- ๋์์๋ฆฌ
- ํ์๋ผ์ธ
- ์คํํ๋ฉด
- ํธ๋ฌ๋ธ์ํ
๐ฑ ์๊ฐ
์๊ฐ ์์
์ฑ ๋ชฉ์
- ์ฒญ๋
๋ค์ ์ฑ๊ณต์ ์ํ ๊ตญ๊ฐ์ ์ฑ
์ ๊ณต
- ๋๋ฌด ๋ณต์กํ๊ณ ๋ง์ ์ฒญ๋
์ ์ฑ
๋ค์ ์ผ์ผํ ์ฐพ์๋ณด๊ธฐ ์ด๋ ค์ด ์ฒญ๋
๋ค์๊ฒ ์๋ง๋ ์ฒญ๋
์ ์ฑ
์ถ์ฒ
ํ๊ฒ ์ฌ์ฉ์
- 20 ~ 30๋ ์ฒญ๋
( ์ผ์์ ์น์ฌ ์ฒญ๋
์ ์ฑ
์ ์์๋ณผ ์๊ฐ์ด ์๋ ์ฒญ๋
๋ค )
๐ง๐ปโ๐ป ํ์
โจ ๊ธฐ๋ํจ๊ณผ
- ์์ง ๋ชปํ๋ ์ ์ฑ
๋ค์ ์๋ ค์ค์ ์ฌ์ฉ์๋ค์ด ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ค.
- ์ ์ฑ
์ ๊ธฐ๊ฐ์ ์๋ ค์ค์ ๋ง๊ฐ์ผ ์ ์ ์ฌ์ฉ์๋ค์ด ์ ์ฒญํ ์ ์๊ฒ ๋์์ค๋ค.
- ์ฌ์ฉ์๋ค์ด ์ ์ฑ
์ ๋งค๋ฒ ๊ฒ์ํ ํ์์์ด ์ฆ๊ฒจ์ฐพ๊ธฐํ์ฌ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
๐ข ๊ธฐ๋ฅ์ค๋ช
- ๊ฐ์ธ์ ์ฃผ๊ฑฐ ์ง์ญ, ์ทจ์
์ํ, ๋์ด, ํ๋ ฅ, ๊ด์ฌ ์ ์ฑ
ํค์๋๋ฅผ ๋ฐํ์ผ๋ก ์ฒญ๋
์ ์ฑ
์ ๊ฒ์
- ํด๋น๋๋ ์ผ์๋ฆฌ, ์ฃผ๊ฑฐ, ๊ต์ก, ๋ณต์งโข๋ฌธํ, ์ฐธ์ฌโข๊ถ๋ฆฌ ๋ถ์ผ์ ์ ์ฑ
์ ๋ณด๋ฅผ ์ ๊ณต
- ํค์๋๋ฅผ ๋ฐํ์ผ๋ก ๊ฒ์ํ ์ ์ฑ
๋ค ์ค ์ฌ์ฉ์๋ค์ด ๊ฐ์ฅ ๋ง์ด ์ฐพ๋ ์ ์ฑ
์ ๋ณด์ฌ์ค
- ์ฌ์ฉ์๊ฐ ์ฆ๊ฒจ์ฐพ๊ธฐํ ์ ์ฑ
์ ๋ค์ ๊ฒ์ํ ํ์ ์์ด ๋ฐ๋ก ์ด๋์ด ๊ฐ๋ฅ
- ๋คํฌ ๋ชจ๋ ์ง์
โ๏ธ ๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
[]()
[]()
[]()
๐ก๋์ ์๋ฆฌ
- WebServer์์ ์ ๋ถ APIServer์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ํ ์์ ๋ XMLData๋ฅผ ๊ฐ๊ณตํฉ๋๋ค.
- WebServer์์ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ MySQL๋ก ๊ตฌ์ถ๋ DB์ ์ ์ฅํฉ๋๋ค.
- ์ฌ์ฉ์์ iOS ๊ธฐ๊ธฐ์์ ์ฟผ๋ฆฌ๋ฌธ์ ์ค์ ํ์ฌ URL๋ฅผ ์์ฒญํ๋ฉด WebServer์์ ํด๋น ์ฟผ๋ฆฌ๋ฌธ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ DB์์ ์ฐพ์ ํ JSONData๋ฅผ ์ก์ ํด์ ์ฌ์ฉ์๋ค์๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ชก ์์๋
๐งโ๐ง ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ค๊ณ
๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ ๋ฐฉ์
- SwiftData๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ ์ฆ๊ฒจ์ฐพ๊ธฐํ ์ ์ฑ
๋ณด๊ด
- Express.js๋ฅผ ์ฌ์ฉํด WebServer๋ฅผ ๊ตฌ์ถ
- WebServer์์ HTTP ํต์ ์ ์ฌ์ฉํ์ฌ ์ ๋ถAPI ๋ฐ์ดํฐ, DB์ ์ ์ฅ
- Data Pooling์ ์ด์ฉํ์ฌ ์ง์์ ์ผ๋ก ์ ๋ถAPI๋ฅผ DB ์
๋ฐ์ดํธ
- โ์ฒญ์ ๊ตฌ์ญโ, โ์ ๋ถAPI Serverโ, โWebServerโ ,โMySQLโ ๋ฐ์ดํฐ ์ฐ๋
- Express.js๋ฅผ ์ฌ์ฉํด WebServer๋ฅผ ๊ตฌ์ถ ํ ํ URL ์์ฒญ
โฐ ํ์๋ผ์ธ
Step 1 ํ์๋ผ์ธ
- 23.12.05 ~ 23.12.07
- ํ๋น๋ฉ
- ์์ด๋์ด ์ ์ ๋ฐ ํผ๊ทธ๋ง ๋์์ธ ์ ์
- ์์ํ๋ฉด, ์์ธํ๋ฉด UI๊ตฌํ
- ์ ์ฑ
๋ฐ์ดํฐ XML๋ก ๋ฐ์์์ ์ ์ฅ
- ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ฉ์ธ ํ๋ฉด UI ๊ตฌํ
- ํ๋ฉด ์ด๋ ๋ก์ง ๊ตฌํ
Step 2 ํ์๋ผ์ธ
- 23.12.10 ~ 23.12.11
- ๊ฒ์ filter ๊ธฐ๋ฅ ์ถ๊ฐ
- ์ถ์ฒ ํ๋ฉด UI ๊ตฌํ
- API filter ๊ธฐ๋ฅ ๊ตฌํ
- ์ถ์ฒ์ ์ฑ
UI ๊ตฌํ
- ์ ์ฑ
๋ถ๋ฆฌ ๊ธฐ๋ฅ ๊ตฌํ
- ์น ๋ทฐ ๊ตฌํ
- ์ด์๊ธฐ๊ฐ๋ด์ฉ์ผ๋ก ๋๋ฐ์ด์ ์งํ์ํ ํ์ํ๋ ๊ธฐ๋ฅ ๊ตฌํ
- 23.12.12
- ๋ฉ์ธํ๋ฉด ๋ฆฌ์คํธ ์
๊ตฌํ
- ์ฆ๊ฒจ์ฐพ๊ธฐ๋ถ๋ถ SwiftData์ฐ๋
- ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ก๋ฉํ๋ฉด ๊ตฌํ
- ์ ์ฒด API๊ฐ ํธ์ถํ๋๋ก ์์
Step 3 ํ์๋ผ์ธ
- 23.12.13 ~ 23.12.14
- XML๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ฐ์์ค๋ ๋ก์ง์์ DB์ ์ ์ฅ ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต ํ JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ฒ ์์
- ์ ์ด๋ฏธ์ง ํ์ผ ๋ฐ ์ฝ๋ ์ถ๊ฐ
- ์ทจ์
์ฌ๋ถ, ํ๋ ฅ์ ํ์ฐฝ "์ ์ฒด์ ํ" ์ ๊ฑฐ
- post๋ฐฉ์์ผ๋ก ์กฐํ์ ์ฆ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
- Fontํ์ผ ์ถ๊ฐ
- ์ฝ๋ ๋ฆฌํฉํ ๋ง, ํฐํธ / ํจ๋ฉ๊ฐ ํต์ผ
- launchScreen์ถ๊ฐ, ์ฑ Icon ์ถ๊ฐ
Step 4 ํ์๋ผ์ธ
- 24.03.18
- TCA ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- ์ฝ๋ ์ปจ๋ฒค์
์์
- 24.03.25
- StartView TCA ํจํด ์ ์ฉ
- StartView -> StartFeature
- StartTextField -> TextFieldFeature
- startLocation -> LocationFeature
- ๊ฐ ๋ฆฌ๋์๋ณ๋ก Test์ฝ๋ ์์ฑ
- 24.03.27 ~ 24.03.31
- Start-Main-List ํ๋ฉด์ด๋ ๊ตฌํ
- path์ ์คํ ์ด ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ๋ ๋ก์ง ์ ์ฉ
- Detail, Main TCA ์ํคํ
์ฒ ์ ์ฉ
- 24.04.01
- ๋๋ฏธ๋ฐ์ดํฐ๋ก ์์
์ค์ด๋ ๋ถ๋ถ๋ค ์๋ฒ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ
- 24.04.02
- ์ฆ๊ฒจ์ฐพ๊ธฐ SwiftData๋ฅผ ๋ฆฌ๋์์์ ์ฒ๋ฆฌํ๋ ๋ก์ง ๊ตฌํ
- DetailView ์คํ ์ ์๋ฒ์ ๋ฐ์ดํฐ ์ ์ก๋ก์ง ๊ตฌํ
- 24.04.03
- TCA ํจํด ์ ์ฉ ์๋ฃ
- StartFeature ํ
์คํธ ์ฝ๋ ์ถ๊ฐ
- MainFeature ํ
์คํธ ์ฝ๋ ์ถ๊ฐ
- ListFeature ํ
์คํธ ์ฝ๋ ์ถ๊ฐ
- ListItemFeature ํ
์คํธ ์ฝ๋ ์ถ๊ฐ
- DetailFeature ํ
์คํธ ์ฝ๋ ์ถ๊ฐ
๐ฑ ์คํ ํ๋ฉด
์ฑ ์คํ |
์์ํ๋ฉด |
|
|
๋ฉ์ธํ๋ฉด |
์์ธํ๋ฉด |
|
|
์น๋ทฐ์ด๊ธฐ |
์ฆ๊ฒจ์ฐพ๊ธฐ |
|
|
โ ํธ๋ฌ๋ธ ์ํ
์ฐ๋ ๊ด๋ จ
### 1. ๋ฌธ์ ์ ์
- โ์
๋ ฅํ๋ฉดโ์์ ๊ฐ ์กฐํ์กฐ๊ฑด์ ์
๋ ฅํ๊ณ โ์ถ์ฒ ์ ์ฑ
ํ๋ฉดโ์ผ๋ก ๋์ด๊ฐ๋, ์กฐ๊ฑด์ ๋ง๋ ํํฐ๋ง์ด ๋์ง์์
- โ์
๋ ฅํ๋ฉดโ์์ โ์ถ์ฒ ์ ์ฑ
ํ๋ฉดโ์ผ๋ก ๋์ด๊ฐ๋, ๋ก๋ฉ์ด ๊น
- โ์ถ์ฒ ์ ์ฑ
์ธ๋ถ ํ๋ฉดโ์์ D-Day ๋ ์ง๋ฅผ ์ ์ด์ผํ๋๋ฐ, ๋ ์ง ๊ณ์ฐ์ด ์๋จ
- โ์ฒญ์ ๊ตฌ์ญโ์์ ์กฐํ์ data๋ฅผ ์น์๋ฒ์ ๋ณด๋์ง๋ง ์๋ต์์
- ์ ๋ถAPI ์ ์ฑ
๋ฐ์ดํฐ๊ฐ ์์ ๋๋ฉด ์๋์ผ๋ก DB ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธํ๊ณ ์ถ์
### 2. ์ฌ์ค ์์ง
- ์ฃผ๊ฑฐ์ง : ์ฑ๋จ์, ์ทจ์
์ํ: ์ ํ์์, ํ๋ ฅ: ์ ํ์์, ๋์ด: 20 ์
๋ ฅ
- ๊ฒฝ๊ธฐ๋ ์ฃผ๊ด๋ถ์ฒ๊ฐ ์ค์ํ๋ ์ ์ฑ
์ด ๋์ค์ง ์์
- ์ทจ์
์ํ๊ฐ ์ ํ์์ ์ด๋ผ๋ฉด, ๊ณ ๋ฑํ๊ต ์กธ์
๋ ๋์์ผํ๋๋ฐ ๋์ค์ง์์
- ํ๋ ฅ๋ ๋ง์ฐฌ๊ฐ์ง
- ๋์ด ์
๋ ฅ์ ๋์ด์ ๋ง๋ ์ ์ฑ
์ด ๋์ค์ง ์์
- โ์ถ์ฒ ์ ์ฑ
์ธ๋ถโ ํ๋ฉด์ D-Day ๋ฐ์ดํฐ ๊ณ์ฐ๋์ง์๋๋ค.
- โ์ฒญ์ ๊ตฌ์ญโ์์ ์กฐํ์ data post์ค ์น์๋ฒ์์ ๋ฐ์์ค์ง๋ชปํจ
- ์ ๋ถAPI ์ ์ฑ
๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก DB์ ์ ์ฅ์ค
### 3. ์์ธ์ถ๋ก
- API์์ ์ ๊ณต๋๋ ์๋ฆฌ๋ฉํธ๋ง๋ค ๋ฐ์ดํฐ ํ์์ด ๋ค ๋ค๋ฅด๋ค.
- ex)
- ๋์ด : โ39์ธ ๋ฏธ๋งโ, โ19์ด์ ~ 39์ธ๋ฏธ๋งโ
- ๋ ์ง : โ2023.01 ~ 2023.12โ, โ์์์งํโ, โ2023.01.01 ~ 2023.12โ
- ์กฐํ์ data post์ค์ ๋ฐ์ดํฐ ํ์์ด jsonData๋ก ๋ณด๋ด์ง
- ์ ๋ถAPI ์ ์ฑ
๋ฐ์ดํฐ๋ฅผ ์๋ํ๊ฒ ์ฝ๋ฉํด๋์
### 4. ์กฐ์ฌ๋ฐฉ๋ฒ ๊ฒฐ์
- ์ ๋ถ API Server ๋ฐ์ดํฐ๊ฐ ์ผ๊ด์ฑ์ด ์๊ธฐ์, REST API, ๋คํธ์ํฌ ํต์ , Server, DB ๊ตฌ์กฐ ์กฐ์ฌ
- JsonData๋ก ๋ฐ๋๋ฒ ์กฐ์ฌ
- ์น์๋ฒ์์ ์๋์ผ๋ก ์ ๋ถ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํฐ ๋๋๋ฒ ์กฐ์ฌ
### 5. ์กฐ์ฌ ๋ฐฉ๋ฒ ๊ตฌํ
- ์ ๋ถ API ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ WebServer ๊ตฌํํ ์ด๊ณณ์์ โ์ฒญ์ ๊ตฌ์ญโ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค
- ์ ๋ถ API ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ DataBase ๊ตฌํ
- express.json()์ ์ฌ์ฉํ์ฌ jsonํ์์ผ๋ก ๋ฐ์์ค๊ฒ ๊ตฌํ
- ์ ๋ถ API ์ ์ฑ
์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๋ณ๊ฒฝํด์ผ๋๊ธฐ์ Data Pooling ๊ตฌํ
- setInterval ๋ฉ์๋ ์ฌ์ฉํ์ฌ 5์๊ฐ์ ํ๋ฒ์ฉ ๋ฐ์์ค๋๋ก ๊ตฌํ
### 6. ๊ฒฐ๊ณผ ๊ด์ฐฐ
- WebServer์์ ์ ๋ถAPI ๋ฐ์ดํฐ ๊ฐ๊ณต ํ์ฌ DB ์ ์ฅ
- ๋์ด : โ39์ธ ๋ฏธ๋งโ โ โ0โ ~ โ39โ
- ๋ ์ง : โYYYYMMDDโ ~ โYYYYMMDDโ ์์ ๋ฐ ํน์ ๋ฐ์ดํฐ โ์์ธํ์ธโ ๋ณ๊ฒฝ
- โ์ฒญ์ ๊ตฌ์ญโ์์ ์์ฒญํ ๋ฐ์ดํฐ ํ์์ ๋ง๊ฒ ๊ฐ๊ณต ํ์ธ
- jsonํ์์ผ๋ก ๋ฐ์์ค๊ฒ ๊ตฌํ ์๋ฃ
- 5์๊ฐ๋ง๋ค ์ ๋ถAPI๋ฐ์ดํฐ๊ฐ DataBase์ ์ ์ฅ
์ฆ๊ฒจ์ฐพ๊ธฐ ๊ธฐ๋ฅ ๋ฌธ์
### 1. ๋ฌธ์ ์ ์
- ์ฌ๋ฌ ํ์ด์ง์์ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ์ ์ฐ๋๋์ง ์๋ ๋ฌธ์ ํ์ธ
### 2. ์ฌ์ค ์์ง
- ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ธฐ๋ฅ ์ ์ฅ์ ๋๋ ์ถ์ฒ, ์ธ๊ธฐ, ์์ธ ํ๋ฉด์์ ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ธฐ๋ฅ ํด์ ์ ์ฆ๊ฒจ์ฐพ๊ธฐ ํ์ด์ง์์ ํด๋น ์ ์ฑ
์ด ์ฌ๋ผ์ง์ง ์์
- ์ผ๋ถ ์ ์ฑ
์ ์ฆ๊ฒจ์ฐพ๊ธฐ ํ์ด์ง์ ์ค๋ณต๋จ
### 3. ์์ธ ์ถ๋ก
- SwiftData์์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ๊ฐ ์ผ์นํ์ง ์์
- SwiftData์์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๋ฐ์ดํฐ๋ก ์ธ์ํ์ง ์์
### 4. ์กฐ์ฌ๋ฐฉ๋ฒ ๊ฒฐ์
- SwiftData ๋ชจ๋ธ์ Attribute์์ฑ์ ์ถ๊ฐํด uniqueํ ๋ณ์๋ฅผ ๋ง๋ค์ด ์ฃผ๊ธฐ
### 5. ์กฐ์ฌ ๋ฐฉ๋ฒ ๊ตฌํ
- SwiftData ๋ชจ๋ธ์ ์์ ํ ๋ค @Query๋ฅผ ์ฌ์ฉํ์ฌ List๋ฐ์ดํฐ๋ฅผ ๋ง๋ ๋ค.
- ๊ฐ ํ์ด์ง(์ถ์ฒ, ์ธ๊ธฐ, ์์ธ)์์ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ก ์ถ๊ฐํ๋ค์ ํด๋น ํ์ด์ง๊ฐ ์๋ ๋ค๋ฅธ ํ์ด์ง์์ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ํด์ ํ๋ค.
### 6. ๊ฒฐ๊ณผ ๊ด์ฐฐ
- ํด๋น ๋ฐฉ๋ฒ์ ์ ์ฉํ ๋ฐ์ดํฐ๊ฐ ์ฐ๋๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ
TCAํจํด์ผ๋ก ์ ์ฉํ๋ฉฐ ์๊ฒผ๋ ๋ฌธ์ ๋ค
### 1. ๋ฌธ์ ์ ์
- ๋ค๋น๊ฒ์ด์
์ ์ด์ฉํ ๋ทฐ ์ด๋์ด ์ ๋๋ก ์๋๋์ง ์๋ ์ค๋ฅ
### 2. ์ฌ์ค ์์ง
- StartView์์ MainView๋ก์ ์ด๋์ ๋๋๋ฐ ๊ทธ MainView์์ ์๋ ํญ๋ทฐ ์์ดํ
๋ค์์ ์๋ก ๋ค๋น๊ฒ์ด์
์ด ์ด๋ฆฌ์ง ์์
### 3. ์์ธ ์ถ๋ก
- TCA์ํคํ
์ฒ์์๋ ๋ค๋น๊ฒ์ด์
ํจ์ค๊ฐ ์ ์ธ๋์ด์๋ ์คํ์์์ ์๋ก์ด ๋ค๋น๊ฒ์ด์
์คํ์ ์์ฑํ๋๊ฒ ๋ถ๊ฐ๋ฅํจ
### 4. ํด๊ฒฐ๋ฐฉ๋ฒ
- ์ต์์ ์คํ ์ด์์ ์คํ์ ์์ ์ ์๋ Path๋ฅผ ์์ฑ
- ์ด๋ํ ํ๋ฉด์ Path์ ์ถ๊ฐํ๊ณ dismiss๋ก Path์์ ์ ๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก ๋ค๋น๊ฒ์ด์
๊ตฌํ
### ํด๊ฒฐ ์ฝ๋
- ### ๋ฆฌ๋์
- `State`: ๋ค๋น๊ฒ์ด์
์ ์ํ ๊ฒฝ๋ก ์ํ๋ฅผ ๊ด๋ฆฌ. StackState๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ค๋น๊ฒ์ด์
์คํ์ ์ถ์
- `Action`: openMain ์ก์
์ ๋ฉ์ธ ํ๋ฉด์ผ๋ก์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ. path ์ก์
์ ๋ค๋น๊ฒ์ด์
์คํ์ ๋ณ๊ฒฝ์ ๊ด๋ฆฌ
- `body`: openMain ์ก์
์ ๋ฐ์์ ๋, ๋ฉ์ธ ํ๋ฉด์ผ๋ก์ ๊ฒฝ๋ก๋ฅผ ๋ค๋น๊ฒ์ด์
์คํ์ ์ถ๊ฐํ์ฌ ๋ค๋น๊ฒ์ด์
์ํ ๋ณ๊ฒฝ
```Swift
@Reducer
struct StartFeature {
@ObservableState
struct State: Equatable {
var path = StackState()
}
enum Action {
case openMain
case path(StackAction)
}
var body: some ReducerOf {
Reduce { state, action in
switch action {
case .openMain:
// Main ํ๋ฉด์ผ๋ก์ ๊ฒฝ๋ก๋ฅผ path ์คํ์ ์ถ๊ฐํฉ๋๋ค.
state.path.append(.mainScene(MainFeature.State(
policies: state.result
)))
return .none
case let .path(action):
// Path ์ก์
์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ๋ฉด ์ ํ ๋ก์ง์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
switch action {
default:
return .none
}
}
}
.forEach(\.path, action: \.path) {
Path()
}
}
}
extension StartFeature {
@Reducer
struct Path {
@ObservableState
enum State: Equatable {
case mainScene(MainFeature.State)
}
enum Action {
case mainScene(MainFeature.Action)
}
var body: some ReducerOf {
Scope(state: \.mainScene, action: \.mainScene) {
MainFeature()
}
}
}
}
```
- ### ๋ทฐ
- `NavigationStack`: TCA์ NavigationStack์ ์ฌ์ฉํ์ฌ, ์คํ ์ด์ ์ํ๋ฅผ ๋ฐํ์ผ๋ก ๋์ ์ผ๋ก ํ๋ฉด์ ์ ํ
- path ํ๋ผ๋ฏธํฐ์ ๋ฐ์ธ๋ฉ๋ ์คํ ์ด์ ์ํ๋ฅผ ํตํด ๋ค๋น๊ฒ์ด์
์คํ์ ๊ด๋ฆฌ
- `destination`: ๊ฒฝ๋ก ์ํ์ ๋ฐ๋ผ ํ์ํ ํ๋ฉด์ ๊ฒฐ์
- ์๋ฅผ ๋ค์ด, ์ํ๊ฐ .mainScene์ผ ๋ MainView๋ฅผ ํ์
```Swift
NavigationStack(path: $store.scope(state: \.path, action: \.path)) {
VStack {
// ํ๋ฉด ๊ตฌ์ฑ
}
.padding(.horizontal, 20)
.padding(.vertical, 20)
} destination: { store in
switch store.state {
case .mainScene:
if let store = store.scope(state: \.mainScene, action: \.mainScene) {
MainView(store: store)
}
}
}
```