Conversation
WalkthroughEmotion 관련 색상 리소스 파일들이 모두 삭제되었고, Orange 계열 색상 리소스들은 일부 색상 값이 변경되었습니다. 코드에서는 BitnagilColor enum 내에서 emotion 및 gradient 색상 선언이 재구성되고, orange 색상 상수가 새롭게 추가 및 정리되었습니다. 감정 색상은 완전히 제거되었으며, gradient 색상은 향후 제거 예정으로 표시되었습니다. 또한, 폰트 관련 코드에 FontFamily enum이 추가되고, BitnagilFont가 이를 활용하도록 변경되었으며, 새로운 폰트 스타일과 가중치가 추가되고, HomeView에서 새로운 폰트 패밀리를 사용하는 폰트가 적용되었습니다. Info.plist에는 새로운 폰트 파일이 등록되었습니다. Changes
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 생성 및 반환
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 unit tests
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Actionable comments posted: 3
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 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 이름과 일치하는지 수동으로 한번만 최종 확인해주세요.
| "blue" : "0x20", | ||
| "green" : "0x71", | ||
| "red" : "0xFE" | ||
| } |
There was a problem hiding this comment.
💡 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))
PYLength 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.
| // 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) | ||
|
|
There was a problem hiding this comment.
💡 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.
| // 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.
There was a problem hiding this comment.
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
📒 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 색상 세트의 형식과 값 일관성이 확보되었습니다.
There was a problem hiding this comment.
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
⛔ Files ignored due to path filters (1)
Projects/App/Resources/Font/Cafe24SsurroundAir-Light.otfis 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이 반환되고 시스템 폰트로 조용히 폴백될 수 있습니다. 또한 현재 프로젝트에서는.lightweight만 사용 중이므로, 다른 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.familyNames및UIFont.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 일관성이 유지됩니다.
| 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) } | ||
|
|
There was a problem hiding this comment.
💡 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.
| 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.
| func fontName(weight: FontWeight) -> String { | ||
| switch self { | ||
| case .pretendard: | ||
| return weight.pretendardFontName | ||
| case .cafe24Ssurround: | ||
| return weight.cafe24FontName | ||
| } | ||
| } |
There was a problem hiding this comment.
🛠️ 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.
| 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.
| var pretendardFontName: String { | ||
| switch self { | ||
| case .bold: "Pretendard-Bold" | ||
| case .semiBold: "Pretendard-SemiBold" | ||
| case .medium: "Pretendard-Medium" | ||
| case .regular: "Pretendard-Regular" | ||
| default: "Pretendard-Medium" | ||
| } | ||
| } |
There was a problem hiding this comment.
💡 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 - 위치:
pretendardFontNamecomputed 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)")
}
}이렇게 하면
switch에 새 케이스가 추가되면 컴파일 단계에서 누락을 확인할 수 있고.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.
| 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.
🌁 Background
2차 UI 반영에 대하여 디자인 시스템 색상 값에 변경이 있었습니다.
👩💻 Contents
📝 Review Note
Summary by CodeRabbit
버그 수정
리팩터
기타