APP-iOS3rd / PJ2T6_CleanArea

์ฒญ๋…„๋“ค์„ ์œ„ํ•œ ์ •์ฑ…์„ ์•Œ๋ ค์ฃผ๋Š” ์ฒญ์ •๊ตฌ์—ญ
3 stars 4 forks source link

๐Ÿณ ์ฒญ์ •๊ตฌ์—ญ

์ฒญ๋…„๋“ค์„ ์œ„ํ•œ ์ •์ฑ…์„ ์•Œ๋ ค์ฃผ๋Š” ์ฒญ์ •๊ตฌ์—ญ

๐Ÿ“– ๋ชฉ์ฐจ

  1. ์†Œ๊ฐœ
  2. ๊ฐœ๋ฐœํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  3. ๊ธฐ๋Œ€ํšจ๊ณผ
  4. ๊ธฐ๋Šฅ์„ค๋ช…
  5. ๋™์ž‘์›๋ฆฌ
  6. ํƒ€์ž„๋ผ์ธ
  7. ์‹คํ–‰ํ™”๋ฉด
  8. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐ŸŒฑ ์†Œ๊ฐœ

์†Œ๊ฐœ ์˜์ƒ

์•ฑ ๋ชฉ์ 

ํƒ€๊ฒŸ ์‚ฌ์šฉ์ž

๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ํŒ€์›

์ตœ๋™ํ˜ธ ๊น€๊ฑดํ˜ธ ๊น€์ง€ํ›ˆ ๋…ธ์ฃผ์˜ ์ด๋ฏผํ˜ธ
Kakao-Talk-Photo-2023-09-19-15-30-11 1f

โœจ ๊ธฐ๋Œ€ํšจ๊ณผ

- ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ์ •์ฑ…๋“ค์„ ์•Œ๋ ค์ค˜์„œ ์‚ฌ์šฉ์ž๋“ค์ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ •์ฑ…์˜ ๊ธฐ๊ฐ„์„ ์•Œ๋ ค์ค˜์„œ ๋งˆ๊ฐ์ผ ์ „์— ์‚ฌ์šฉ์ž๋“ค์ด ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

- ์‚ฌ์šฉ์ž๋“ค์ด ์ •์ฑ…์„ ๋งค๋ฒˆ ๊ฒ€์ƒ‰ํ•  ํ•„์š”์—†์ด ์ฆ๊ฒจ์ฐพ๊ธฐํ•˜์—ฌ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ข ๊ธฐ๋Šฅ์„ค๋ช…

- ๊ฐœ์ธ์˜ ์ฃผ๊ฑฐ ์ง€์—ญ, ์ทจ์—… ์ƒํƒœ, ๋‚˜์ด, ํ•™๋ ฅ, ๊ด€์‹ฌ ์ •์ฑ… ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฒญ๋…„ ์ •์ฑ…์„ ๊ฒ€์ƒ‰

- ํ•ด๋‹น๋˜๋Š” ์ผ์ž๋ฆฌ, ์ฃผ๊ฑฐ, ๊ต์œก, ๋ณต์ง€โ€ข๋ฌธํ™”,  ์ฐธ์—ฌโ€ข๊ถŒ๋ฆฌ ๋ถ„์•ผ์˜ ์ •์ฑ… ์ •๋ณด๋ฅผ ์ œ๊ณต

- ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒ€์ƒ‰ํ•œ ์ •์ฑ…๋“ค ์ค‘ ์‚ฌ์šฉ์ž๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์ฐพ๋Š” ์ •์ฑ…์„ ๋ณด์—ฌ์คŒ

- ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ๊ฒจ์ฐพ๊ธฐํ•œ ์ •์ฑ…์„ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•  ํ•„์š” ์—†์ด ๋ฐ”๋กœ ์ด๋™์ด ๊ฐ€๋Šฅ

- ๋‹คํฌ ๋ชจ๋“œ ์ง€์›

โš™๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

[swift]() [xcode]() [The Composable Architecture]()

๐Ÿ’ก๋™์ž‘ ์›๋ฆฌ

qwewqewqewq

๐Ÿชก ์ˆœ์„œ๋„

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-13 แ„‹แ…ฉแ„’แ…ฎ 3 07 09

๐Ÿง‘โ€๐Ÿ”ง ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์„ค๊ณ„

๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ ๋ฐฉ์•ˆ

โฐ ํƒ€์ž„๋ผ์ธ

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) } } } ```