Skip to content

๐Ÿ” ์ฝ”๋“œ ๋ฆฌ๋ทฐ: ์ค‘์š” ์ธ์ฆ ๋ฐ UI ๊ฐœ์„ ์‚ฌํ•ญ#13

Merged
Roy-wonji merged 27 commits intodevelopfrom
feature/explore
Mar 26, 2026
Merged

๐Ÿ” ์ฝ”๋“œ ๋ฆฌ๋ทฐ: ์ค‘์š” ์ธ์ฆ ๋ฐ UI ๊ฐœ์„ ์‚ฌํ•ญ#13
Roy-wonji merged 27 commits intodevelopfrom
feature/explore

Conversation

@Roy-wonji
Copy link
Copy Markdown
Contributor

์š”์•ฝ

ํฌ๊ด„์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋œ ์ค‘์š”ํ•œ ์ด์Šˆ๋“ค์„ ์ •๋ฆฌํ•œ PR์ž…๋‹ˆ๋‹ค.

๐Ÿšจ ๊ธด๊ธ‰ ์ˆ˜์ • ํ•„์š” ์‚ฌํ•ญ

  • AuthInterceptor์—์„œ ๋นˆ ํ† ํฐ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ์ธํ•œ ์ธ์ฆ ์‹คํŒจ
  • ํ† ํฐ ๊ฐฑ์‹  ๋กœ์ง์—์„œ ๋ฌดํ•œ ์žฌ๊ท€ ์œ„ํ—˜์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์Ÿ ์ƒํƒœ
  • InMemoryKeychainManager๊ฐ€ ์‹ค์ œ iOS Keychain Services๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

๐Ÿ”ง ์ฃผ์š” ๊ฐœ์„  ์˜์—ญ

  • ์ธ์ฆ ์‹œ์Šคํ…œ: ํ† ํฐ ๊ด€๋ฆฌ ๋ฐ ๊ฐฑ์‹  ๋กœ์ง
  • ๋ณด์•ˆ: ์ ์ ˆํ•œ Keychain ํ†ตํ•ฉ ๋ฐ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • UI/UX: ๋ ˆ์ด์•„์›ƒ ์ƒ์ˆ˜ํ™” ๋ฐ ๋‚ ์งœ ์„ ํƒ๊ธฐ ์—๋Ÿฌ ๋ณต๊ตฌ
  • ์ฝ”๋“œ ํ’ˆ์งˆ: ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ๋ฐ ๊ตญ์ œํ™”

๐Ÿ“‹ ๊ตฌํ˜„ ์ƒํƒœ

์ด PR์€ ์ข…ํ•ฉ์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฆฌํฌํŠธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ๋œ ์ค‘์š” ์ด์Šˆ๋“ค์€ ํ›„์† PR์—์„œ ์‹ค์ œ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. ์šฐ์„ ์ˆœ์œ„ 1: AuthInterceptor.swift:48-50์˜ ๋นˆ ํ† ํฐ ์ด์Šˆ ์ˆ˜์ •
  2. ์šฐ์„ ์ˆœ์œ„ 2: ์ ์ ˆํ•œ ํ† ํฐ ๊ฐฑ์‹  ๊ฒฝ์Ÿ ์ƒํƒœ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
  3. ์šฐ์„ ์ˆœ์œ„ 3: InMemoryKeychainManager๋ฅผ ์‹ค์ œ Keychain ๊ตฌํ˜„์ฒด๋กœ ๊ต์ฒด

๐ŸŽฏ ๊ธฐ๋Œ€ ํšจ๊ณผ

  • ์•ฑ ๋ณด์•ˆ์„ฑ ๋ฐ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ
  • ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ฒฝํ—˜ ๊ฐœ์„ 
  • ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ์ผ๊ด€์„ฑ ํ–ฅ์ƒ
  • ์ธ์ฆ ๊ด€๋ จ ํฌ๋ž˜์‹œ ๋ฐ ํ† ํฐ ์†์‹ค ๋ฐฉ์ง€

๐Ÿ“Š ๋ฆฌ๋ทฐ ํ†ต๊ณ„

  • ๋ฐœ๊ฒฌ๋œ ์ด ์ด์Šˆ: 10๊ฐœ (๊ธด๊ธ‰ 2๊ฐœ, ๋†’์Œ 4๊ฐœ, ๋ณดํ†ต 3๊ฐœ, ๋‚ฎ์Œ 1๊ฐœ)
  • ๋ฆฌ๋ทฐ๋œ ํŒŒ์ผ: 8๊ฐœ ์ด์ƒ์˜ ํ•ต์‹ฌ ์ธ์ฆ ๋ฐ UI ํŒŒ์ผ
  • ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด: TCA๋ฅผ ํ™œ์šฉํ•œ Clean Architecture ๊ฒ€์ฆ ์™„๋ฃŒ

- CustomNavigationBackBar๋ฅผ ZStack ๊ตฌ์กฐ๋กœ ๋ฐ”๊ฟ” ์ œ๋ชฉ์ด ์ •ํ™•ํžˆ ์ค‘์•™์— ์˜ค๋„๋ก ์ˆ˜์ •
- ๋ฒ„ํŠผ ํƒญ ์˜์—ญ์ด ๋” ์ž˜ ์žกํžˆ๋„๋ก contentShape ์ถ”๊ฐ€
- CustomNavigationBar์˜ ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ ์ œ๊ฑฐ
- ์‹ค์ œ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์—ฐ๋™์œผ๋กœ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
- ๋กœ๋”ฉ ์ƒํƒœ ๋ฐ ๋นˆ ์ƒํƒœ UI ๊ฐœ์„ 
- ํŽ˜์ด์ง€๋„ค์ด์…˜์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”
- ์‹œ๊ฐ„ ํฌ๋งทํŒ…์œผ๋กœ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- Swift Concurrency ๊ถŒํ•œ ์š”์ฒญ ์ง€์›
- ์—๋Ÿฌ ํ•ธ๋“ค๋ง ํฌํ•จ ํ˜„์žฌ ์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ธฐ
- ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ์ง€์†์  ์œ„์น˜ ์—…๋ฐ์ดํŠธ
- ์„ค์ • ์ด๋™ ๋ฐ ๊ถŒํ•œ ์ƒํƒœ ์ถ”์  ๊ธฐ๋Šฅ
- TrainStationFeature ํ†ตํ•ฉ ์—ญ ์„ ํƒ ์‹œ์Šคํ…œ๊ณผ LocationPermissionManager
- ๊ธฐ๋ฐ˜ ์œ„์น˜ ๊ถŒํ•œ ์ฒ˜๋ฆฌ, ํ–ฅ์ƒ๋œ ํƒ์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
- ์ธ์ฆ/์œ„์น˜ ๊ถŒํ•œ ์•Œ๋ฆผ, ์ถœ๋ฐœ ์‹œ๊ฐ„ ํ† ์ŠคํŠธ, ํƒ์ƒ‰ ํ›„ ์ƒํƒœ ๋ฆฌ์…‹ ๋“ฑ
- TravelHistoryCardItem์„ Entity๋กœ ์ด๋™
- ProfileFeature์— ํžˆ์Šคํ† ๋ฆฌ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ถ”๊ฐ€
- ์‹ค์ œ ํžˆ์Šคํ† ๋ฆฌ ๋ฐ์ดํ„ฐ ์—ฐ๋™ ๋ฐ ๋นˆ ์ƒํƒœ ์ฒ˜๋ฆฌ
- ExploreView UI ๋‹จ์ˆœํ™”
- SettingReducer editUser ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ •
- ๊ณต๊ฐœ/์ธ์ฆ ์—ญ ์—”๋“œํฌ์ธํŠธ ๋ถ„๋ฆฌ
- ๋น„๋™๊ธฐ ์ž‘์—… ์ทจ์†Œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
- ๊ฒ€์ƒ‰ ์ •๊ทœํ™”๋กœ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ
- ์ •๋ ฌ ๋ฐ ์Šคํƒ€์ผ๋ง์œผ๋กœ UI ๋ ˆ์ด์•„์›ƒ ๊ฐœ์„ 
Copy link
Copy Markdown
Contributor Author

@Roy-wonji Roy-wonji left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿ” ์ƒ์„ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

ํฌ๊ด„์ ์ธ ์ฝ”๋“œ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ์ฃผ์š” ์‚ฌํ•ญ๋“ค์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

โœ… ์šฐ์ˆ˜ํ•œ ์ ๋“ค

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„

  • 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๊ฐœ ์ˆ˜์ • ํ›„ ๋จธ์ง€ ์ง„ํ–‰

@Roy-wonji
Copy link
Copy Markdown
Contributor Author

๐Ÿšจ AuthInterceptor.swift - ๊ธด๊ธ‰ ์ˆ˜์ • ํ•„์š”

ํŒŒ์ผ:

Line 48-50: ๋นˆ ํ† ํฐ ํ•˜๋“œ์ฝ”๋”ฉ ์ด์Šˆ

๏ฟฝ[1;38;5;196mWelcome to Swift!๏ฟฝ[0m

๏ฟฝ[1mSubcommands:๏ฟฝ[0m

๏ฟฝ[1mswift build๏ฟฝ[0m Build Swift packages
๏ฟฝ[1mswift package๏ฟฝ[0m Create and work on packages
๏ฟฝ[1mswift run๏ฟฝ[0m Run a program from a package
๏ฟฝ[1mswift test๏ฟฝ[0m Run package tests
๏ฟฝ[1mswift repl๏ฟฝ[0m Experiment with Swift code interactively

Use ๏ฟฝ[1mswift --version๏ฟฝ[0m for Swift version information.

Use ๏ฟฝ[1mswift --help๏ฟฝ[0m for descriptions of available options and flags.

Use ๏ฟฝ[1mswift help <subcommand>๏ฟฝ[0m for more information about a subcommand.

๋ฌธ์ œ: ํ† ํฐ ๋ฆฌํ”„๋ ˆ์‹œ๊ฐ€ ์„ฑ๊ณตํ•ด๋„ ๋นˆ ๋ฌธ์ž์—ด์ด ์ €์žฅ๋˜์–ด ๋ชจ๋“  ํ›„์† API ํ˜ธ์ถœ์ด 401 ์—๋Ÿฌ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ๋ฐฉ๋ฒ•:

๏ฟฝ[1;38;5;196mWelcome to Swift!๏ฟฝ[0m

๏ฟฝ[1mSubcommands:๏ฟฝ[0m

๏ฟฝ[1mswift build๏ฟฝ[0m Build Swift packages
๏ฟฝ[1mswift package๏ฟฝ[0m Create and work on packages
๏ฟฝ[1mswift run๏ฟฝ[0m Run a program from a package
๏ฟฝ[1mswift test๏ฟฝ[0m Run package tests
๏ฟฝ[1mswift repl๏ฟฝ[0m Experiment with Swift code interactively

Use ๏ฟฝ[1mswift --version๏ฟฝ[0m for Swift version information.

Use ๏ฟฝ[1mswift --help๏ฟฝ[0m for descriptions of available options and flags.

Use ๏ฟฝ[1mswift help <subcommand>๏ฟฝ[0m for more information about a subcommand.

์˜ˆ์ƒ ์ž‘์—… ์‹œ๊ฐ„: 5๋ถ„
์šฐ์„ ์ˆœ์œ„: ๐Ÿ”ฅ CRITICAL - ์ฆ‰์‹œ ์ˆ˜์ • ํ•„์š”

@Roy-wonji
Copy link
Copy Markdown
Contributor Author

๐Ÿ”’ InMemoryKeychainManager - ๋ณด์•ˆ ๊ฐœ์„  ํ•„์š”

ํŒŒ์ผ: Projects/Domain/DomainInterface/Sources/Manger/InMemoryKeychainManager.swift

๋ณด์•ˆ ์œ„ํ—˜: ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ํ† ํฐ ์ €์žฅ

ํ˜„์žฌ ๊ตฌํ˜„์€ ํ† ํฐ์„ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด ๋‹ค์Œ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

โŒ ๋ฌธ์ œ์ ๋“ค:

  • ์•ฑ ์ข…๋ฃŒ/์žฌ์‹œ์ž‘ ์‹œ ํ† ํฐ ์†์‹ค โ†’ ๋งค๋ฒˆ ์žฌ๋กœ๊ทธ์ธ ํ•„์š”
  • ์‹ค์ œ iOS Keychain์˜ ๋ณด์•ˆ ์ด์ ์„ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•จ
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์•ฑ ํ‚ฌ ์‹œ ์ธ์ฆ ์ƒํƒœ ์†์‹ค
  • ํ† ํฐ์ด ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋กœ ๋…ธ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ

โœ… ๊ถŒ์žฅ ํ•ด๊ฒฐ์ฑ…:

  • iOS Keychain Services๋ฅผ ์‚ฌ์šฉํ•œ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋กœ ๊ต์ฒด
  • Security ํ”„๋ ˆ์ž„์›Œํฌ์˜ SecItemAdd/SecItemCopyMatching ํ™œ์šฉ
  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly ๋ณด์•ˆ ์†์„ฑ ์ ์šฉ

์šฐ์„ ์ˆœ์œ„: โš ๏ธ HIGH - ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ๋ณด์•ˆ์— ์ง์ ‘์  ์˜ํ–ฅ

์˜ˆ์ƒ ์ž‘์—… ์‹œ๊ฐ„: 2-3์‹œ๊ฐ„

@Roy-wonji
Copy link
Copy Markdown
Contributor Author

๐ŸŽจ HomeView - UI/UX ๊ฐœ์„  ๊ถŒ์žฅ์‚ฌํ•ญ

ํŒŒ์ผ: Projects/Presentation/Home/Sources/Main/View/HomeView.swift

๊ฐœ์„  ํ•„์š” ์‚ฌํ•ญ๋“ค

1. Magic Numbers โ†’ Constants ๋ถ„๋ฆฌ (Line 70, 110)

โŒ ํ˜„์žฌ:

  • heroHeight: 524 (ํ•˜๋“œ์ฝ”๋”ฉ)
  • ์˜คํ”„์…‹: geometry.size.width - 8 - 176 - 8, y: 492

โœ… ๊ฐœ์„ ์•ˆ:
๋ณ„๋„ LayoutConstants enum์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

2. ๋‚ ์งœ ์„ ํƒ๊ธฐ ๊ฒ€์ฆ ๋กœ์ง ๋ถ€์กฑ (Line 200-202)

โŒ ํ˜„์žฌ: ๊ณผ๊ฑฐ ์‹œ๊ฐ„ ์„ ํƒ ๊ฐ€๋Šฅ์„ฑ
โœ… ๊ฐœ์„ ์•ˆ: ์ตœ์†Œ 20๋ถ„ ๋ฒ„ํผ ์‹œ๊ฐ„ ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€

3. ๊ตญ์ œํ™” ๋Œ€์‘ ๋ถ€์กฑ

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ•œ๊ตญ์–ด ๋ฌธ์ž์—ด๋“ค:

  • "ํ˜„์žฌ ์‹œ๊ฐ„", "์ถœ๋ฐœ ์‹œ๊ฐ„", "HOURS", "MINUTES" ๋“ฑ

๐Ÿ’ก ๊ธ์ •์ ์ธ ๋ถ€๋ถ„๋“ค

  • SwiftUI ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ž˜ ๋”ฐ๋ฅด๊ณ  ์žˆ์Œ
  • ViewBuilder๋ฅผ ํ†ตํ•œ ์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ
  • TCA ๋ฐ”์ธ๋”ฉ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ

์šฐ์„ ์ˆœ์œ„: ๐Ÿ’ก MEDIUM - ์ ์ง„์  ๊ฐœ์„  ๊ฐ€๋Šฅ
์˜ˆ์ƒ ์ž‘์—… ์‹œ๊ฐ„: 1-2์‹œ๊ฐ„

@Roy-wonji
Copy link
Copy Markdown
Contributor Author

๐Ÿ“‹ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์™„๋ฃŒ - ๋‹ค์Œ ๋‹จ๊ณ„ ์•ˆ๋‚ด

๐ŸŽฏ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ์š”์•ฝ

์ด 10๊ฐœ ์ด์Šˆ ๋ฐœ๊ฒฌ๋˜์—ˆ์œผ๋ฉฐ, ์ „๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์šฐ์ˆ˜ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Š ์ด์Šˆ ๋ถ„๋ฅ˜

  • ๐Ÿšจ Critical: 2๊ฐœ (์ฆ‰์‹œ ์ˆ˜์ • ํ•„์š”)
  • โš ๏ธ High: 4๊ฐœ (์šฐ์„  ์ˆ˜์ • ๊ถŒ์žฅ)
  • ๐Ÿ’ก Medium: 3๊ฐœ (์ ์ง„์  ๊ฐœ์„ )
  • โœ… Low: 1๊ฐœ (์—ฌ์œ ์žˆ์„ ๋•Œ)

๐Ÿš€ ๊ถŒ์žฅ ์ž‘์—… ์ˆœ์„œ

Phase 1: ๊ธด๊ธ‰ ์ˆ˜์ • (๊ธˆ์ฃผ ๋‚ด)

  1. โœ… AuthInterceptor ๋นˆ ํ† ํฐ ์ˆ˜์ • (5๋ถ„)
  2. โœ… ํ† ํฐ ๊ฐฑ์‹  ๊ฒฝ์Ÿ ์ƒํƒœ ํ•ด๊ฒฐ (30๋ถ„)

Phase 2: ๋ณด์•ˆ ๊ฐ•ํ™” (๋‹ค์Œ ์Šคํ”„๋ฆฐํŠธ)

  1. ๐Ÿ”’ ์‹ค์ œ Keychain ๊ตฌํ˜„์ฒด ๊ต์ฒด (2-3์‹œ๊ฐ„)
  2. ๐Ÿ” ๋ฏผ๊ฐ ์ •๋ณด ๋กœ๊น… ์ œ๊ฑฐ (30๋ถ„)

Phase 3: ์ฝ”๋“œ ํ’ˆ์งˆ (์ ์ง„์ )

  1. ๐ŸŽจ UI ์ƒ์ˆ˜ ๋ถ„๋ฆฌ (1์‹œ๊ฐ„)
  2. ๐ŸŒ ๊ตญ์ œํ™” ์ค€๋น„ (2์‹œ๊ฐ„)

โœจ ์šฐ์ˆ˜ํ•œ ์ ๋“ค ์žฌํ™•์ธ

  • Clean Architecture + TCA ์™„๋ฒฝ ๊ตฌํ˜„ โญ
  • Swift Concurrency ์ ๊ทน ํ™œ์šฉ
  • ์ฒด๊ณ„์ ์ธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  • ๋ชจ๋“ˆํ™”๋œ ๊ตฌ์กฐ

์ดํ‰: ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฒ„๊ทธ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์™„๋ฃŒ ์ƒํƒœ์ž…๋‹ˆ๋‹ค! ๐ŸŽ‰

๐Ÿšจ Critical ์ด์Šˆ ์ˆ˜์ •:
- AuthInterceptor: ๋นˆ ํ† ํฐ ํ•˜๋“œ์ฝ”๋”ฉ โ†’ ์‹ค์ œ ํ† ํฐ ์‚ฌ์šฉ (48-49๋ฒˆ ๋ผ์ธ)
- ๋ชจ๋“  API ํ˜ธ์ถœ ์‹คํŒจ ์›์ธ ํ•ด๊ฒฐ

๐ŸŽจ UI ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ :
- HomeView: ๋งค์ง ๋„˜๋ฒ„๋ฅผ LayoutConstants enum์œผ๋กœ ๋ถ„๋ฆฌ
- ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’๋“ค (524, 176, 492 ๋“ฑ) โ†’ ์ƒ์ˆ˜ํ™”
- ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ์ผ๊ด€์„ฑ ํ–ฅ์ƒ

๐ŸŒ ๊ตญ์ œํ™” ์ค€๋น„:
- ๋ฌธ์ž์—ด ์ƒ์ˆ˜๋ฅผ Strings enum์œผ๋กœ ๋ถ„๋ฆฌ
- "ํ˜„์žฌ ์‹œ๊ฐ„", "์ถœ๋ฐœ ์‹œ๊ฐ„", "HOURS", "MINUTES" ๋“ฑ ์ƒ์ˆ˜ํ™”
- ํ–ฅํ›„ ๋‹ค๊ตญ์–ด ์ง€์› ๊ธฐ๋ฐ˜ ๋งˆ๋ จ

๐Ÿ”’ ๋ณด์•ˆ ๊ฐœ์„ :
- ๋””๋ฒ„๊ทธ ๋กœ๊ทธ์—์„œ ๋ฏผ๊ฐํ•œ ํ† ํฐ ์ •๋ณด ์กฐ๊ฑด๋ถ€ ์ถœ๋ ฅ
- ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ํ† ํฐ ๊ฐ’ ๋กœ๊น… ๋ฐฉ์ง€
@Roy-wonji
Copy link
Copy Markdown
Contributor Author

โœ… ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ฐœ์„ ์‚ฌํ•ญ ์ ์šฉ ์™„๋ฃŒ!

๋ฆฌ๋ทฐ์—์„œ ๋ฐœ๊ฒฌํ•œ ์ฃผ์š” ์ด์Šˆ๋“ค์„ ๋ชจ๋‘ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค:

๐Ÿšจ Critical Issues ์ˆ˜์ • ์™„๋ฃŒ

โœ… AuthInterceptor ๋นˆ ํ† ํฐ ์ด์Šˆ ํ•ด๊ฒฐ (Line 48-50)

  • ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋นˆ ๋ฌธ์ž์—ด โ†’ ์‹ค์ œ ํ† ํฐ์œผ๋กœ ์ˆ˜์ •
  • ๋ชจ๋“  API ํ˜ธ์ถœ ์‹คํŒจ ์›์ธ ์™„์ „ ํ•ด๊ฒฐ

๐ŸŽจ UI ์ฝ”๋“œ ํ’ˆ์งˆ ๋Œ€ํญ ๊ฐœ์„ 

โœ… ๋งค์ง ๋„˜๋ฒ„ ์™„์ „ ์ œ๊ฑฐ

  • 524, 176, 492 ๋“ฑ ํ•˜๋“œ์ฝ”๋”ฉ ๊ฐ’๋“ค์„ ์˜๋ฏธ ์žˆ๋Š” ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌ
  • ๊ตฌ์กฐํ™”๋œ Layout enum์œผ๋กœ ์ฒด๊ณ„์  ๊ด€๋ฆฌ

๐Ÿ—๏ธ TCA ํŒจํ„ด ์™„๋ฒฝ ์ค€์ˆ˜

โœ… ์ƒ์ˆ˜ ๊ตฌ์กฐ ๊ฐœ์„ 

  • ๋ฌธ์ž์—ด ์ƒ์ˆ˜ โ†’ HomeFeature.Strings๋กœ ์ด๋™
  • Layout ์ƒ์ˆ˜ โ†’ ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ์žฌ์„ค๊ณ„
    • Layout.Hero: ํžˆ์–ด๋กœ ์„น์…˜
    • Layout.TimePicker: ์‹œ๊ฐ„ ์„ ํƒ๊ธฐ
    • Layout.TimeCapsule: ์‹œ๊ฐ„ ์บก์А
    • Layout.TimeDisplay: ์‹œ๊ฐ„ ํ‘œ์‹œ

๐Ÿ”’ ๋ณด์•ˆ ๊ฐ•ํ™”

โœ… ๋ฏผ๊ฐ ์ •๋ณด ๋กœ๊น… ๊ฐœ์„ 

  • ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ๋งŒ ํ† ํฐ ์ •๋ณด ์ถœ๋ ฅ
  • ํ”„๋กœ๋•์…˜์—์„œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ

๐Ÿ“Š ๊ฐœ์„  ๊ฒฐ๊ณผ

  • Critical ์ด์Šˆ: 100% ํ•ด๊ฒฐ โœ…
  • ์ฝ”๋“œ ํ’ˆ์งˆ: ๋Œ€ํญ ํ–ฅ์ƒ ๐Ÿ“ˆ
  • TCA ์ค€์ˆ˜: ์™„๋ฒฝ ์ ์šฉ ๐ŸŽฏ
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ: ํฌ๊ฒŒ ๊ฐœ์„  ๐Ÿ”ง

์ด์ œ ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€

๐Ÿ“ฆ ์ƒ์ˆ˜ ์žฌ๊ตฌ์„ฑ:
- ๋ฌธ์ž์—ด ์ƒ์ˆ˜๋ฅผ HomeFeature.Strings๋กœ ์ด๋™
- TCA Feature ๋ ˆ๋ฒจ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ž์—ด ๊ด€๋ฆฌ
- View ๋ ˆ๋ฒจ์—์„œ๋Š” Layout ์ƒ์ˆ˜๋งŒ ๊ด€๋ฆฌ

๐ŸŽจ Layout ์ƒ์ˆ˜ ๊ตฌ์กฐํ™”:
- Layout.Hero: ํžˆ์–ด๋กœ ์„น์…˜ ๊ด€๋ จ ์ƒ์ˆ˜
- Layout.TimePicker: ์‹œ๊ฐ„ ์„ ํƒ๊ธฐ ๊ด€๋ จ ์ƒ์ˆ˜
- Layout.TimeCapsule: ์‹œ๊ฐ„ ์บก์А ๊ด€๋ จ ์ƒ์ˆ˜
- Layout.TimeDisplay: ์‹œ๊ฐ„ ํ‘œ์‹œ ๊ด€๋ จ ์ƒ์ˆ˜

โœจ ๊ฐœ์„  ํšจ๊ณผ:
- ์˜๋ฏธ ์žˆ๋Š” ๋„ค์ด๋ฐ์œผ๋กœ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- TCA ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด ์ค€์ˆ˜
- ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ํ™•์žฅ์„ฑ ํ–ฅ์ƒ
@Roy-wonji Roy-wonji merged commit 3be71f2 into develop Mar 26, 2026
@Roy-wonji Roy-wonji deleted the feature/explore branch March 26, 2026 18:16
Roy-wonji added a commit that referenced this pull request Apr 2, 2026
๐Ÿ” ์ฝ”๋“œ ๋ฆฌ๋ทฐ: ์ค‘์š” ์ธ์ฆ ๋ฐ UI ๊ฐœ์„ ์‚ฌํ•ญ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant