Skip to content

feat: 입력 관련 컴포넌트 추가, 디자인 시스템 일부 수정#69

Merged
clxxrlove merged 18 commits into
developfrom
BOOK-119-feature/#67
Jul 11, 2025
Merged

feat: 입력 관련 컴포넌트 추가, 디자인 시스템 일부 수정#69
clxxrlove merged 18 commits into
developfrom
BOOK-119-feature/#67

Conversation

@clxxrlove
Copy link
Copy Markdown
Member

@clxxrlove clxxrlove commented Jul 10, 2025

🔗 관련 이슈

📘 작업 유형

  • ✨ Feature (기능 추가)
  • 🐞 Bugfix (버그 수정)
  • 🔧 Refactor (코드 리팩토링)
  • ⚙️ Chore (환경 설정)
  • 📝 Docs (문서 작성 및 수정)
  • ✅ Test (기능 테스트)
  • 🎨 style (코드 스타일 수정)

📙 작업 내역

  • 체크박스를 위한 아이콘 추가
  • BKIcon 제거 -> BKImage 추가 및 asset 정리
  • asset 관리를 Tuist에게 위임 (TuistAssets+ 사용)
  • 공통 Inset 상수를 관리하기 위한 BKInset 추가
  • Label, Divider, Text*, Checkbox 추가
  • 공통 네비게이션 디자인 추가
  • PreviewApp 개선

🧪 테스트 내역

  • 브라우저/기기에서 동작 확인
  • 엣지 케이스 테스트 완료
  • 기존 기능 영향 없음

🎨 스크린샷 또는 시연 영상 (선택)

Simulator.Screen.Recording.-.iPhone.16.-.2025-07-10.at.22.04.37.mp4

💬 추가 설명 or 리뷰 포인트 (선택)

  • 이야기했던 UITextInput 관련 이슈 해결 완료

Summary by CodeRabbit

  • 신규 기능

    • 다양한 스타일과 상태를 지원하는 커스텀 텍스트필드, 체크박스, 디바이더, 라벨, 텍스트뷰, 서치 텍스트필드 UI 컴포넌트가 추가되었습니다.
    • 입력 데모와 테스트 메뉴를 위한 새로운 뷰 및 뷰컨트롤러가 추가되었습니다.
    • 네비게이션 바의 일관된 스타일이 적용되고, 초기 화면이 카탈로그 메뉴로 변경되었습니다.
    • 기본 뷰와 뷰컨트롤러를 위한 재사용 가능한 베이스 클래스가 도입되었습니다.
  • 버그 수정

    • 버튼 아이콘 적용 방식이 개선되어 이미지 리소스 접근이 간소화되었습니다.
  • 리팩터

    • 내부 네이밍 및 리소스 구조가 개선되어 코드 일관성과 유지보수성이 향상되었습니다.
    • 텍스트 스타일 메서드가 확장되어 추가 속성 지원이 가능해졌습니다.
  • 스타일

    • 불필요한 공백 및 주석이 제거되어 코드가 더 깔끔해졌습니다.
  • 문서 및 리소스

    • 앱 아이콘, 체크박스 등 다양한 이미지 에셋이 추가되었습니다.
    • 인셋, 텍스트 스타일 등 디자인 시스템 관련 상수가 정리되었습니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 10, 2025

## Walkthrough

이번 변경 사항에서는 네비게이션 바 설정, 체크박스, 라벨, 텍스트필드 등 UI 컴포넌트가 대거 추가 및 개선되었습니다. 또한, 여러 리소스 파일과 에셋, 공통 베이스 뷰/컨트롤러, 인셋 상수, 버튼 및 아이콘 시스템 등도 신규 도입 및 리팩터링되었습니다.

## Changes

| 파일/경로 요약 | 변경 요약 |
|---|---|
| `.github/workflows/ios_ci.yml`, `src/SupportingFiles/Scripts/tuist_module_init.sh` | CI 스크립트 실행 경로 및 모듈 초기화 스크립트에 디렉토리 이동 명령 추가 |
| `src/Projects/BKDesign/PreviewApp/Sources/Common/BaseView.swift`, `BaseViewController.swift` | 공통 베이스 뷰 및 베이스 뷰 컨트롤러 클래스 추가 |
| `src/Projects/BKDesign/PreviewApp/Sources/SceneDelegate.swift` | 네비게이션 컨트롤러 및 네비게이션 바 글로벌 스타일 설정 추가, 초기 진입 VC 변경 |
| `src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift`, `BKInputCatalogViewController.swift`, `BKInputCatalogView.swift` | 카탈로그 및 입력 컴포넌트 데모 뷰/컨트롤러 신규 추가 |
| `src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift`, `BKButtonGroupDemoViewController.swift` | 버튼 테스트/그룹 데모 VC에서 아이콘 처리 및 네비게이션 타이틀 설정 개선 |
| `src/Projects/BKDesign/Resources/Assets.xcassets/...` | 앱 아이콘, 체크박스, 아이콘 등 다양한 에셋 및 이미지셋 JSON 파일 신규 추가 |
| `src/Projects/BKDesign/Sources/Components/BKLabel.swift`, `BKDivider.swift`, `BKBaseTextField.swift`, `BKSearchTextField.swift`, `BKTextView.swift`, `BKCheckBox.swift` | 라벨, 디바이더, 텍스트필드, 서치필드, 텍스트뷰, 체크박스 등 UI 컴포넌트 클래스 신규 추가 |
| `src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKIcon.swift``BKImage` | 아이콘 및 체크박스 이미지 접근 방식 리팩터링 및 네임스페이스화 |
| `src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKInset.swift` | 인셋 상수 enum 신규 추가 |
| `src/Projects/BKDesign/Sources/Foundation/Typography/BKTextStyle.swift` | attributedString 생성 시 extraAttributes 파라미터 추가 |
| `src/Projects/BKDesign/Sources/Components/Button/BKButton.swift`, `src/Tuist/Package.swift` | 불필요한 빈 줄 및 주석 제거 등 사소한 코드 정리 |
| `src/Projects/Booket/Project.swift` | 리소스 glob 패턴 확장 및 주석 제거 |
| `src/Projects/Booket/Sources/SceneDelegate.swift` | 네비게이션 바 설정 메서드 추가 및 호출, 불필요한 괄호 제거 |
| `src/Projects/BKPresentation/Sources/AuthFlow/View/LoginView.swift` | 카카오 아이콘 이미지 할당 방식 간소화 |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
actor User
participant SceneDelegate
participant UINavigationController
participant CatalogViewController
participant BKInputCatalogViewController
participant BKInputCatalogView

User->>SceneDelegate: 앱 실행
SceneDelegate->>UINavigationController: 생성 및 네비게이션 바 스타일 설정
SceneDelegate->>CatalogViewController: push (초기 진입)
User->>CatalogViewController: 버튼 선택
CatalogViewController->>BKInputCatalogViewController: push
BKInputCatalogViewController->>BKInputCatalogView: 뷰 로드 및 컴포넌트 표시

Assessment against linked issues

Objective Addressed Explanation
네비게이션 바 설정 (#67)
컴포넌트 추가: 체크박스, 라벨, 텍스트필드 등 (#67)

Suggested labels

✨ feat


<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings
<details open="true">
<summary>🧪 Generate unit tests</summary>

- [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Create PR with unit tests
- [ ] <!-- {"checkboxId": "07f1e7d6-8a8e-4e23-9900-8731c2c87f58", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Post copyable unit tests in a comment
- [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Commit unit tests in branch `BOOK-119-feature/#67`

</details>

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

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.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=YAPP-Github/Reed-iOS&utm_content=69):

- 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.`
  -	`@coderabbitai modularize this function.`
- 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.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### 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](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai auto-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](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

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: 10

🧹 Nitpick comments (16)
.github/workflows/ios_ci.yml (1)

85-90: 스크립트 내부 cd ../../와 워크플로 경로 설정이 중복됩니다.

현재 스텝에서 working-directory: src/SupportingFiles/Scripts 로 이동한 뒤, 스크립트가 다시 cd ../../ 를 수행합니다. 두 위치가 서로 결합되어 의도한 대로 src 디렉터리에서 동작하긴 하지만, 어느 한쪽이 변경되면 즉시 깨질 수 있는 취약한 결합입니다.

  • 스크립트 내부에서 절대 경로 계산(앞 코멘트 참고)을 도입하거나
  • 워크플로의 working-directory 를 다시 src 로 돌리고 ./SupportingFiles/Scripts/tuist_module_init.sh 로 호출

둘 중 하나로 정리해 의존성을 단일화하는 편이 유지보수에 유리합니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/Contents.json (1)

1-23: 이미지 세트 메타데이터는 문제없으나 네이밍 규칙을 통일하는 편이 좋습니다.

checkbox-filled처럼 하이픈(-)으로 구분한 이름과, 다른 세트의 checkbox-icononly_default-round처럼 언더스코어(_)-혼합 형식이 함께 존재합니다.
향후 검색‧자동화 스크립트 작성 시 혼재된 구분자는 유지보수 비용을 높일 수 있으므로 하나의 컨벤션(예: 모두 하이픈)으로 맞추는 것을 권장합니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-round.imageset/Contents.json (1)

1-23: rendering-intent 지정 여부 검토

체크박스는 주로 template 렌더링(틴트 컬러 적용)을 사용하지 않고 원본 색상을 유지합니다.
향후 다크 모드 등에서 색상 오염을 방지하려면 각 이미지 항목에 "rendering-intent": "original" 속성을 추가하는 것을 고려해 보세요.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-round.imageset/Contents.json (1)

1-23: 네이밍 컨벤션 불일치

다른 세트(checkbox-disabled-round, checkbox-filled 등)는 하이픈 기반인데 본 세트는 언더스코어와 하이픈이 혼합되어 있습니다.
일관성을 위해 checkbox-icononly-default-round 등 하나의 규칙으로 맞추는 것을 권장합니다.

src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift (1)

7-23: 버튼 생성 로직의 중복을 제거하세요.

세 개의 버튼이 동일한 패턴으로 생성되고 있습니다. 코드 중복을 줄이기 위해 헬퍼 함수를 만드는 것을 고려해보세요.

다음과 같이 리팩토링할 수 있습니다:

+private func makeButton(title: String) -> UIButton {
+    let button = UIButton(type: .system)
+    button.setTitle(title, for: .normal)
+    return button
+}
+
-private let inputCatalogButton: UIButton = {
-    let button = UIButton(type: .system)
-    button.setTitle("BKInputCatalogViewController", for: .normal)
-    return button
-}()
+private lazy var inputCatalogButton = makeButton(title: "BKInputCatalogViewController")

다른 버튼들도 동일하게 적용하면 코드가 더 간결해집니다.

src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKInset.swift (1)

5-11: enum 사용 방식은 좋으나 네이밍 일관성 개선 필요

상수 네임스페이스로 enum을 사용하는 것은 좋은 선택입니다. 하지만 네이밍에 일관성이 부족합니다:

  • inset1, inset2, inset3, inset4는 순차적 네이밍
  • inset20은 값 기반 네이밍

의미적 네이밍을 고려해보세요:

public enum BKInset {
-    public static let inset1: CGFloat = 4
-    public static let inset2: CGFloat = 13
-    public static let inset3: CGFloat = 16
-    public static let inset4: CGFloat = 44
-    public static let inset20: CGFloat = 20
+    public static let small: CGFloat = 4
+    public static let medium: CGFloat = 16
+    public static let large: CGFloat = 20
+    public static let extraLarge: CGFloat = 44
+    public static let custom13: CGFloat = 13 // 특별한 용도가 있다면 주석 추가
}
src/Projects/BKDesign/PreviewApp/Sources/Common/BaseView.swift (1)

5-23: 템플릿 메서드 패턴 구현 우수, 접근 제어 검토 필요

템플릿 메서드 패턴을 통한 구조화된 초기화는 좋은 접근입니다. 하지만 접근 제어를 고려해보세요:

-class BaseView: UIView {
+open class BaseView: UIView {
    // MARK: - Initialize
    override init(frame: CGRect = .zero) {
        super.init(frame: frame)
        self.setupView()
        self.setupLayout()
        self.configure()
    }
    
    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - Common Methods
-    func setupView() {}
-    func setupLayout() {}
-    func configure() {}
+    open func setupView() {}
+    open func setupLayout() {}
+    open func configure() {}
}

이렇게 하면 다른 모듈에서도 BaseView를 상속받아 사용할 수 있습니다.

src/Projects/Booket/Sources/SceneDelegate.swift (1)

60-90: 네비게이션 바 스타일링 구현 우수, 재사용성 고려 필요

네비게이션 바 설정이 매우 포괄적이고 잘 구현되었습니다:

  1. 디자인 시스템 일관성: BKTextStyle, UIColor 확장 활용
  2. 커스텀 백 버튼: 적절한 아이콘과 정렬 설정
  3. 완전한 appearance 설정: 모든 네비게이션 바 상태 고려

하지만 유사한 설정이 다른 SceneDelegate에도 있을 수 있으므로 공통 유틸리티 고려를 제안합니다:

// BKDesign 모듈에 추가 고려
public struct BKNavigationBarConfigurator {
    public static func configure(_ navigationController: UINavigationController) {
        // 현재 setupNavigationBar() 로직 이동
    }
}
src/Projects/BKDesign/Sources/Components/BKTextView.swift (1)

65-73: 에러 처리 로직의 중복을 제거할 수 있습니다.

handleError() 메서드와 isError의 didSet에서 유사한 로직이 반복됩니다. 코드 중복을 줄이기 위해 리팩터링을 고려해보세요.

다음과 같이 리팩터링할 수 있습니다:

private var isError: Bool = false {
    didSet {
-        isError ? textField.setType(type: .error) : textField.setType(type: .normal)
+        handleError()
    }
}

private func handleError() {
    if isError {
        textField.setType(type: .error)
        helpMessageLabel.setColor(color: .bkContentColor(.error))
    } else {
        textField.setType(type: .normal)
        helpMessageLabel.setColor(color: .bkContentColor(.tertiary))
    }
}
src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (1)

57-60: 애니메이션 효과 추가 고려해보세요

상태 변경 시 부드러운 애니메이션을 추가하면 사용자 경험이 개선됩니다.

다음과 같이 애니메이션을 추가할 수 있습니다:

 @objc private func toggleCheck() {
     isChecked.toggle()
+    
+    // 부드러운 전환 애니메이션
+    UIView.transition(with: imageView, duration: 0.15, options: .transitionCrossDissolve) {
+        self.updateImage()
+    }
+    
     sendActions(for: .valueChanged)
 }
src/Projects/BKDesign/Sources/Components/BKSearchTextField.swift (1)

75-81: 검색 버튼 크기 제약 조건 추가를 고려해보세요

버튼의 크기가 명시적으로 제한되지 않아 예상치 못한 레이아웃 문제가 발생할 수 있습니다.

다음과 같이 크기 제약 조건을 추가해보세요:

 func layout() {
     searchButton.snp.makeConstraints {
         $0.trailing.equalToSuperview()
             .inset(BKInset.inset3)
         $0.centerY.equalToSuperview()
+        $0.width.height.equalTo(24) // 아이콘 크기에 맞는 적절한 크기
     }
 }
src/Projects/BKDesign/PreviewApp/Sources/Common/BaseViewController.swift (1)

38-44: 훅 메서드들에 문서화 추가를 권장합니다

각 메서드의 목적과 호출 시점을 명확히 하면 서브클래스 개발자들에게 도움이 됩니다.

다음과 같이 문서화를 추가해보세요:

 // MARK: - Common Methods
+/// 뷰 계층 구조를 설정합니다. viewDidLoad에서 첫 번째로 호출됩니다.
 func setupView() {}
+/// 뷰의 초기 속성을 구성합니다. setupView 다음에 호출됩니다.
 func configure() {}
+/// Auto Layout 제약 조건을 설정합니다. configure 다음에 호출됩니다.
 func setupLayout() {}
+/// UI 액션들을 바인딩합니다. setupLayout 다음에 호출됩니다.
 func bindAction() {}
+/// 상태 변화를 바인딩합니다. bindAction 다음에 호출됩니다.
 func bindState() {}
src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift (2)

105-127: 플레이스홀더 스타일링 로직이 인상적입니다

베이스라인 오프셋 계산을 통한 정밀한 텍스트 정렬이 훌륭합니다. 하지만 복잡성 때문에 코멘트 추가를 권장합니다.

다음과 같이 설명 코멘트를 추가해보세요:

 func applyPlaceholderStyle() {
     guard let placeholderStr = placeholder,
           let textFont,
           let placeholderFont else { return }

+    // 텍스트와 플레이스홀더 폰트 간의 베이스라인 정렬을 위한 스타일 설정
     let paragraph = NSMutableParagraphStyle()
     paragraph.alignment = .left
     paragraph.minimumLineHeight = textFont.lineHeight
     paragraph.maximumLineHeight = textFont.lineHeight

+    // 폰트 크기 차이를 보정하기 위한 베이스라인 오프셋 계산
     let baseline = (textFont.capHeight - placeholderFont.capHeight) / 2

88-91: 빈 델리게이트 익스텐션 제거 고려

현재 사용되지 않는 빈 익스텐션은 제거하거나 실제 필요할 때 추가하는 것이 좋습니다.

-/// 필요 시 추가
-extension BKBaseTextField: UITextFieldDelegate {
-    
-}
src/Projects/BKDesign/Sources/Components/BKLabel.swift (2)

72-81: 메서드 네이밍을 Swift 컨벤션에 맞게 개선

setText, setColor 대신 Swift 스타일의 네이밍을 사용하는 것이 좋습니다.

다음과 같이 변경을 고려해보세요:

-public func setText(text: String) {
+public func updateText(_ text: String) {
     self.labelText = text
     apply()
 }
 
-public func setColor(color: UIColor) {
+public func updateColor(_ color: UIColor) {
     self.labelColor = color
     apply()
 }

84-101: 속성 문자열 생성 로직 단순화 고려

현재 로직이 복잡하므로 단순화할 수 있습니다.

다음과 같이 단순화해보세요:

 func apply() {
-    let baseText = fontStyle.attributedString(
+    let paragraphStyle = NSMutableParagraphStyle()
+    paragraphStyle.alignment = alignment
+    
+    attributedText = fontStyle.attributedString(
         from: labelText,
-        color: labelColor
+        color: labelColor,
+        extraAttributes: [.paragraphStyle: paragraphStyle]
     )
-    let attributedString = NSMutableAttributedString(attributedString: baseText)
-    let range = NSRange(location: 0, length: attributedString.length)
-    let paragraphStyle = NSMutableParagraphStyle()
-    paragraphStyle.alignment = alignment
-    
-    attributedString.addAttribute(
-        .paragraphStyle,
-        value: paragraphStyle,
-        range: range
-    )
-    
-    attributedText = attributedString
 }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between c4b7b29 and fe48210.

⛔ Files ignored due to path filters (111)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-rectangle.imageset/checkbox-default-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-rectangle.imageset/checkbox-default-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-rectangle.imageset/checkbox-default-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-round.imageset/checkbox-default-round.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-round.imageset/checkbox-default-round@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-round.imageset/checkbox-default-round@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-rectangle.imageset/checkbox-disabled-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-rectangle.imageset/checkbox-disabled-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-rectangle.imageset/checkbox-disabled-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-round.imageset/checkbox-disabled-round.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-round.imageset/checkbox-disabled-round@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-round.imageset/checkbox-disabled-round@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-rectangle.imageset/checkbox-icononly_default-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-rectangle.imageset/checkbox-icononly_default-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-rectangle.imageset/checkbox-icononly_default-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-round.imageset/checkbox-icononly_default-round.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-round.imageset/checkbox-icononly_default-round@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-round.imageset/checkbox-icononly_default-round@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/alert-circle.imageset/alert-circle.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/alert-circle.imageset/alert-circle@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/alert-circle.imageset/alert-circle@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/apple.imageset/apple.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/apple.imageset/apple@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/apple.imageset/apple@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bell-off.imageset/bell-off.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bell-off.imageset/bell-off@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bell-off.imageset/bell-off@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bell.imageset/bell.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bell.imageset/bell@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bell.imageset/bell@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/book-open.imageset/book-open.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/book-open.imageset/book-open@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/book-open.imageset/book-open@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bookmark.imageset/bookmark.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bookmark.imageset/bookmark@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/bookmark.imageset/bookmark@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/check.imageset/check.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/check.imageset/check@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/check.imageset/check@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-down.imageset/chevron-down.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-down.imageset/chevron-down@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-down.imageset/chevron-down@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-left.imageset/chevron-left.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-left.imageset/chevron-left@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-left.imageset/chevron-left@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-right.imageset/chevron-right.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-right.imageset/chevron-right@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-right.imageset/chevron-right@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-up.imageset/chevron-up.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-up.imageset/chevron-up@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/chevron-up.imageset/chevron-up@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit-2.imageset/edit-2.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit-2.imageset/edit-2@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit-2.imageset/edit-2@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit-3.imageset/edit-3.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit-3.imageset/edit-3@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit-3.imageset/edit-3@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit.imageset/edit.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit.imageset/edit@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/edit.imageset/edit@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/kakao.imageset/kakao.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/kakao.imageset/kakao@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/kakao.imageset/kakao@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/loader.imageset/loader.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/loader.imageset/loader@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/loader.imageset/loader@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/maximize.imageset/maximize.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/maximize.imageset/maximize@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/maximize.imageset/maximize@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/menu.imageset/menu.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/menu.imageset/menu@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/menu.imageset/menu@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/more-horizontal.imageset/more-horizontal.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/more-horizontal.imageset/more-horizontal@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/more-horizontal.imageset/more-horizontal@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/more-vertical.imageset/more-vertical.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/more-vertical.imageset/more-vertical@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/more-vertical.imageset/more-vertical@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/plus.imageset/plus.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/plus.imageset/plus@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/plus.imageset/plus@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/search.imageset/search.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/search.imageset/search@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/search.imageset/search@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/settings.imageset/settings.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/settings.imageset/settings@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/settings.imageset/settings@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/star.imageset/star.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/star.imageset/star@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/star.imageset/star@3x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/x.imageset/x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/x.imageset/x@2x.png is excluded by !**/*.png
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/x.imageset/x@3x.png is excluded by !**/*.png
📒 Files selected for processing (39)
  • .github/workflows/ios_ci.yml (1 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/Common/BaseView.swift (1 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/Common/BaseViewController.swift (1 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/SceneDelegate.swift (2 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonGroupDemoViewController.swift (1 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift (4 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/View/BKInputCatalogView.swift (1 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/View/BKInputCatalogViewController.swift (1 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-rectangle.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-round.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-rectangle.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-round.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-rectangle.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-round.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/Contents.json (1 hunks)
  • src/Projects/BKDesign/Resources/Assets.xcassets/icons/Contents.json (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKDivider.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKLabel.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKSearchTextField.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKTextView.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/Button/BKButton.swift (0 hunks)
  • src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKIcon.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKInset.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Foundation/Typography/BKTextStyle.swift (2 hunks)
  • src/Projects/BKPresentation/Sources/AuthFlow/View/LoginView.swift (1 hunks)
  • src/Projects/Booket/Project.swift (1 hunks)
  • src/Projects/Booket/Sources/SceneDelegate.swift (4 hunks)
  • src/SupportingFiles/Scripts/tuist_module_init.sh (1 hunks)
  • src/Tuist/Package.swift (0 hunks)
💤 Files with no reviewable changes (2)
  • src/Projects/BKDesign/Sources/Components/Button/BKButton.swift
  • src/Tuist/Package.swift
🧰 Additional context used
🧠 Learnings (31)
📓 Common learnings
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#56
File: src/Projects/BKPresentation/Sources/Constant/PresentationKeys.swift:3-5
Timestamp: 2025-07-07T13:53:13.006Z
Learning: clxxrlove prefers using enum over struct for constants namespace due to better runtime performance, memory layout, and compiler optimizations. Enum prevents instantiation at compile time without needing private init().
src/Projects/BKDesign/Resources/Assets.xcassets/icons/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/Booket/Project.swift (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-round.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-rectangle.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-round.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-rectangle.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-round.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-rectangle.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonGroupDemoViewController.swift (1)
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#56
File: src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift:109-111
Timestamp: 2025-07-07T13:47:32.784Z
Learning: The LoginViewModel's authenticateWithToken case in src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift is test code and not important for implementation according to the user.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKPresentation/Sources/AuthFlow/View/LoginView.swift (2)
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#56
File: src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift:109-111
Timestamp: 2025-07-07T13:47:32.784Z
Learning: The LoginViewModel's authenticateWithToken case in src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift is test code and not important for implementation according to the user.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift (1)
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#56
File: src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift:109-111
Timestamp: 2025-07-07T13:47:32.784Z
Learning: The LoginViewModel's authenticateWithToken case in src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift is test code and not important for implementation according to the user.
src/Projects/BKDesign/PreviewApp/Sources/Common/BaseView.swift (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BottomSheetShadow.swift:5-10
Timestamp: 2025-07-08T17:16:15.942Z
Learning: doyeonk429는 BottomSheetShadow struct에서 apply(to:)와 asCALayerShadow() 메서드를 처음에 만들었지만 활용 측면에서 애매할 것 같아서 제외했다고 함. 정적 속성만으로 구현하는 것을 선호함.
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/Contents.json (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/Booket/Sources/SceneDelegate.swift (3)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BottomSheetShadow.swift:5-10
Timestamp: 2025-07-08T17:16:15.942Z
Learning: doyeonk429는 BottomSheetShadow struct에서 apply(to:)와 asCALayerShadow() 메서드를 처음에 만들었지만 활용 측면에서 애매할 것 같아서 제외했다고 함. 정적 속성만으로 구현하는 것을 선호함.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/Sources/Foundation/Typography/BKTextStyle.swift (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKIcon.swift (2)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKInset.swift (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
src/Projects/BKDesign/PreviewApp/Sources/View/BKInputCatalogView.swift (2)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift:86-92
Timestamp: 2025-07-10T08:21:16.097Z
Learning: BKButtonGroup의 horizontal 레이아웃에서 stackView.distribution을 .fillProportionally로 설정한 것은 의도된 디자인입니다. doyeonk429는 버튼들이 콘텐츠 길이에 따라 다른 너비를 가지는 것을 선호합니다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift (3)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#56
File: src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift:109-111
Timestamp: 2025-07-07T13:47:32.784Z
Learning: The LoginViewModel's authenticateWithToken case in src/Projects/BKPresentation/Sources/AuthFlow/ViewModel/LoginViewModel.swift is test code and not important for implementation according to the user.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift:86-92
Timestamp: 2025-07-10T08:21:16.097Z
Learning: BKButtonGroup의 horizontal 레이아웃에서 stackView.distribution을 .fillProportionally로 설정한 것은 의도된 디자인입니다. doyeonk429는 버튼들이 콘텐츠 길이에 따라 다른 너비를 가지는 것을 선호합니다.
src/Projects/BKDesign/Sources/Components/BKDivider.swift (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift (2)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BottomSheetShadow.swift:5-10
Timestamp: 2025-07-08T17:16:15.942Z
Learning: doyeonk429는 BottomSheetShadow struct에서 apply(to:)와 asCALayerShadow() 메서드를 처음에 만들었지만 활용 측면에서 애매할 것 같아서 제외했다고 함. 정적 속성만으로 구현하는 것을 선호함.
src/Projects/BKDesign/Sources/Components/BKLabel.swift (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (1)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
🧬 Code Graph Analysis (3)
src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonGroupDemoViewController.swift (1)
src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift (1)
  • viewWillAppear (22-26)
src/Projects/BKDesign/PreviewApp/Sources/Common/BaseView.swift (1)
src/Projects/BKDesign/PreviewApp/Sources/Common/BaseViewController.swift (3)
  • setupView (39-39)
  • setupLayout (41-41)
  • configure (40-40)
src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift (2)
src/Projects/BKDesign/Sources/Extensions/UIColor+.swift (3)
  • bkBackgroundColor (38-50)
  • bkContentColor (52-63)
  • bkBorderColor (65-76)
src/Projects/BKDesign/Sources/Foundation/Typography/BKTextStyle.swift (1)
  • attributedString (322-342)
⏰ 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 (48)
src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/Contents.json (1)

4-17: 체크박스 채워진 이미지 리소스 확인 완료

저장소 내에 checkbox-filled.png, checkbox-filled@2x.png, checkbox-filled@3x.png 모두 존재함을 셸 스크립트로 검증했습니다. Contents.json에 정의된 리소스가 누락되지 않아 런타임 크래시는 발생하지 않습니다.

src/Projects/BKDesign/Resources/Assets.xcassets/icons/Contents.json (1)

1-6: 상위 카탈로그 메타만 존재합니다 – 아이콘 세트 추가 예정인지 확인 필요

icons 카탈로그에 하위 *.imageset이 아직 없는 상태입니다.
향후 아이콘을 추가할 계획이 명확하다면 괜찮지만, 당장 사용처가 없다면 디렉터리를 빈 채로 두는 것은 혼란을 줄 수 있습니다. 필요 시 초기 세트를 함께 커밋하는 편이 좋습니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/Contents.json (1)

1-6: 카탈로그 루트 메타데이터 추가 완료 – 문제없습니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-round.imageset/Contents.json (1)

4-17: 확인 완료: checkbox-icononly_default-round 이미지 리소스가 모두 존재합니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_default-rectangle.imageset/Contents.json (1)

1-23: 체크박스 아이콘 에셋 카탈로그 구조가 올바르게 구성되었습니다.

표준 에셋 카탈로그 형식을 따르고 있으며, 1x, 2x, 3x 스케일 변형이 모두 포함되어 있습니다. 파일명 규칙도 일관성 있게 적용되었습니다.

src/Projects/Booket/Project.swift (1)

12-12: 리소스 포함 패턴 확장이 적절합니다.

글로브 패턴을 Projects/BKDesign/Resources/**로 변경하여 폰트뿐만 아니라 새로 추가된 체크박스 에셋 카탈로그를 포함한 모든 BKDesign 리소스를 포함하도록 했습니다. 새로운 디자인 시스템 컴포넌트들을 지원하기 위한 적절한 변경입니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/Contents.json (1)

1-23: 활성 상태 체크박스 아이콘 에셋 카탈로그가 올바르게 구성되었습니다.

표준 에셋 카탈로그 형식을 따르고 있으며, 활성 상태를 나타내는 명확한 네이밍 규칙이 적용되었습니다. 다른 체크박스 에셋들과 일관성 있는 구조입니다.

src/Projects/BKPresentation/Sources/AuthFlow/View/LoginView.swift (1)

53-55: BKImage 시스템으로의 마이그레이션이 적절하게 수행되었습니다.

이전의 BKIcon.kakaoLogo.image에서 조건부 가드를 사용하던 방식에서 BKImage.Icon.kakao를 직접 사용하는 방식으로 변경되어 코드가 더 간결해졌습니다. 새로운 BKImage 시스템의 타입 안전성을 활용한 좋은 개선입니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-rectangle.imageset/Contents.json (1)

1-23: 기본 상태 체크박스 에셋 카탈로그가 일관성 있게 구성되었습니다.

다른 체크박스 에셋 카탈로그들과 동일한 표준 형식을 따르고 있으며, 기본 상태를 나타내는 명확한 네이밍이 적용되었습니다. 전체 체크박스 UI 시스템의 일관성을 유지하고 있습니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-default-round.imageset/Contents.json (1)

1-23: 표준 에셋 카탈로그 구조가 올바르게 구성되었습니다.

iOS 에셋 카탈로그의 표준 구조를 따르고 있으며, 1x, 2x, 3x 해상도 변형을 모두 포함하고 있습니다. 파일명 규칙도 올바르게 적용되어 있습니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-disabled-rectangle.imageset/Contents.json (1)

1-23: 비활성화 체크박스 에셋이 표준에 맞게 구성되었습니다.

다른 체크박스 에셋과 동일한 구조를 따르고 있어 일관성이 유지되고 있습니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/Contents.json (1)

1-23: 스트로크 체크박스 에셋이 올바르게 정의되었습니다.

다른 체크박스 에셋들과 일관된 구조를 유지하고 있어 전체적인 에셋 관리가 체계적입니다.

src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonGroupDemoViewController.swift (1)

19-22: 네비게이션 타이틀 설정이 올바르게 구현되었습니다.

super.viewWillAppear(animated) 호출 후 네비게이션 타이틀을 설정하는 패턴은 iOS 모범 사례를 따르고 있으며, 관련 코드 스니펫에서 보여준 BKButtonTestViewController와도 일관된 구조입니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/Contents.json (1)

1-23: 채워진 체크박스 에셋이 표준에 맞게 구성되었습니다.

모든 체크박스 에셋 파일들이 일관된 구조를 가지고 있어 유지보수성이 좋습니다. 검색된 학습 내용에 따르면 BKDesign 프로젝트에서 이미지 에셋들이 올바르게 포함되어 있다고 확인되었습니다.

src/Projects/BKDesign/PreviewApp/Sources/View/BKInputCatalogViewController.swift (1)

5-10: 깔끔한 뷰 컨트롤러 구현입니다.

BaseViewController를 상속받아 타입 안전성을 보장하고, viewWillAppear에서 네비게이션 타이틀을 설정하는 구조가 적절합니다. final 키워드 사용으로 상속을 방지한 것도 좋은 선택입니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/Contents.json (1)

1-23: 표준 에셋 카탈로그 형식을 준수합니다.

체크박스 아이콘의 모든 스케일 변형(1x, 2x, 3x)이 적절히 정의되어 있고, 파일명 규칙이 일관적입니다. 이전 학습 내용에 따르면 BKDesign 프로젝트의 이미지 에셋들이 모두 적절히 제공되고 있습니다.

src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/Contents.json (1)

1-23: 표준 에셋 카탈로그 형식을 준수합니다.

체크박스 stroke round 아이콘의 모든 스케일 변형(1x, 2x, 3x)이 적절히 정의되어 있고, 파일명 규칙이 일관적입니다. 다른 체크박스 아이콘들과 동일한 구조를 유지하고 있어 일관성이 좋습니다.

src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift (1)

25-31: 뷰 컨트롤러 구조가 잘 설계되었습니다.

viewDidLoad에서 설정과 바인딩을 분리하여 호출하는 구조가 깔끔합니다. 타이틀 설정과 배경색 설정도 적절합니다.

src/Projects/BKDesign/Sources/Foundation/Typography/BKTextStyle.swift (1)

322-342: 속성 확장 기능 추가 우수

extraAttributes 매개변수 추가로 텍스트 스타일링의 유연성이 크게 향상되었습니다. 특히 다음 부분이 잘 구현되었습니다:

  1. 기본값 제공: 빈 딕셔너리 기본값으로 호환성 유지
  2. 적절한 병합 전략: attributes.merge(extraAttributes) { $1 }로 추가 속성이 우선되도록 구현
  3. 명확한 매개변수 순서: 기본 속성 먼저, 추가 속성 나중

이 변경으로 BKLabel, BKCheckBox 등 새로운 컴포넌트들에서 더 풍부한 텍스트 스타일링이 가능해졌습니다.

src/Projects/Booket/Sources/SceneDelegate.swift (2)

5-5: BKDesign 모듈 import 추가 적절

디자인 시스템 구성요소 사용을 위한 import 추가가 적절합니다.


25-25: 네비게이션 바 설정 호출 위치 적절

window 설정 전에 네비게이션 바를 구성하는 것이 올바른 타이밍입니다.

src/Projects/BKDesign/Sources/Components/BKDivider.swift (2)

5-28: Divider 컴포넌트 설계 우수

BKDivider 구현이 매우 잘 설계되었습니다:

  1. 타입 기반 스타일링: DividerType enum으로 명확한 구분
  2. 적절한 intrinsic content size: 높이는 타입별, 너비는 유연하게 설정
  3. 디자인 시스템 일관성: .bkDividerColor 활용
  4. 스토리보드 초기화 방지: 다른 컴포넌트들과 일관된 패턴

30-48: 타입 속성 확장 구현 깔끔

DividerType의 computed properties로 높이와 색상을 관리하는 방식이 깔끔합니다. 각 타입별로 적절한 높이(medium: 8pt, small: 1pt)와 해당하는 디자인 시스템 색상을 제공합니다.

src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift (4)

24-24: 네비게이션 타이틀 설정이 적절합니다.

viewWillAppear에서 네비게이션 타이틀을 설정하는 것은 적절한 위치입니다. 사용자가 뷰에 진입할 때마다 타이틀이 올바르게 표시됩니다.


62-64: BKImage.Icon 사용법이 올바르게 적용되었습니다.

기존 BKIcon에서 새로운 BKImage.Icon으로의 변경이 일관성 있게 적용되었습니다. 직접 UIImage를 반환하는 방식으로 변경되어 더 직관적입니다.


79-80: 메서드 시그니처 변경이 적절합니다.

UIImage? 타입으로 변경하여 타입 안전성을 높였습니다. 옵셔널 파라미터로 기본값을 제공하는 것도 좋은 설계입니다.


107-108: setupIndependentButtons 메서드의 아이콘 할당이 올바릅니다.

배열의 인덱스를 통한 아이콘 할당이 올바르게 적용되었습니다. BKImage.Icon 사용법이 일관성 있게 유지되고 있습니다.

src/Projects/BKDesign/Sources/Foundation/GraphicSystem/BKIcon.swift (3)

5-8: 문서화 주석이 명확하고 유용합니다.

Tuist 자동 생성 에셋 사용법과 네임스페이스 구성에 대한 설명이 명확합니다. 개발자들이 에셋 추가 시 어떻게 분류해야 하는지 알 수 있습니다.


9-36: Icon 네임스페이스 구성이 체계적입니다.

BKDesignAsset에서 자동 생성된 에셋들을 체계적으로 분류하고 있습니다. 정적 프로퍼티로 UIImage를 직접 제공하여 사용이 간편합니다.


38-51: Checkbox 네임스페이스가 체계적으로 구성되었습니다.

체크박스 관련 에셋들이 상태별, 타입별로 명확하게 분류되어 있습니다. 네이밍 컨벤션이 일관성 있게 적용되었습니다.

src/Projects/BKDesign/Sources/Components/BKTextView.swift (3)

14-18: 에러 상태 관리 로직이 잘 구현되었습니다.

didSet을 사용한 에러 상태 변경 처리가 깔끔합니다. 상태 변경 시 텍스트 필드의 타입이 자동으로 업데이트되어 일관성이 유지됩니다.


20-25: intrinsic content size 구현이 적절합니다.

고정 높이(108pt)를 제공하면서 너비는 유연하게 처리하는 것이 적절합니다. 컴포넌트의 예측 가능한 레이아웃을 보장합니다.


35-49: 초기화 패턴이 iOS 컨벤션을 잘 따릅니다.

옵셔널 파라미터로 기본값을 제공하고, 프로퍼티 초기화 후 setup() 메서드를 호출하는 패턴이 적절합니다.

src/Projects/BKDesign/PreviewApp/Sources/View/BKInputCatalogView.swift (4)

7-7: BaseView 상속이 적절합니다.

BaseView를 상속하여 일관된 뷰 생명주기 관리를 따르고 있습니다. 프로젝트의 구조적 일관성을 유지합니다.


9-15: 스크롤 뷰 설정이 적절합니다.

세로 스크롤만 허용하고 가로 스크롤 인디케이터를 숨기는 설정이 UI 데모용으로 적절합니다. alwaysBounceVertical 설정도 좋습니다.


36-43: 체크박스 스택 뷰 구성이 합리적입니다.

가로 배치된 체크박스들과 스페이서를 사용하여 적절한 레이아웃을 구성했습니다. distribution을 .equalCentering으로 설정한 것이 적절합니다.


128-131: 스크롤 뷰 제약 조건이 올바릅니다.

contentLayoutGuide와 frameLayoutGuide를 적절히 사용하여 스크롤 뷰의 콘텐츠 크기와 프레임 크기를 올바르게 설정했습니다.

src/Projects/BKDesign/PreviewApp/Sources/SceneDelegate.swift (5)

8-8: 네비게이션 컨트롤러 인스턴스 프로퍼티 선언이 적절합니다.

씬 전반에서 네비게이션 컨트롤러를 재사용할 수 있도록 인스턴스 프로퍼티로 선언한 것이 좋은 설계입니다.


17-23: 씬 설정이 체계적으로 구성되었습니다.

네비게이션 바 설정, 윈도우 설정, 루트 뷰 컨트롤러 푸시 순서가 논리적으로 잘 구성되어 있습니다.


25-35: 네비게이션 바 기본 스타일링이 포괄적입니다.

타이틀 텍스트 속성, 배경색, 그림자 제거 등 기본적인 스타일링이 잘 구성되어 있습니다. BKTextStyle과 색상 시스템을 일관성 있게 사용하고 있습니다.


41-48: 백 버튼 커스터마이징이 상세하게 구현되었습니다.

백 버튼 텍스트를 숨기고 커스텀 아이콘을 사용하며, 적절한 인셋을 적용한 것이 좋습니다. withAlignmentRectInsets를 사용한 위치 조정도 정확합니다.


50-54: 네비게이션 바 appearance 적용이 완전합니다.

standardAppearance, scrollEdgeAppearance, compactAppearance 모두에 동일한 스타일을 적용하여 일관성을 보장했습니다. isTranslucent를 false로 설정한 것도 적절합니다.

src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (2)

6-11: 체크박스 타입 구현이 잘 되어있습니다

enum을 통한 타입 정의가 깔끔하고, 향후 확장성도 좋습니다.


15-19: 상태 관리 로직이 적절합니다

didSet 옵저버를 통한 이미지 업데이트가 반응형으로 잘 구현되어 있습니다.

src/Projects/BKDesign/Sources/Components/BKSearchTextField.swift (1)

6-8: 구현 방식 선택에 대한 좋은 코멘트입니다

UISearchBar vs TextField 구현 방식에 대한 명확한 설명이 도움이 됩니다.

src/Projects/BKDesign/PreviewApp/Sources/Common/BaseViewController.swift (1)

5-18: 제네릭 베이스 컨트롤러 구현이 훌륭합니다

타입 안정성과 재사용성을 모두 확보한 좋은 설계입니다.

src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift (1)

6-11: 텍스트 필드 타입 시스템이 잘 설계되었습니다

세 가지 상태(normal, brand, error)를 명확히 구분한 좋은 설계입니다.

src/Projects/BKDesign/Sources/Components/BKLabel.swift (1)

20-36: 프로퍼티 접근 제한이 훌륭한 설계입니다

@available(*, unavailable) 애노테이션을 통한 API 제어가 우수합니다.

Comment thread src/SupportingFiles/Scripts/tuist_module_init.sh
Comment thread src/Projects/BKDesign/Sources/Components/BKCheckBox.swift
Comment thread src/Projects/BKDesign/Sources/Components/BKSearchTextField.swift
Comment thread src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift Outdated
Comment thread src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift
Comment thread src/Projects/BKDesign/Sources/Components/BKLabel.swift Outdated
Comment thread src/Projects/BKDesign/Sources/Components/BKLabel.swift Outdated
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

오 좋아요 ! 예시보고 단박에 이해 완 🫡

Copy link
Copy Markdown
Member

@doyeonk429 doyeonk429 left a comment

Choose a reason for hiding this comment

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

수고하셨습니다 ! checkbox는 여유있을 때 제가 조금 수정하겠습니다 !

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

♻️ Duplicate comments (1)
src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (1)

63-71: 접근성 값 업데이트가 누락되었습니다

updateImage() 메서드에서 이미지를 업데이트할 때 접근성 값도 함께 업데이트해야 합니다. 현재는 초기 설정에서만 접근성 값이 설정되고, 체크박스 상태가 변경될 때는 업데이트되지 않습니다.

 private func updateImage() {
     if isEnabled {
         imageView.image = isChecked
             ? type.checkedImage
             : type.defaultImage
     } else {
         imageView.image = type.disabledImage
     }
+    updateAccessibilityValue()
 }
🧹 Nitpick comments (1)
src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (1)

80-82: 메서드 가시성 일관성을 개선하세요

updateAccessibilityValue() 메서드가 private extension 내에 있지만 private 키워드가 명시되어 있지 않습니다. 일관성을 위해 private 키워드를 추가하는 것이 좋습니다.

-    func updateAccessibilityValue() {
+    private func updateAccessibilityValue() {
         accessibilityValue = isChecked ? "선택됨" : "선택 안됨"
     }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between fe48210 and 987e6c3.

📒 Files selected for processing (5)
  • src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKLabel.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/BKSearchTextField.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/Common/Component/BaseViewController.swift (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/Projects/BKPresentation/Sources/Common/Component/BaseViewController.swift
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/Projects/BKDesign/Sources/Components/BKSearchTextField.swift
  • src/Projects/BKDesign/Sources/Components/BKBaseTextField.swift
  • src/Projects/BKDesign/Sources/Components/BKLabel.swift
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#69
File: src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift:57-70
Timestamp: 2025-07-10T14:01:04.899Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 요구사항을 적용하지 않는 것을 선호한다.
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#69
File: src/Projects/BKDesign/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json:1-35
Timestamp: 2025-07-10T13:26:07.507Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 AppIcon 에셋 구조를 미리 설정하고, 실제 이미지 파일이 준비되기 전까지는 filename 속성을 의도적으로 생략하는 개발 방식을 사용한다. 이는 에셋 구조를 먼저 만들고 나중에 이미지를 추가하는 단계적 개발 접근법이다.
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#56
File: src/Projects/BKPresentation/Sources/Constant/PresentationKeys.swift:3-5
Timestamp: 2025-07-07T13:53:13.006Z
Learning: clxxrlove prefers using enum over struct for constants namespace due to better runtime performance, memory layout, and compiler optimizations. Enum prevents instantiation at compile time without needing private init().
src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (2)
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Resources/Assets.xcassets/chevron-right.imageset/Contents.json:1-26
Timestamp: 2025-07-08T17:15:59.793Z
Learning: In the BKDesign project, all image assets referenced in Contents.json files are properly included in the repository with the correct 1x, 2x, and 3x variants. The chevron-right icon and other design system icons are complete and ready for use.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:50-92
Timestamp: 2025-07-08T17:17:37.703Z
Learning: BKDesign 프로젝트에서 UIColor+ 확장의 시맨틱 컬러 메서드들(.bkContentColor, .bkBorderColor, .bkDividerColor, .bkBaseColor)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.
⏰ 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 (2)
src/Projects/BKDesign/Sources/Components/BKCheckBox.swift (2)

6-48: 체크박스 컴포넌트 구현이 잘 되어 있습니다

4가지 스타일을 지원하는 체크박스 컴포넌트가 깔끔하게 구현되었습니다. UIControl을 상속받아 적절한 이벤트 처리를 하고 있고, 접근성 지원도 추가되었습니다.


89-120: 이미지 제공 로직이 체계적으로 구성되어 있습니다

CheckboxType extension에서 각 타입별로 적절한 이미지를 제공하는 로직이 잘 구성되어 있습니다. BKImage.Checkbox를 통해 타입 안전한 이미지 참조를 사용하고 있어 좋습니다.

@clxxrlove clxxrlove merged commit 95b33c9 into develop Jul 11, 2025
3 checks passed
@clxxrlove clxxrlove deleted the BOOK-119-feature/#67 branch July 11, 2025 00:43
@coderabbitai coderabbitai Bot mentioned this pull request Jul 12, 2025
15 tasks
@coderabbitai coderabbitai Bot mentioned this pull request Jul 22, 2025
10 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BOOK-119/feat] 일부 컴포넌트 추가

2 participants