๐ ์ฝ๋ ๋ฆฌ๋ทฐ: ์ค์ ์ธ์ฆ ๋ฐ UI ๊ฐ์ ์ฌํญ#13
Conversation
- CustomNavigationBackBar๋ฅผ ZStack ๊ตฌ์กฐ๋ก ๋ฐ๊ฟ ์ ๋ชฉ์ด ์ ํํ ์ค์์ ์ค๋๋ก ์์ - ๋ฒํผ ํญ ์์ญ์ด ๋ ์ ์กํ๋๋ก contentShape ์ถ๊ฐ - CustomNavigationBar์ ๋ถํ์ํ ๊ณต๋ฐฑ ์ ๊ฑฐ
- ์ค์ ์๋ฒ ๋ฐ์ดํฐ ์ฐ๋์ผ๋ก ๋๋ฏธ ๋ฐ์ดํฐ ์ ๊ฑฐ - ๋ก๋ฉ ์ํ ๋ฐ ๋น ์ํ UI ๊ฐ์ - ํ์ด์ง๋ค์ด์ ์ผ๋ก ์ฑ๋ฅ ์ต์ ํ - ์๊ฐ ํฌ๋งทํ ์ผ๋ก ๊ฐ๋ ์ฑ ํฅ์
- Swift Concurrency ๊ถํ ์์ฒญ ์ง์ - ์๋ฌ ํธ๋ค๋ง ํฌํจ ํ์ฌ ์์น ๊ฐ์ ธ์ค๊ธฐ - ์ฝ๋ฐฑ ๊ธฐ๋ฐ ์ง์์ ์์น ์ ๋ฐ์ดํธ - ์ค์ ์ด๋ ๋ฐ ๊ถํ ์ํ ์ถ์ ๊ธฐ๋ฅ
- TrainStationFeature ํตํฉ ์ญ ์ ํ ์์คํ ๊ณผ LocationPermissionManager - ๊ธฐ๋ฐ ์์น ๊ถํ ์ฒ๋ฆฌ, ํฅ์๋ ํ์ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค. - ์ธ์ฆ/์์น ๊ถํ ์๋ฆผ, ์ถ๋ฐ ์๊ฐ ํ ์คํธ, ํ์ ํ ์ํ ๋ฆฌ์ ๋ฑ
- TravelHistoryCardItem์ Entity๋ก ์ด๋ - ProfileFeature์ ํ์คํ ๋ฆฌ ํ์ด์ง๋ค์ด์ ์ถ๊ฐ - ์ค์ ํ์คํ ๋ฆฌ ๋ฐ์ดํฐ ์ฐ๋ ๋ฐ ๋น ์ํ ์ฒ๋ฆฌ - ExploreView UI ๋จ์ํ - SettingReducer editUser ํ๋ผ๋ฏธํฐ ์์
- ๊ณต๊ฐ/์ธ์ฆ ์ญ ์๋ํฌ์ธํธ ๋ถ๋ฆฌ - ๋น๋๊ธฐ ์์ ์ทจ์ ๊ธฐ๋ฅ ์ถ๊ฐ - ๊ฒ์ ์ ๊ทํ๋ก ๊ฒ์ ์ฑ๋ฅ ํฅ์ - ์ ๋ ฌ ๋ฐ ์คํ์ผ๋ง์ผ๋ก UI ๋ ์ด์์ ๊ฐ์
Roy-wonji
left a comment
There was a problem hiding this comment.
๐ ์์ธ ์ฝ๋ ๋ฆฌ๋ทฐ
ํฌ๊ด์ ์ธ ์ฝ๋ ๋ถ์์ ํตํด ๋ฐ๊ฒฌํ ์ฃผ์ ์ฌํญ๋ค์ ์ ๋ฆฌํ์ต๋๋ค.
โ ์ฐ์ํ ์ ๋ค
๐๏ธ ์ํคํ ์ฒ ์ค๊ณ
- Clean Architecture + TCA: ์ฒด๊ณ์ ์ธ ๋ ์ด์ด ๋ถ๋ฆฌ์ ์ํ ๊ด๋ฆฌ โญ
- ์์กด์ฑ ์ฃผ์ : WeaveDI๋ฅผ ํตํ ๊น๋ํ DI ๊ตฌ์กฐ
- ๋ชจ๋ํ: ๋ช ํํ ์ฑ ์ ๋ถ๋ฆฌ (Data, Domain, Presentation)
๐ช ๊ธฐ์ ์ ๊ฐ์
- Swift Concurrency: Actor ํจํด๊ณผ async/await ์ ๊ทน ํ์ฉ
- ๋ณด์ ์์: Bundle์ ํตํ API ํค ๊ด๋ฆฌ ๋ฐฉ์์ด ์ ์ ํจ
- ์๋ฌ ์ฒ๋ฆฌ: ์ธ๋ฐํ ์๋ฌ ํ์ ์ ์์ ์ฒ๋ฆฌ ๋ก์ง
๐จ ์ฆ์ ์์ ํ์ (CRITICAL)
1. AuthInterceptor.swift:48-50 - ๋น ํ ํฐ ํ๋์ฝ๋ฉ
// โ ํ์ฌ: ๋ชจ๋ API ํธ์ถ์ด ์คํจํ๋ ์์ธ
let newCredential = AccessTokenCredential.make(
accessToken: "", // ๋น ๋ฌธ์์ด!
refreshToken: ""
)
// โ
์์ ํ์
let newCredential = AccessTokenCredential.make(
accessToken: tokens.accessToken,
refreshToken: tokens.refreshToken
)2. TokenRefreshManager ๋ฌดํ ์ฌ๊ท ์ํ
- Line 28-32:
Task.yield()ํ ์ฌ๊ท ํธ์ถ๋ก ๋ฌดํ ๋ฃจํ ๊ฐ๋ฅ์ฑ - ํ ํฐ ๊ฐฑ์ ์ค ๊ฒฝ์ ์ํ ๋ฐ์ ์ ์ฑ ํ ์ํ
โ ๏ธ ๋ณด์ ๊ฐ์ ํ์
InMemoryKeychainManager โ ์ค์ Keychain ๊ตฌํ ํ์
ํ์ฌ๋ ๋ฉ๋ชจ๋ฆฌ์๋ง ์ ์ฅ๋์ด ์ฑ ์ฌ์์ ์ ํ ํฐ์ด ์ฌ๋ผ์ง. iOS Keychain Services ์ฌ์ฉ ๊ถ์ฅ.
๐ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ
- ๋ฐ๊ฒฌ ์ด์: 10๊ฐ (๊ธด๊ธ 2๊ฐ, ๋์ 4๊ฐ, ๋ณดํต 3๊ฐ, ๋ฎ์ 1๊ฐ)
- ์ ์ฒด ํ๊ฐ: ๋งค์ฐ ์ฐ์ํ ๊ตฌ์กฐ, ๋ช ๊ฐ์ง ์ค์ ๋ฒ๊ทธ๋ง ์์ ํ๋ฉด ํ๋ก๋์ ์ค๋น ์๋ฃ ๐ฏ
๊ถ์ฅ์ฌํญ: Critical ์ด์ 2๊ฐ ์์ ํ ๋จธ์ง ์งํ
๐จ AuthInterceptor.swift - ๊ธด๊ธ ์์ ํ์ํ์ผ: Line 48-50: ๋น ํ ํฐ ํ๋์ฝ๋ฉ ์ด์๏ฟฝ[1;38;5;196mWelcome to Swift!๏ฟฝ[0m ๏ฟฝ[1mSubcommands:๏ฟฝ[0m ๏ฟฝ[1mswift build๏ฟฝ[0m Build Swift packages Use ๏ฟฝ[1m Use ๏ฟฝ[1m Use ๏ฟฝ[1m ๋ฌธ์ : ํ ํฐ ๋ฆฌํ๋ ์๊ฐ ์ฑ๊ณตํด๋ ๋น ๋ฌธ์์ด์ด ์ ์ฅ๋์ด ๋ชจ๋ ํ์ API ํธ์ถ์ด 401 ์๋ฌ๋ก ์คํจํฉ๋๋ค. ์์ ๋ฐฉ๋ฒ: ๏ฟฝ[1;38;5;196mWelcome to Swift!๏ฟฝ[0m ๏ฟฝ[1mSubcommands:๏ฟฝ[0m ๏ฟฝ[1mswift build๏ฟฝ[0m Build Swift packages Use ๏ฟฝ[1m Use ๏ฟฝ[1m Use ๏ฟฝ[1m ์์ ์์
์๊ฐ: 5๋ถ |
๐ InMemoryKeychainManager - ๋ณด์ ๊ฐ์ ํ์ํ์ผ: Projects/Domain/DomainInterface/Sources/Manger/InMemoryKeychainManager.swift ๋ณด์ ์ํ: ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ํ ํฐ ์ ์ฅํ์ฌ ๊ตฌํ์ ํ ํฐ์ ๋ฉ๋ชจ๋ฆฌ์๋ง ์ ์ฅํ๊ณ ์์ด ๋ค์ ๋ฌธ์ ๋ค์ด ๋ฐ์ํฉ๋๋ค: โ ๋ฌธ์ ์ ๋ค:
โ ๊ถ์ฅ ํด๊ฒฐ์ฑ :
์ฐ์ ์์: ์์ ์์ ์๊ฐ: 2-3์๊ฐ |
๐จ HomeView - UI/UX ๊ฐ์ ๊ถ์ฅ์ฌํญํ์ผ: Projects/Presentation/Home/Sources/Main/View/HomeView.swift ๊ฐ์ ํ์ ์ฌํญ๋ค1. Magic Numbers โ Constants ๋ถ๋ฆฌ (Line 70, 110)โ ํ์ฌ:
โ
๊ฐ์ ์: 2. ๋ ์ง ์ ํ๊ธฐ ๊ฒ์ฆ ๋ก์ง ๋ถ์กฑ (Line 200-202)โ ํ์ฌ: ๊ณผ๊ฑฐ ์๊ฐ ์ ํ ๊ฐ๋ฅ์ฑ 3. ๊ตญ์ ํ ๋์ ๋ถ์กฑํ๋์ฝ๋ฉ๋ ํ๊ตญ์ด ๋ฌธ์์ด๋ค:
๐ก ๊ธ์ ์ ์ธ ๋ถ๋ถ๋ค
์ฐ์ ์์: ๐ก MEDIUM - ์ ์ง์ ๊ฐ์ ๊ฐ๋ฅ |
๐ ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ฃ - ๋ค์ ๋จ๊ณ ์๋ด๐ฏ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ์์ฝ์ด 10๊ฐ ์ด์ ๋ฐ๊ฒฌ๋์์ผ๋ฉฐ, ์ ๋ฐ์ ์ผ๋ก ๋งค์ฐ ์ฐ์ํ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๐ ์ด์ ๋ถ๋ฅ
๐ ๊ถ์ฅ ์์ ์์Phase 1: ๊ธด๊ธ ์์ (๊ธ์ฃผ ๋ด)
Phase 2: ๋ณด์ ๊ฐํ (๋ค์ ์คํ๋ฆฐํธ)
Phase 3: ์ฝ๋ ํ์ง (์ ์ง์ )
โจ ์ฐ์ํ ์ ๋ค ์ฌํ์ธ
์ดํ: ๋ช ๊ฐ์ง ์ค์ํ ๋ฒ๊ทธ๋ง ์์ ํ๋ฉด ํ๋ก๋์ ์ค๋น ์๋ฃ ์ํ์ ๋๋ค! ๐ |
๐จ Critical ์ด์ ์์ : - AuthInterceptor: ๋น ํ ํฐ ํ๋์ฝ๋ฉ โ ์ค์ ํ ํฐ ์ฌ์ฉ (48-49๋ฒ ๋ผ์ธ) - ๋ชจ๋ API ํธ์ถ ์คํจ ์์ธ ํด๊ฒฐ ๐จ UI ์ฝ๋ ํ์ง ๊ฐ์ : - HomeView: ๋งค์ง ๋๋ฒ๋ฅผ LayoutConstants enum์ผ๋ก ๋ถ๋ฆฌ - ํ๋์ฝ๋ฉ๋ ๊ฐ๋ค (524, 176, 492 ๋ฑ) โ ์์ํ - ์ ์ง๋ณด์์ฑ ๋ฐ ์ผ๊ด์ฑ ํฅ์ ๐ ๊ตญ์ ํ ์ค๋น: - ๋ฌธ์์ด ์์๋ฅผ Strings enum์ผ๋ก ๋ถ๋ฆฌ - "ํ์ฌ ์๊ฐ", "์ถ๋ฐ ์๊ฐ", "HOURS", "MINUTES" ๋ฑ ์์ํ - ํฅํ ๋ค๊ตญ์ด ์ง์ ๊ธฐ๋ฐ ๋ง๋ จ ๐ ๋ณด์ ๊ฐ์ : - ๋๋ฒ๊ทธ ๋ก๊ทธ์์ ๋ฏผ๊ฐํ ํ ํฐ ์ ๋ณด ์กฐ๊ฑด๋ถ ์ถ๋ ฅ - ํ๋ก๋์ ๋น๋์์ ํ ํฐ ๊ฐ ๋ก๊น ๋ฐฉ์ง
โ ์ฝ๋ ๋ฆฌ๋ทฐ ๊ฐ์ ์ฌํญ ์ ์ฉ ์๋ฃ!๋ฆฌ๋ทฐ์์ ๋ฐ๊ฒฌํ ์ฃผ์ ์ด์๋ค์ ๋ชจ๋ ์์ ํ์ต๋๋ค: ๐จ Critical Issues ์์ ์๋ฃโ AuthInterceptor ๋น ํ ํฐ ์ด์ ํด๊ฒฐ (Line 48-50)
๐จ UI ์ฝ๋ ํ์ง ๋ํญ ๊ฐ์โ ๋งค์ง ๋๋ฒ ์์ ์ ๊ฑฐ
๐๏ธ TCA ํจํด ์๋ฒฝ ์ค์โ ์์ ๊ตฌ์กฐ ๊ฐ์
๐ ๋ณด์ ๊ฐํโ ๋ฏผ๊ฐ ์ ๋ณด ๋ก๊น ๊ฐ์
๐ ๊ฐ์ ๊ฒฐ๊ณผ
์ด์ ํ๋ก๋์ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค! ๐ |
๐ฆ ์์ ์ฌ๊ตฌ์ฑ: - ๋ฌธ์์ด ์์๋ฅผ HomeFeature.Strings๋ก ์ด๋ - TCA Feature ๋ ๋ฒจ์์ ๋น์ฆ๋์ค ๋ฌธ์์ด ๊ด๋ฆฌ - View ๋ ๋ฒจ์์๋ Layout ์์๋ง ๊ด๋ฆฌ ๐จ Layout ์์ ๊ตฌ์กฐํ: - Layout.Hero: ํ์ด๋ก ์น์ ๊ด๋ จ ์์ - Layout.TimePicker: ์๊ฐ ์ ํ๊ธฐ ๊ด๋ จ ์์ - Layout.TimeCapsule: ์๊ฐ ์บก์ ๊ด๋ จ ์์ - Layout.TimeDisplay: ์๊ฐ ํ์ ๊ด๋ จ ์์ โจ ๊ฐ์ ํจ๊ณผ: - ์๋ฏธ ์๋ ๋ค์ด๋ฐ์ผ๋ก ๊ฐ๋ ์ฑ ํฅ์ - TCA ์ํคํ ์ฒ ํจํด ์ค์ - ์ ์ง๋ณด์์ฑ ๋ฐ ํ์ฅ์ฑ ํฅ์
2dab98c to
6bcfbf7
Compare
๐ ์ฝ๋ ๋ฆฌ๋ทฐ: ์ค์ ์ธ์ฆ ๋ฐ UI ๊ฐ์ ์ฌํญ
์์ฝ
ํฌ๊ด์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ๋ฐ๊ฒฌ๋ ์ค์ํ ์ด์๋ค์ ์ ๋ฆฌํ PR์ ๋๋ค.
๐จ ๊ธด๊ธ ์์ ํ์ ์ฌํญ
๐ง ์ฃผ์ ๊ฐ์ ์์ญ
๐ ๊ตฌํ ์ํ
์ด PR์ ์ข ํฉ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฆฌํฌํธ ์ญํ ์ ํฉ๋๋ค. ๋ฐ๊ฒฌ๋ ์ค์ ์ด์๋ค์ ํ์ PR์์ ์ค์ ์์ ๋์ด์ผ ํฉ๋๋ค:
๐ฏ ๊ธฐ๋ ํจ๊ณผ
๐ ๋ฆฌ๋ทฐ ํต๊ณ