Skip to content

[Refactor] 수정된 디자인 시스템 반영#45

Merged
choijungp merged 4 commits intodevelopfrom
refactor/design-system
Aug 9, 2025
Merged

[Refactor] 수정된 디자인 시스템 반영#45
choijungp merged 4 commits intodevelopfrom
refactor/design-system

Conversation

@choijungp
Copy link
Copy Markdown
Contributor

@choijungp choijungp commented Aug 9, 2025

🌁 Background

2차 UI 반영에 대하여 디자인 시스템 색상 값에 변경이 있었습니다.

👩‍💻 Contents

  • 사용하지 않는 Emotion Color 값 삭제
  • Orange Color 값 수정

📝 Review Note

  • LightBlue와 Navy, Gradient는 디자인 v2에서 사용하지 않지만 v1 UI는 해당 값들을 사용하고 있습니다.
  • UI 수정이 모두 반영된 후 삭제하겠습니다.

Summary by CodeRabbit

  • 버그 수정

    • 일부 오렌지 색상들의 색상 값이 조정되었습니다.
    • Gray7 색상의 RGB 값이 소폭 변경되었습니다.
  • 리팩터

    • 오렌지 계열 색상 정의가 정리 및 확장되었습니다.
    • 중복된 오렌지 색상 선언이 제거되었습니다.
    • 그라데이션 및 감정 관련 색상 정의가 파일 내에서 재배치되고, 감정 색상은 제거 예정으로 표시되었습니다.
    • 폰트 관련 구조가 개선되어 새로운 폰트 패밀리와 스타일이 추가되었습니다.
  • 기타

    • 감정(emotion) 관련 색상 리소스와 정의가 프로젝트에서 삭제되었습니다.
    • 새로운 커스텀 폰트 "Cafe24SsurroundAir-Light.otf"가 앱에 추가되었습니다.
    • 홈 화면의 타이틀 폰트가 새로운 폰트 패밀리와 스타일로 변경되었습니다.

@choijungp choijungp self-assigned this Aug 9, 2025
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Aug 9, 2025

Walkthrough

Emotion 관련 색상 리소스 파일들이 모두 삭제되었고, Orange 계열 색상 리소스들은 일부 색상 값이 변경되었습니다. 코드에서는 BitnagilColor enum 내에서 emotion 및 gradient 색상 선언이 재구성되고, orange 색상 상수가 새롭게 추가 및 정리되었습니다. 감정 색상은 완전히 제거되었으며, gradient 색상은 향후 제거 예정으로 표시되었습니다. 또한, 폰트 관련 코드에 FontFamily enum이 추가되고, BitnagilFont가 이를 활용하도록 변경되었으며, 새로운 폰트 스타일과 가중치가 추가되고, HomeView에서 새로운 폰트 패밀리를 사용하는 폰트가 적용되었습니다. Info.plist에는 새로운 폰트 파일이 등록되었습니다.

Changes

Cohort / File(s) Change Summary
Emotion 색상 리소스 삭제
Projects/Presentation/Resources/Colors.xcassets/Emotion/Contents.json, .../Emotion/EmotionAnxiety.colorset/Contents.json, .../Emotion/EmotionHappy.colorset/Contents.json, .../Emotion/EmotionLonely.colorset/Contents.json, .../Emotion/EmotionSad.colorset/Contents.json
Emotion 관련 색상 리소스 및 메타데이터 파일 전체 삭제.
Orange 색상 리소스 값 변경
.../Orange/Orange25.colorset/Contents.json, .../Orange/Orange50.colorset/Contents.json, .../Orange/Orange100.colorset/Contents.json, .../Orange/Orange200.colorset/Contents.json, .../Orange/Orange300.colorset/Contents.json, .../Orange/Orange400.colorset/Contents.json, .../Orange/Orange500.colorset/Contents.json, .../Orange/Orange600.colorset/Contents.json, .../Orange/Orange700.colorset/Contents.json, .../Orange/Orange800.colorset/Contents.json, .../Orange/Orange900.colorset/Contents.json
Orange 계열 색상 리소스의 RGB 값 일부 변경.
Gray 색상 리소스 값 변경
.../Gray/Gray7.colorset/Contents.json
Gray7 색상 리소스의 RGB 값 변경.
BitnagilColor enum 재구성 및 정리
Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift
감정 및 gradient 색상 선언 위치 이동 및 일부 제거, orange 색상 상수 추가 및 정리, 중복 orange 색상 선언 제거.
FontFamily enum 추가 및 BitnagilFont 수정
Projects/Presentation/Sources/Common/DesignSystem/Font/FontFamily.swift, .../BitnagilFont.swift
FontFamily enum 추가, BitnagilFont에 family 프로퍼티 추가 및 초기화자 변경, font 생성 방식 수정.
FontStyle enum 확장
Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift
새로운 폰트 스타일 cafe24Title1 추가 및 fontAttributes 업데이트.
FontWeight enum 확장
Projects/Presentation/Sources/Common/DesignSystem/Font/FontWeight.swift
light 케이스 추가, 기존 fontName 프로퍼티 이름 변경 및 cafe24FontName 프로퍼티 추가.
HomeView 폰트 변경
Projects/Presentation/Sources/Home/View/HomeView.swift
homeLabel 폰트 초기화에 새로운 FontFamily, FontStyle, FontWeight 사용하도록 변경.
Info.plist 폰트 등록
SupportingFiles/Info.plist
새로운 폰트 파일 Cafe24SsurroundAir-Light.otf 등록.

Sequence Diagram(s)

sequenceDiagram
    participant HomeView
    participant BitnagilFont
    participant FontFamily

    HomeView->>BitnagilFont: BitnagilFont(family: .cafe24Ssurround, style: .cafe24Title1, weight: .light)
    BitnagilFont->>FontFamily: fontName(weight: .light)
    FontFamily-->>BitnagilFont: "Cafe24SsurroundairOTF"
    BitnagilFont-->>HomeView: UIFont 생성 및 반환
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🥕
감정 색상은 사라지고, 오렌지 빛만 남았네!
폰트도 새 옷 입고, 스타일도 한껏 멋내고,
토끼는 팔레트 정리하며, 코드 속을 뛰어다니네.
새 폰트와 색상으로, 화면이 반짝반짝,
모두 함께 환호해요, 변화의 봄날이 왔어요!
🐇✨🎨

Note

🔌 MCP (Model Context Protocol) integration is now available in Early Access!

Pro users can now connect to remote MCP servers under the Integrations page to get reviews and chat conversations that understand additional development context.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/design-system

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary or @coderabbitai 요약 to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4c3d643 and d77c55b.

📒 Files selected for processing (18)
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/Contents.json (0 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionAnxiety.colorset/Contents.json (0 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionHappy.colorset/Contents.json (0 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionLonely.colorset/Contents.json (0 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionSad.colorset/Contents.json (0 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Gray/Gray7.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange100.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange200.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange25.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange300.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange400.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange50.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange500.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange600.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange700.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange800.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange900.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift (1 hunks)
💤 Files with no reviewable changes (5)
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionSad.colorset/Contents.json
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/Contents.json
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionHappy.colorset/Contents.json
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionLonely.colorset/Contents.json
  • Projects/Presentation/Resources/Colors.xcassets/Emotion/EmotionAnxiety.colorset/Contents.json
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#30
File: Projects/DataSource/Sources/NetworkService/Plugin/RefreshTokenPlugin.swift:42-43
Timestamp: 2025-07-30T03:56:18.617Z
Learning: choijungp는 현재 테스트 단계에서 RefreshTokenPlugin의 토큰 갱신 로직 디버깅을 위해 액세스 토큰과 리프레시 토큰의 실제 값을 로그에 기록하는 것을 선호함.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift:0-0
Timestamp: 2025-07-16T10:57:16.559Z
Learning: choijungp는 추후 CustomAlertView를 만들어서 에러 처리를 UI로 해결하도록 수정할 계획을 가지고 있음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift:0-0
Timestamp: 2025-07-16T10:58:30.858Z
Learning: choijungp는 OnboardingUseCase의 convertToDictionary 함수에서 에러 처리 개선을 추후 고민하고 반영할 계획을 가지고 있음.
🪛 SwiftLint (0.57.0)
Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift

[Warning] 49-49: TODOs should be resolved (제거될 색상들)

(todo)

🔇 Additional comments (11)
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange900.colorset/Contents.json (1)

8-11: Orange900 블루 값 변경(0x0D) 스펙 일치 여부 확인 요청

디자인 시스템 v2 최신 스펙과 정확히 일치하는 값인지 최종 확인 부탁드립니다. 특히 텍스트/아이콘 등 접근성 민감 영역에서 대비 저하가 없는지 스냅샷/시각 회귀 테스트 갱신 여부도 점검해 주세요.

Projects/Presentation/Resources/Colors.xcassets/Orange/Orange50.colorset/Contents.json (1)

8-11: Orange50 블루 값(0xE9) 반영 확인 및 Emotion 색상 자산/코드 잔존 참조 점검 스크립트

Contents.json의 blue 값이 0xE9로 정상 반영된 것을 확인했습니다. 제거된 Emotion 계열 색상(.colorset) 파일이나 코드 내 참조가 남아있지 않은지 아래 스크립트를 실행해 점검해주세요. 에러 없이 통과되면 별도 추가 수정은 필요 없습니다.

#!/bin/bash
set -euo pipefail

echo "== Emotion 색상 자산(.colorset) 잔존 체크 =="
find Projects/Presentation/Resources/Colors.xcassets -type d -name "Emotion*.colorset" || echo "— 없음"

echo
echo "== 코드 내 Emotion 색상 자산 참조 체크 =="
rg -n --glob '!*Pods*' 'UIColor\(named: "Emotion' || echo "— 없음"

echo
echo "== Gradient 색상 사용 위치 파악 =="
rg -n --glob '!*Pods*' -e 'Gradient[A-Z][A-Za-z0-9_]+' || echo "— 없음"

echo
echo "== BitnagilColor.swift 오렌지 토큰 정의 확인 =="
rg -n 'orange(25|50|100|200|300|400|500|600|700|800|900)' Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift
  • Emotion 색상 자산 및 코드 참조가 모두 제거되어 있으면 “— 없음”만 출력됩니다.
  • Gradient 색상은 향후 제거 예정이므로 실제 사용 위치 확인 용도로만 활용하세요.
  • BitnagilColor.swift에 orange25~orange900 토큰 정의가 모두 존재함을 재확인했습니다.
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange200.colorset/Contents.json (1)

8-11: Orange200 채널 조정(G: 0xBE, B: 0x98) 톤 계열 일관성 확인

오렌지 스케일(25→900)에서 채도/명도 진행이 의도대로 단조롭게 유지되는지(톤 점프/불연속성 여부) 한번에 비교 검토 부탁드립니다. 특히 배경·보더 단계로 사용하는 구간에서 인접 단계 대비가 충분한지 확인해 주세요.

Projects/Presentation/Resources/Colors.xcassets/Orange/Orange25.colorset/Contents.json (1)

8-11: Orange25 채널 조정(G: 0xEE, B: 0xE4) 라이트 테마 배경 가독성 점검

가장 옅은 톤 특성상 라이트 테마 배경/배지 사용 시 텍스트 대비가 임계치에 근접할 수 있습니다. 사용 컴포넌트들(배경+텍스트/아이콘)의 대비 기준(WCAG AA) 충족 여부를 화면 단위로 확인해 주세요.

Projects/Presentation/Resources/Colors.xcassets/Gray/Gray7.colorset/Contents.json (1)

8-11: Gray7 값 상향(R/G: 0x14, B: 0x15)로 인한 중립 그레이 램프 단조성 검증

Gray 계열 단계 전반(예: Gray6/7/8)이 시각적으로 단조 증가(또는 감소) 관계를 유지하는지 확인해 주세요. 테두리/구분선 용도에서 인접 단계와의 대비가 약화되지 않았는지도 함께 점검을 권장합니다.

Projects/Presentation/Resources/Colors.xcassets/Orange/Orange800.colorset/Contents.json (1)

8-10: Orange800 색상 에셋-코드 동기화 확인 및 다크 모드 변형 검증 요청

  • UIColor(named: "Orange800", in: bundle, compatibleWith: nil) 레퍼런스가 코드에 존재해 에셋/토큰 동기화가 완료되었습니다.
  • sRGB/8-bit hex 포맷이 기존 스타일과 일치합니다.
  • v2 디자인 가이드에서 다크 모드 변형(appearances) 없이 단일값만 사용을 요구하는지, 혹은 별도 다크 모드용 색상이 필요한지 확인해 주세요.
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange100.colorset/Contents.json (1)

8-10: 포맷 일관성 확인 완료

  • Colors.xcassets 내 모든 Contents.json에서 alpha가 소수(예: "1.000")로만 표기되어 있어 이미 일관성이 유지되고 있습니다.
  • 팀 컨벤션에 부합하므로 추가 변경 없이 그대로 두시면 됩니다.
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange400.colorset/Contents.json (1)

8-11: SwiftGen 토큰 재생성 및 빌드 캐시 정리 후 런타임 검증 필요

  • Orange400 색상값(FF→FE→FE) 미세 조정이 정상 반영되었습니다.
  • swiftgen.yml 설정 파일이 존재함을 확인했습니다.
  • 아래 작업을 수행한 뒤, 런타임에서 UIColor(named: "Orange400") 참조가 올바른지 꼭 확인해주세요:
    • SwiftGen 스키마/토큰 재생성 (swiftgen 실행)
    • Xcode Clean & DerivedData 삭제
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange700.colorset/Contents.json (1)

8-10: Orange700 색상 업데이트 확인 (HEX: #B45017)

sRGB/alpha 유지한 채 RGB만 조정된 점 확인했습니다. 디자인 시스템 v2 스펙과 일치하는지만 최종 확인해 주세요. 런타임 영향은 없겠습니다.

Projects/Presentation/Resources/Colors.xcassets/Orange/Orange300.colorset/Contents.json (1)

8-10: Orange300 색상 업데이트 확인 완료

모든 Orange 계열 색상셋에서 color-space=srgb, alpha=1.000, appearances 없음이 검증되었습니다.

  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange{25,50,100,200,300,400,500,600,700,800,900}.colorset/Contents.json: 일관된 sRGB/alpha

다크모드 변형을 따로 사용하지 않는 한, 현 구성 유지로 충분합니다.

Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift (1)

36-47: 오렌지 팔레트(25~900) 정리 및 일관성 확보 LGTM
코드 내 static let orangeXXX = UIColor(named: "OrangeXXX", …) 으로 선언된 이름이 실제 Asset Catalog의 “Orange25”~“Orange900” Colorset 이름과 일치하는지 수동으로 한번만 최종 확인해주세요.

Comment on lines +8 to 11
"blue" : "0x20",
"green" : "0x71",
"red" : "0xFE"
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

브랜드 핵심 톤(Orange500) 접근성 대비 확인 권장

  • 값 자체는 문제 없고 변경 취지에도 부합해 보입니다.
  • 텍스트/아이콘 포그라운드 또는 배경으로 사용 시 WCAG 대비(AA/AAA) 충족 여부를 확인해 주세요.

아래 스크립트로 #FE7120과 흰/검 텍스트 대비비를 계산할 수 있습니다:

결과가 본문 텍스트(AA: 4.5:1, 대형 텍스트: 3:1) 기준을 만족하는지 확인해 주세요.


🏁 Script executed:

#!/bin/bash
python - << 'PY'
# 계산 대상: #FE7120
import math

def hex_to_rgb(hexstr):
    hexstr = hexstr.lstrip('#')
    return tuple(int(hexstr[i:i+2], 16) for i in (0, 2, 4))

def lin(c):  # sRGB to linear
    c = c/255.0
    return c/12.92 if c <= 0.04045 else ((c+0.055)/1.055)**2.4

def rel_lum(rgb):
    r,g,b = (lin(c) for c in rgb)
    return 0.2126*r + 0.7152*g + 0.0722*b

def contrast(fg, bg):
    L1, L2 = sorted([rel_lum(fg), rel_lum(bg)], reverse=True)
    return (L1 + 0.05) / (L2 + 0.05)

orange = hex_to_rgb("#FE7120")
white = (255,255,255)
black = (0,0,0)

print("Contrast vs WHITE:", round(contrast(orange, white), 2))
print("Contrast vs BLACK:", round(contrast(orange, black), 2))
PY

Length of output: 57


Orange500 접근성 대비 결과 확인 및 개선 필요

검증 스크립트 실행 결과:

  • 흰색 텍스트 대비: 2.76:1 (WCAG AA 기준 4.5:1 미충족)
  • 검정색 텍스트 대비: 7.6:1 (WCAG AAA 기준 7:1 충족)

따라서 Orange500(#FE7120)을 전경(텍스트/아이콘) 또는 배경으로 사용할 때 다음을 반영해 주세요:

  • 흰색 텍스트 사용 시 대비 기준을 충족하지 못하므로,
    • 백그라운드 컬러를 어둡게 조정하거나
    • 대체 컬러 사용 검토
  • 검정색 텍스트 사용 시 적합(AA/AAA 모두 충족)

수정 위치:

  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange500.colorset/Contents.json (Lines 8–11)
🤖 Prompt for AI Agents
In
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange500.colorset/Contents.json
around lines 8 to 11, the current Orange500 color (#FE7120) does not meet WCAG
AA contrast ratio of 4.5:1 against white text. To fix this, adjust the RGB
values to darken the orange shade so that white text contrast ratio meets or
exceeds 4.5:1, or consider replacing Orange500 with an alternative color that
satisfies this contrast requirement for white text usage.

Comment on lines +49 to +55
// TODO: 제거될 색상들
// MARK: - Gradient
static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil)
static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil)
static let homeGradientLeft = UIColor(named: "HomeGradientLeft", in: bundle, compatibleWith: nil)
static let homeGradientRight = UIColor(named: "HomeGradientRight", in: bundle, compatibleWith: nil)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

TODO 경고 제거 및 단계적 제거를 위한 @available(deprecated) 적용 권고

SwiftLint TODO 경고가 발생합니다. 주석을 Deprecated 표기로 바꾸고 각 상수에 deprecate 어노테이션을 부여하면 마이그레이션 추적과 사용 억제가 좋아집니다.

아래 diff 제안:

-    // TODO: 제거될 색상들
-    // MARK: - Gradient
-    static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil)
-    static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil)
-    static let homeGradientLeft = UIColor(named: "HomeGradientLeft", in: bundle, compatibleWith: nil)
-    static let homeGradientRight = UIColor(named: "HomeGradientRight", in: bundle, compatibleWith: nil)
+    // MARK: - Deprecated: 제거 예정 색상들 (v1 전용)
+    // MARK: - Gradient
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil)
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil)
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let homeGradientLeft = UIColor(named: "HomeGradientLeft", in: bundle, compatibleWith: nil)
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let homeGradientRight = UIColor(named: "HomeGradientRight", in: bundle, compatibleWith: nil)

현재 사용처 파악을 위해 간단 스캔 스크립트도 첨부합니다.


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Deprecated(Gradient) 사용처 스캔 =="
rg -n 'BitnagilColor\.(gradientLeft|gradientRight|homeGradientLeft|homeGradientRight)\b' -S || echo "사용처 없음(또는 스캔 결과 없음)"

Length of output: 787


@available(deprecated) 적용 권고 및 사용처 안내

아래 색상 상수에 @available(*, deprecated…) 어노테이션을 추가하면 SwiftLint TODO 경고가 사라지고, 사용 시 경고를 통해 단계적 제거를 관리할 수 있습니다.

— 사용처 스캔 결과

  • Projects/Presentation/Sources/Onboarding/View/Component/GradientProgressView.swift:26–27
  • Projects/Presentation/Sources/Home/View/HomeView.swift:394–395

아래와 같이 변경해 주세요:

-    // TODO: 제거될 색상들
-    // MARK: - Gradient
-    static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil)
-    static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil)
-    static let homeGradientLeft = UIColor(named: "HomeGradientLeft", in: bundle, compatibleWith: nil)
-    static let homeGradientRight = UIColor(named: "HomeGradientRight", in: bundle, compatibleWith: nil)
+    // MARK: - Deprecated: 제거 예정 색상들 (v1 전용)
+    // MARK: - Gradient
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil)
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil)
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let homeGradientLeft = UIColor(named: "HomeGradientLeft", in: bundle, compatibleWith: nil)
+    @available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
+    static let homeGradientRight = UIColor(named: "HomeGradientRight", in: bundle, compatibleWith: nil)

이 변경 후 사용 위치에서 deprecation 경고를 확인하며 새로운 색상으로 교체를 진행해 주세요.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// TODO: 제거될 색상들
// MARK: - Gradient
static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil)
static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil)
static let homeGradientLeft = UIColor(named: "HomeGradientLeft", in: bundle, compatibleWith: nil)
static let homeGradientRight = UIColor(named: "HomeGradientRight", in: bundle, compatibleWith: nil)
// MARK: - Deprecated: 제거 예정 색상들 (v1 전용)
// MARK: - Gradient
@available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil)
@available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil)
@available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
static let homeGradientLeft = UIColor(named: "HomeGradientLeft", in: bundle, compatibleWith: nil)
@available(*, deprecated, message: "v1 전용. v2 전체 UI 적용 후 제거 예정")
static let homeGradientRight = UIColor(named: "HomeGradientRight", in: bundle, compatibleWith: nil)
🧰 Tools
🪛 SwiftLint (0.57.0)

[Warning] 49-49: TODOs should be resolved (제거될 색상들)

(todo)

🤖 Prompt for AI Agents
In Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift around
lines 49 to 55, the color constants marked for removal should be annotated with
@available(*, deprecated, message: "Use new color constants instead") to
suppress SwiftLint TODO warnings and enable deprecation warnings during usage.
Add this annotation above each deprecated color constant declaration. After
this, check the usage locations in GradientProgressView.swift lines 26-27 and
HomeView.swift lines 394-395 to replace deprecated colors with new ones while
monitoring deprecation warnings.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange25.colorset/Contents.json (1)

8-9: Orange25 검증 결과 요약 및 추가 확인 요청

  • Orange25.colorset 자산이 존재하며
    BitnagilColor.swift
    static let orange25 = UIColor(named: "Orange25", …) 매핑도 정확합니다.
  • ✅ 코드 전반(UIKit/SwiftUI)에서 "Orange25" 호출 사용처가 일치합니다.
  • ⚠️ 다크 모드 전용 appearance가 없으므로, 디자인 시스템 상 라이트·다크 동일 색상 의도가 맞는지 확인 부탁드립니다.
  • ⚠️ 다른 Orange 팔레트(예: Orange5, Orange10 …)의 채널 표기(16진 vs 실수) 일관성은 자동 검출이 어려워 수동 점검이 필요합니다.

추가로, 위 두 가지(다크 모드 의도 확인 및 채널 표기 일관성)는 디자인·개발 팀 간 협의를 통해 최종 확정해 주시면 됩니다.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d77c55b and afc18c2.

📒 Files selected for processing (2)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange25.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Orange/Orange50.colorset/Contents.json (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#30
File: Projects/DataSource/Sources/NetworkService/Plugin/RefreshTokenPlugin.swift:42-43
Timestamp: 2025-07-30T03:56:18.617Z
Learning: choijungp는 현재 테스트 단계에서 RefreshTokenPlugin의 토큰 갱신 로직 디버깅을 위해 액세스 토큰과 리프레시 토큰의 실제 값을 로그에 기록하는 것을 선호함.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift:0-0
Timestamp: 2025-07-16T10:57:16.559Z
Learning: choijungp는 추후 CustomAlertView를 만들어서 에러 처리를 UI로 해결하도록 수정할 계획을 가지고 있음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift:0-0
Timestamp: 2025-07-16T10:58:30.858Z
Learning: choijungp는 OnboardingUseCase의 convertToDictionary 함수에서 에러 처리 개선을 추후 고민하고 반영할 계획을 가지고 있음.
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (1)
Projects/Presentation/Resources/Colors.xcassets/Orange/Orange50.colorset/Contents.json (1)

8-9: Orange 팔레트 전체 일관성 검증 완료 – 변경 LGTM

  • *.colorset/Contents.json(Orange25~900) 모두 color-space=srgb, alpha=1.000, RGB=0xNN 포맷 일관 확인
  • 최상위 Projects/Presentation/Resources/Colors.xcassets/Orange/Contents.json(asset 카탈로그 메타) 구조가 달라 검증 대상에서 제외해도 무방

위 내용으로 모든 Orange 색상 세트의 형식과 값 일관성이 확보되었습니다.

@choijungp choijungp requested a review from taipaise August 9, 2025 09:30
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (2)
Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift (1)

55-56: FontStyle에 패밀리-특화 케이스 도입은 결합도를 높입니다

스타일은 보통 의미/용도(Title, Body 등) 기준으로 유지하고, 패밀리 차이는 FontFamily/Weight로 분리하는 편이 관리가 쉽습니다. 대안:

  • .custom(fontAttribute:) 사용으로 가족별 수치 차이를 주입
  • 또는 Cafe24 전용 스타일이 더 늘어날 예정이면, 별도 네임스페이스(예: Cafe24Style)로 분리
Projects/Presentation/Sources/Common/DesignSystem/Font/BitnagilFont.swift (1)

50-66: 강제 lineHeight 사용 시 baselineOffset 보정 권장

lineHeight가 폰트 고유 lineHeight와 다르면 수직 정렬이 어긋날 수 있습니다. baselineOffset으로 보정하세요.

 let paragraphStyle = NSMutableParagraphStyle()
 paragraphStyle.maximumLineHeight = style.fontAttributes.lineHeight
 paragraphStyle.minimumLineHeight = style.fontAttributes.lineHeight

 var attributes:  [NSAttributedString.Key: Any] = [
     .font: font,
     .paragraphStyle: paragraphStyle,
     .kern: style.fontAttributes.letterSpacing]
+// 수직 정렬 보정
+let baselineOffset = (style.fontAttributes.lineHeight - font.lineHeight) / 2
+attributes[.baselineOffset] = baselineOffset
 if style.fontAttributes.underline {
     attributes[.underlineStyle] = NSUnderlineStyle.single.rawValue
 }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between afc18c2 and 3e6281a.

⛔ Files ignored due to path filters (1)
  • Projects/App/Resources/Font/Cafe24SsurroundAir-Light.otf is excluded by !**/*.otf
📒 Files selected for processing (6)
  • Projects/Presentation/Sources/Common/DesignSystem/Font/BitnagilFont.swift (1 hunks)
  • Projects/Presentation/Sources/Common/DesignSystem/Font/FontFamily.swift (1 hunks)
  • Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift (2 hunks)
  • Projects/Presentation/Sources/Common/DesignSystem/Font/FontWeight.swift (1 hunks)
  • Projects/Presentation/Sources/Home/View/HomeView.swift (1 hunks)
  • SupportingFiles/Info.plist (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • SupportingFiles/Info.plist
  • Projects/Presentation/Sources/Home/View/HomeView.swift
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#30
File: Projects/DataSource/Sources/NetworkService/Plugin/RefreshTokenPlugin.swift:42-43
Timestamp: 2025-07-30T03:56:18.617Z
Learning: choijungp는 현재 테스트 단계에서 RefreshTokenPlugin의 토큰 갱신 로직 디버깅을 위해 액세스 토큰과 리프레시 토큰의 실제 값을 로그에 기록하는 것을 선호함.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift:0-0
Timestamp: 2025-07-16T10:57:16.559Z
Learning: choijungp는 추후 CustomAlertView를 만들어서 에러 처리를 UI로 해결하도록 수정할 계획을 가지고 있음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift:0-0
Timestamp: 2025-07-16T10:58:30.858Z
Learning: choijungp는 OnboardingUseCase의 convertToDictionary 함수에서 에러 처리 개선을 추후 고민하고 반영할 계획을 가지고 있음.
🧬 Code Graph Analysis (1)
Projects/Presentation/Sources/Common/DesignSystem/Font/BitnagilFont.swift (1)
Projects/Presentation/Sources/Common/DesignSystem/Font/FontFamily.swift (1)
  • fontName (12-19)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (6)
Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift (1)

28-29: 새 스타일 추가 적절합니다

cafe24Title1(24/36, -0.5)은 타이틀 스케일과 일관되고 홈 화면 적용 의도와도 맞습니다. LGTM.

Projects/Presentation/Sources/Common/DesignSystem/Font/FontWeight.swift (2)

13-13: .light 추가는 필요했고 깔끔합니다

패밀리 확장 대비에도 좋은 방향입니다.


25-30: Cafe24 폰트 PS 이름 검증 및 미지원 weight 보호 로직 추가 권장

현재 cafe24FontName에 사용된 "Cafe24SsurroundairOTF"가 실제 PostScript(PS) 이름과 일치하지 않을 가능성이 있어, UIFont(name:size:) 호출 시 nil이 반환되고 시스템 폰트로 조용히 폴백될 수 있습니다. 또한 현재 프로젝트에서는 .light weight만 사용 중이므로, 다른 weight 요청 시 명시적 assertion과 안전한 폴백 처리가 필요합니다.

수정 예시:

var cafe24FontName: String {
    switch self {
    case .light:
        // 실제 PS 이름 확인 후 수정 필요 (예: "Cafe24SsurroundAir-Light")
        return "Cafe24SsurroundAir-Light"
    default:
        assertionFailure("[Font] Cafe24Ssurround는 .light만 지원합니다. Pretendard-Regular로 폴백합니다.")
        return "Pretendard-Regular"
    }
}

검토 및 반영 가이드:

  • 런타임에서 UIFont.familyNamesUIFont.fontNames(forFamilyName:) 출력값을 통해 실제 PS 이름을 확인해주세요.
  • 다른 weight가 호출될 가능성이 있는 모든 경로에 대해 assertion 및 폴백 로직이 적용되었는지 점검해 주세요.
Projects/Presentation/Sources/Common/DesignSystem/Font/FontFamily.swift (1)

8-11: 다중 패밀리 지원을 enum으로 분리한 점 좋습니다

FontFamily 도입으로 해상도가 높아졌고, 호출부도 명확해졌습니다. LGTM.

Projects/Presentation/Sources/Common/DesignSystem/Font/BitnagilFont.swift (2)

15-23: 생성자에 family 기본값 도입은 호환성과 사용성에 이점이 큽니다

기존 호출부가 그대로 동작하고, 새 패밀리 도입도 간결해졌습니다. LGTM.


25-41: 두 번째 생성자에도 family 추가 일관성 좋습니다

커스텀 수치 기반 초기화에서도 동일하게 적용되어 API 일관성이 유지됩니다.

Comment on lines 43 to +46
var font: UIFont {
guard let font = UIFont(name: weight.fontName, size: style.fontAttributes.fontSize) else {
return UIFont.systemFont(ofSize: style.fontAttributes.fontSize)
}
guard let font = UIFont(name: family.fontName(weight: weight), size: style.fontAttributes.fontSize)
else { return UIFont.systemFont(ofSize: style.fontAttributes.fontSize) }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Verification agent

❓ Verification inconclusive

폰트 로드 실패 시 조용한 폴백을 피하기 위한 ASSERT 추가 권장

잘못된 PS 이름/미등록 시, 현재는 시스템 폰트로 조용히 대체됩니다. DEBUG에서만이라도 실패를 감지하면 빠르게 수정 가능합니다.

-guard let font = UIFont(name: family.fontName(weight: weight), size: style.fontAttributes.fontSize)
-else { return UIFont.systemFont(ofSize: style.fontAttributes.fontSize) }
+guard let font = UIFont(name: family.fontName(weight: weight), size: style.fontAttributes.fontSize) else {
+    #if DEBUG
+    assertionFailure("[Font] \(family).\(weight) 폰트 로드 실패. 시스템 폰트로 대체됩니다.")
+    #endif
+    return UIFont.systemFont(ofSize: style.fontAttributes.fontSize)
+}

DEBUG 모드에서 폰트 로드 실패 시 경고(assertion) 추가 권장

현재 PS 폰트 이름이 잘못되었거나 등록되지 않은 경우 시스템 폰트로 조용히 대체되므로, 디버그 환경에서 빠르게 문제를 인지할 수 있도록 assertionFailure를 추가해 주세요.

  • 대상 파일: Projects/Presentation/Sources/Common/DesignSystem/Font/BitnagilFont.swift
  • 대상 위치: 43–46줄
-   guard let font = UIFont(name: family.fontName(weight: weight), size: style.fontAttributes.fontSize)
-   else { return UIFont.systemFont(ofSize: style.fontAttributes.fontSize) }
+   guard let font = UIFont(name: family.fontName(weight: weight), size: style.fontAttributes.fontSize) else {
+       #if DEBUG
+       assertionFailure("[Font] \(family).\(weight) 폰트 로드 실패. 시스템 폰트로 대체됩니다.")
+       #endif
+       return UIFont.systemFont(ofSize: style.fontAttributes.fontSize)
+   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
var font: UIFont {
guard let font = UIFont(name: weight.fontName, size: style.fontAttributes.fontSize) else {
return UIFont.systemFont(ofSize: style.fontAttributes.fontSize)
}
guard let font = UIFont(name: family.fontName(weight: weight), size: style.fontAttributes.fontSize)
else { return UIFont.systemFont(ofSize: style.fontAttributes.fontSize) }
var font: UIFont {
guard let font = UIFont(
name: family.fontName(weight: weight),
size: style.fontAttributes.fontSize
) else {
#if DEBUG
assertionFailure("[Font] \(family).\(weight) 폰트 로드 실패. 시스템 폰트로 대체됩니다.")
#endif
return UIFont.systemFont(ofSize: style.fontAttributes.fontSize)
}
return font
}
🤖 Prompt for AI Agents
In Projects/Presentation/Sources/Common/DesignSystem/Font/BitnagilFont.swift
around lines 43 to 46, add an assertionFailure call inside the guard else block
that handles the font loading failure. This assertionFailure should trigger in
debug mode to warn developers when the custom font fails to load, while still
returning the system font as fallback. This will help quickly identify font
registration or naming issues during development.

Comment on lines +12 to +19
func fontName(weight: FontWeight) -> String {
switch self {
case .pretendard:
return weight.pretendardFontName
case .cafe24Ssurround:
return weight.cafe24FontName
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

패밀리별 지원 weight 검증(ASSERT) 추가 권장

cafe24Ssurround는 현재 .light만 유효하다면, 여기서도 방어 로직을 두면 오용을 빠르게 발견할 수 있습니다. (실행환경에서 시스템 폰트로 조용히 폴백되는 것을 방지)

가능한 수정 예:

 case .cafe24Ssurround:
-    return weight.cafe24FontName
+    if case .light = weight {
+        return weight.cafe24FontName
+    } else {
+        assertionFailure("[Font] Cafe24Ssurround는 현재 .light만 지원합니다. Pretendard-Regular로 폴백합니다.")
+        return FontFamily.pretendard.fontName(weight: .regular)
+    }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
func fontName(weight: FontWeight) -> String {
switch self {
case .pretendard:
return weight.pretendardFontName
case .cafe24Ssurround:
return weight.cafe24FontName
}
}
func fontName(weight: FontWeight) -> String {
switch self {
case .pretendard:
return weight.pretendardFontName
case .cafe24Ssurround:
if case .light = weight {
return weight.cafe24FontName
} else {
assertionFailure("[Font] Cafe24Ssurround는 현재 .light만 지원합니다. Pretendard-Regular로 폴백합니다.")
return FontFamily.pretendard.fontName(weight: .regular)
}
}
}
🤖 Prompt for AI Agents
In Projects/Presentation/Sources/Common/DesignSystem/Font/FontFamily.swift
around lines 12 to 19, add assertion checks in the fontName(weight:) method to
verify that the provided weight is supported by each font family. For example,
assert that only .light weight is used for cafe24Ssurround to prevent silent
fallback to system fonts. Implement these assertions inside each case before
returning the font name to catch misuse early during development.

Comment on lines +15 to +23
var pretendardFontName: String {
switch self {
case .bold: "Pretendard-Bold"
case .semiBold: "Pretendard-SemiBold"
case .medium: "Pretendard-Medium"
case .regular: "Pretendard-Regular"
default: "Pretendard-Medium"
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

pretendardFontName에서 default 제거하세요 (침묵 폴백 방지)

default는 새 케이스 추가 시 컴파일 타임 검증을 우회해 버그를 숨깁니다. .light를 명시하고 default를 제거하세요. Pretendard에 Light가 없다면 Regular로 폴백하는 분기 또는 assertion을 별도로 두는 편이 낫습니다.

아래 제안을 적용한 뒤, 실제 프로젝트에 Pretendard-Light가 포함되어 있는지 확인이 필요합니다.

 var pretendardFontName: String {
     switch self {
     case .bold: "Pretendard-Bold"
     case .semiBold: "Pretendard-SemiBold"
     case .medium: "Pretendard-Medium"
     case .regular: "Pretendard-Regular"
-    default: "Pretendard-Medium"
+    case .light: "Pretendard-Light"
     }
 }

런타임에서 PS(PostScript) 이름을 확인하려면(디바이스/시뮬레이터, DEBUG 빌드) 다음 코드를 잠시 추가해 확인해주세요:

// 앱 시작 시 한 번만 호출
UIFont.familyNames.sorted().forEach { family in
    let names = UIFont.fontNames(forFamilyName: family).sorted()
    print("[Font] \(family): \(names)")
}

[Pretendard-Light 폰트 포함 여부 확인 스크립트 실행]
다음 스크립트를 통해 저장소 내 Pretendard-Light 문자열과 파일(.ttf/.otf) 존재 여부를 확인해주세요:

위 결과를 바탕으로 .light 케이스를 추가할지, Regular 폴백 또는 assertion 처리할지 결정할 수 있습니다.


🏁 Script executed:

#!/bin/bash
echo "▶ ‘Pretendard-Light’ 키워드 검색:"
rg -i "Pretendard-Light" || echo "— 키워드 매칭 없음"
echo
echo "▶ Pretendard-Light 폰트 파일(.ttf, .otf) 검색:"
find . -type f \( -iname "*Pretendard-Light*.ttf" -o -iname "*Pretendard-Light*.otf" \) || echo "— 파일 없음"

Length of output: 315


pretendardFontName: default 제거 및 .light 명시적 매핑 추가

.light 폰트 파일이 포함되어 있지 않으므로 Regular로 폴백하거나 assertion 처리하는 편이 낫습니다. 아래와 같이 수정해주세요.

  • 파일: Projects/Presentation/Sources/Common/DesignSystem/Font/FontWeight.swift
  • 위치: pretendardFontName computed property
 var pretendardFontName: String {
     switch self {
     case .bold:      "Pretendard-Bold"
     case .semiBold:  "Pretendard-SemiBold"
     case .medium:    "Pretendard-Medium"
     case .regular:   "Pretendard-Regular"
-    // 기존 default 제거
-    default:        "Pretendard-Medium"
+    // Light에 해당하는 폰트가 없으므로 Regular로 폴백
+    case .light:    "Pretendard-Regular"
+    // 새 케이스 추가 시 컴파일 오류 발생 & 디버깅 용이
+    @unknown default:
+        fatalError("Unknown FontWeight: \(self)")
     }
 }

이렇게 하면

  1. switch에 새 케이스가 추가되면 컴파일 단계에서 누락을 확인할 수 있고
  2. .light는 명시적으로 Regular로 폴백합니다.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
var pretendardFontName: String {
switch self {
case .bold: "Pretendard-Bold"
case .semiBold: "Pretendard-SemiBold"
case .medium: "Pretendard-Medium"
case .regular: "Pretendard-Regular"
default: "Pretendard-Medium"
}
}
var pretendardFontName: String {
switch self {
case .bold: "Pretendard-Bold"
case .semiBold: "Pretendard-SemiBold"
case .medium: "Pretendard-Medium"
case .regular: "Pretendard-Regular"
// Light에 해당하는 폰트가 없으므로 Regular로 폴백
case .light: "Pretendard-Regular"
// 새 케이스 추가 시 컴파일 오류 발생 & 디버깅 용이
@unknown default:
fatalError("Unknown FontWeight: \(self)")
}
}
🤖 Prompt for AI Agents
In Projects/Presentation/Sources/Common/DesignSystem/Font/FontWeight.swift
around lines 15 to 23, the pretendardFontName computed property uses a default
case and lacks explicit handling for the .light case. Remove the default case to
enable compiler checks for missing enum cases, and add an explicit case for
.light that returns "Pretendard-Regular" to handle the missing font file
scenario properly.

@choijungp choijungp merged commit 7d6aa29 into develop Aug 9, 2025
2 checks passed
@choijungp choijungp deleted the refactor/design-system branch August 9, 2025 14:44
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