Skip to content

feat: 내서재 기본 UI만 구현#121

Merged
doyeonk429 merged 19 commits into
developfrom
BOOK-170-feature/#106
Jul 31, 2025
Merged

feat: 내서재 기본 UI만 구현#121
doyeonk429 merged 19 commits into
developfrom
BOOK-170-feature/#106

Conversation

@doyeonk429
Copy link
Copy Markdown
Member

@doyeonk429 doyeonk429 commented Jul 30, 2025

🔗 관련 이슈

📘 작업 유형

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

📙 작업 내역

  • 내서재 root view를 구현합니다.

🧪 테스트 내역

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

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

Simulator Screenshot - ReedDefaultSize - 2025-07-30 at 23 03 53 Simulator Screenshot - ReedDefaultSize - 2025-07-30 at 23 03 57 Simulator Screenshot - ReedDefaultSize - 2025-07-30 at 23 03 59 Simulator Screenshot - ReedDefaultSize - 2025-07-30 at 23 04 00

✅ PR 체크리스트

  • 커밋 메시지가 명확합니다
  • PR 제목이 컨벤션에 맞습니다
  • 관련 이슈 번호를 작성했습니다
  • 기능이 정상적으로 작동합니다
  • 불필요한 코드를 제거했습니다

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

  • UI만 구현했습니다. Archive Cell 재활용하시면 됩니다! (in Search Flow)

Summary by CodeRabbit

  • 신규 기능

    • "내 서재" 화면이 새롭게 추가되어, 카테고리 칩(전체/읽기 전/읽는 중/완독)과 책 리스트를 확인할 수 있습니다.
    • 각 카테고리 칩은 선택 및 카운트 표시가 가능하며, 칩을 눌러 필터링할 수 있습니다.
    • 책 리스트에서 각 책의 제목, 저자, 출판사, 기록 수, 썸네일을 확인할 수 있습니다.
    • 책이 없을 경우 빈 상태 화면이 표시됩니다.
    • 칩 UI 컴포넌트(BKChip)가 추가되어 다양한 곳에서 재사용할 수 있습니다.
    • "BKChip Demo" 화면이 카탈로그에 추가되어 칩 UI를 미리 볼 수 있습니다.
  • 개선 및 기타

    • 네비게이션 바의 검색/설정 버튼 색상이 일관되게 적용됩니다.
    • 기존 임시 "내 서재" 화면이 제거되었습니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 30, 2025

Walkthrough

본 변경사항은 "내 서재"(Archive) 화면의 기본 UI를 구현합니다. 필터 칩 컴포넌트, 책 셀, 빈 상태 화면, 칩 및 책 데이터 모델, 뷰모델, 뷰, 뷰컨트롤러, 셀, 칩 컴포넌트 등이 신규로 추가되었으며, 관련된 임시 뷰 컨트롤러가 제거되고, 네비게이션 스타일 일부가 보완되었습니다.

Changes

Cohort / File(s) Change Summary
Archive 메인 화면 신규 구현
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift, src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewController.swift, src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
Archive(내 서재) 화면의 뷰, 뷰컨트롤러, 뷰모델 신규 추가. 칩 선택, 책 리스트, 빈 상태, 이벤트 바인딩 등 구현.
Archive 관련 데이터 모델
src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ArchiveBook.swift, src/Projects/BKPresentation/Sources/ArchiveFlow/Model/BookStatus.swift, src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ChipData.swift
Archive 화면용 Book, BookStatus, ChipData 모델 추가. 칩 타입 및 상태, 책 정보 구조체 정의.
Archive 셀 및 UI 컴포넌트
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveCell.swift, src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift
ArchiveCell(책 셀) 신규 추가, BKBookSummaryView에 .record 스타일 및 기록 카운트 표시 추가.
칩(Chip) UI 컴포넌트
src/Projects/BKDesign/Sources/Components/Chip/BKChip.swift, src/Projects/BKDesign/PreviewApp/Sources/View/BKChipDemoViewController.swift, src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift
BKChip(칩) UI 컴포넌트 신규 추가 및 데모 뷰컨트롤러, 카탈로그 버튼 추가.
Archive Flow 연결 및 임시화면 제거
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveCoordinator.swift, src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveTempViewController.swift
ArchiveCoordinator가 ArchiveViewController를 사용하도록 변경, ArchiveTempViewController 삭제.
네비게이션 바 스타일 보완
src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift
메인 네비게이션 바의 검색/설정 버튼 tintColor 지정 추가.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant ArchiveViewController
    participant ArchiveViewModel
    participant ArchiveView
    participant ArchiveCell

    User->>ArchiveViewController: 화면 진입
    ArchiveViewController->>ArchiveViewModel: .onAppear 액션 전송
    ArchiveViewModel->>ArchiveViewModel: 칩/책 데이터 로딩
    ArchiveViewModel-->>ArchiveViewController: State 업데이트 (칩/책 데이터)
    ArchiveViewController->>ArchiveView: updateData(chips, books)
    User->>ArchiveView: 칩 탭/책 탭
    ArchiveView->>ArchiveViewController: 이벤트 전달 (chipTapped/bookTapped)
    ArchiveViewController->>ArchiveViewModel: 액션 전송 (chipTapped 등)
    ArchiveViewModel-->>ArchiveViewController: State 업데이트
    ArchiveViewController->>ArchiveView: updateData(chips, books)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Assessment against linked issues

Objective Addressed Explanation
필터 칩 컴포넌트 개발 (#106)
등록된 책이 없는 화면 개발 (#106)
등록된 책 셀 개발 (#106)
컴포넌트로 화면 구성 (#106)

Suggested labels

✨ feat

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between bfd3536 and 87bb7f8.

📒 Files selected for processing (1)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift (1 hunks)
🧰 Additional context used
🧠 Learnings (12)
📓 Common learnings
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsViewController.swift:3-5
Timestamp: 2025-07-22T05:39:10.746Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 UI 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 사용될 예정인 라이브러리들은 제거하지 않고 유지하는 것을 원한다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:124-133
Timestamp: 2025-07-10T08:21:49.399Z
Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코드는 별도 파일로 분리하지 않고 테스트 파일 내에 유지하는 것이 그들의 코드 구성 방식입니다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:38-48
Timestamp: 2025-07-08T17:17:40.046Z
Learning: doyeonk429는 BKDesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모드 색상을 반환하도록 의도적으로 구현했으며, 나중에 다크모드 디자인이 완성되면 해당 케이스만 구현하면 되는 구조로 설계했다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:0-0
Timestamp: 2025-07-10T08:21:44.204Z
Learning: doyeonk429는 BKDesign PreviewApp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성을 위한 것으로, 테스트 파일에서는 일반적인 "주석 처리된 코드 제거" 규칙을 적용하지 않는다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.
📚 Learning: the loginviewmodel's authenticatewithtoken case in src/projects/bkpresentation/sources/authflow/view...
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.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 bkdesign previewapp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:0-0
Timestamp: 2025-07-10T08:21:44.204Z
Learning: doyeonk429는 BKDesign PreviewApp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성을 위한 것으로, 테스트 파일에서는 일반적인 "주석 처리된 코드 제거" 규칙을 적용하지 않는다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 emotionregistrationview에서 someemotion1-4 케이스들을 임시로 구현했으며, 해당하는 그래픽 디자인이 나온 후 수정할 예정이라고 명시...
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#112
File: src/Projects/BKPresentation/Sources/MainFlow/Note/View/EmotionRegistrationView.swift:52-53
Timestamp: 2025-07-28T10:44:32.256Z
Learning: clxxrlove는 EmotionRegistrationView에서 someEmotion1-4 케이스들을 임시로 구현했으며, 해당하는 그래픽 디자인이 나온 후 수정할 예정이라고 명시했다. 감정 선택 UI는 디자인 에셋 완성 후 구현하는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 reed-ios 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: url 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 reed-ios 프로젝트에서 ui 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 ...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsViewController.swift:3-5
Timestamp: 2025-07-22T05:39:10.746Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 UI 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 사용될 예정인 라이브러리들은 제거하지 않고 유지하는 것을 원한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 bottomtabbarcontroller에서 viewdidlayoutsubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 bkdesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:38-48
Timestamp: 2025-07-08T17:17:40.046Z
Learning: doyeonk429는 BKDesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모드 색상을 반환하도록 의도적으로 구현했으며, 나중에 다크모드 디자인이 완성되면 해당 케이스만 구현하면 되는 구조로 설계했다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:124-133
Timestamp: 2025-07-10T08:21:49.399Z
Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코드는 별도 파일로 분리하지 않고 테스트 파일 내에 유지하는 것이 그들의 코드 구성 방식입니다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 reed-ios 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것...
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#94
File: src/Projects/BKData/Sources/Repository/DefaultBookRepository.swift:15-40
Timestamp: 2025-07-21T05:16:18.481Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 noteview의 nextbuttontapped 메서드에서 폼 검증 실패 시 첫 번째 페이지로 되돌아가는 로직을 임시로 구현했으며, 추후 적절한 에러 처리 로직...
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#112
File: src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift:128-140
Timestamp: 2025-07-28T10:45:09.696Z
Learning: clxxrlove는 NoteView의 nextButtonTapped 메서드에서 폼 검증 실패 시 첫 번째 페이지로 되돌아가는 로직을 임시로 구현했으며, 추후 적절한 에러 처리 로직을 추가할 예정이라고 명시했다. 임시 화면 구현 단계에서는 기본 동작에 집중하고 에러 처리는 후속 작업으로 계획하는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 reed-ios 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 ...
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.933Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 요구사항을 적용하지 않는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
🔇 Additional comments (6)
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift (6)

1-11: 적절한 파일 구조와 import 구성입니다.

ArchiveItem enum을 통한 섹션 구분도 명확하게 되어 있습니다.


13-34: State 관리 구조가 잘 설계되었습니다.

ArchiveState enum을 통한 빈 상태와 책 목록 상태 구분이 명확하고, 초기 칩 생성 로직도 적절합니다.


36-58: 액션과 사이드 이펙트 설계가 명확합니다.

사용자 인터랙션과 비동기 작업이 잘 분리되어 있고, 페이지네이션 관련 상태 관리도 적절합니다.


154-179: 사이드 이펙트 처리가 적절합니다.

Mock 데이터를 활용한 UI 개발 단계 구현이 잘 되어 있고, 페이지네이션 시 중복 제거 로직도 포함되어 있습니다.


192-204: 헬퍼 메서드들이 안전하게 구현되었습니다.

ChipType enum을 활용한 매핑으로 매직 넘버를 제거하고, 배열 범위 검증도 포함되어 있어 좋습니다.


208-302: UI 개발을 위한 Mock 데이터가 잘 준비되었습니다.

각 상태별로 다양한 테스트 케이스를 제공하여 UI 검증이 용이하도록 구성되어 있습니다.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch BOOK-170-feature/#106

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

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @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 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 for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

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

Documentation and Community

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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🧹 Nitpick comments (13)
src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift (1)

107-108: tintColor 설정이 중복될 수 있습니다.

Line 91에서 navigationBar.tintColor = .bkContentColor(.primary)로 이미 전체 네비게이션 바의 tint 색상이 설정되어 있는데, 개별 버튼에도 동일한 색상을 다시 설정하고 있습니다. 네비게이션 바의 tintColor 설정만으로도 충분할 것 같은데, 개별 설정이 필요한 특별한 이유가 있는지 확인해보세요.

만약 개별 설정이 불필요하다면 다음과 같이 제거할 수 있습니다:

        let searchButton = makeIconButton(BKImage.Icon.search, target: target, action: searchAction)
        let gearButton = makeIconButton(BKImage.Icon.settings, target: target, action: gearAction)
-       searchButton.tintColor = .bkContentColor(.primary)
-       gearButton.tintColor = .bkContentColor(.primary)
src/Projects/BKDesign/Sources/Components/Chip/BKChip.swift (2)

23-27: count가 0일 때 countLabel 숨김 처리를 고려해보세요.

현재 count가 0이어도 "0"이 표시됩니다. 일반적으로 count가 0일 때는 숫자를 표시하지 않는 것이 UX 관점에서 더 적절할 수 있습니다.

다음과 같이 수정하는 것을 고려해보세요:

public var count: Int = 0 {
    didSet {
-       countLabel.setText(text: "\(count)")
+       if count > 0 {
+           countLabel.setText(text: "\(count)")
+           countLabel.isHidden = false
+       } else {
+           countLabel.isHidden = true
+       }
    }
}

110-122: 접근성(Accessibility) 지원을 추가해보세요.

현재 탭 제스처만 구현되어 있는데, VoiceOver 등 접근성 도구 사용자를 위한 지원을 추가하면 더 좋을 것 같습니다.

setupGesture() 메서드에 다음을 추가하는 것을 고려해보세요:

private func setupGesture() {
    let tapGesture = UITapGestureRecognizer(
        target: self,
        action: #selector(handleTap)
    )
    addGestureRecognizer(tapGesture)
    isUserInteractionEnabled = true
+   
+   // Accessibility 지원
+   isAccessibilityElement = true
+   accessibilityTraits = .button
+   accessibilityLabel = title
}

그리고 updateAppearance() 메서드에서 선택 상태에 따른 accessibility 값도 업데이트하면 좋겠습니다.

src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (1)

178-189: 레이아웃 코드 중복을 제거해보세요.

layout()layoutforRecord() 메서드에서 author, separator, publisher 레이블의 우선순위 설정 코드가 중복되고 있습니다.

공통 설정을 별도 메서드로 분리하는 것을 고려해보세요:

+private func setupLabelPriorities() {
+    authorLabel.snp.makeConstraints {
+        $0.width.lessThanOrEqualTo(descriptionStack.snp.width)
+            .multipliedBy(LayoutConstants.authorMaxRatio)
+    }
+    
+    authorLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
+    authorLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
+    separatorLabel.setContentHuggingPriority(.required, for: .horizontal)
+    separatorLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
+    publisherLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
+    publisherLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
+}

그리고 각 layout 메서드 끝에서 이 메서드를 호출하면 됩니다.

Also applies to: 228-240

src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ChipData.swift (1)

37-44: BookStatus 반환 타입 최적화 고려

bookStatus computed property가 모든 케이스에서 non-nil 값을 반환하고 있는데, Optional 반환 타입이 필요한지 검토해보세요.

만약 모든 케이스가 유효한 BookStatus를 가진다면 다음과 같이 개선할 수 있습니다:

-var bookStatus: BookStatus? {
+var bookStatus: BookStatus {
     switch self {
-    case .total: return .total
-    case .toRead: return .toRead  
-    case .reading: return .reading
-    case .completed: return .completed
+    case .total: return .total
+    case .toRead: return .toRead
+    case .reading: return .reading  
+    case .completed: return .completed
     }
 }

이렇게 하면 호출하는 쪽에서 옵셔널 언래핑이 불필요해집니다.

src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift (3)

31-36: 칩 배열의 확장성 개선 고려

현재 4개의 칩이 하드코딩되어 있어 확장성이 제한적입니다. 향후 칩 개수 변경이 필요할 경우를 대비해 동적 생성 방식을 고려해보세요.

다음과 같이 개선할 수 있습니다:

-private let chip1 = BKChip(title: "", count: 0)
-private let chip2 = BKChip(title: "", count: 0)  
-private let chip3 = BKChip(title: "", count: 0)
-private let chip4 = BKChip(title: "", count: 0)
-
-private lazy var allChips: [BKChip] = [chip1, chip2, chip3, chip4]

+private lazy var allChips: [BKChip] = {
+    return ChipType.allCases.map { _ in BKChip(title: "", count: 0) }
+}()

이렇게 하면 ChipType의 케이스 변경에 자동으로 대응할 수 있습니다.


88-93: 성능 최적화 고려사항

books 배열이 변경될 때마다 updateEmptyState()reloadData()가 모두 호출됩니다. 대량의 데이터 업데이트 시 성능에 영향을 줄 수 있습니다.

배치 업데이트를 고려해보세요:

 private var books: [ArchiveBook] = [] {
     didSet {
-        updateEmptyState()
-        bookCollectionView.reloadData()
+        DispatchQueue.main.async { [weak self] in
+            self?.updateEmptyState()
+            self?.bookCollectionView.reloadData()
+        }
     }
 }

또는 updateData 메서드에서만 UI 업데이트를 수행하고 didSet에서는 제거하는 것도 고려해볼 수 있습니다.


199-210: 레이아웃 가이드 접근성 개선

ArchiveLayoutGuide가 extension 내부에 정의되어 있어 외부에서 접근하기 어렵습니다. 다른 곳에서도 사용될 가능성이 있다면 클래스 레벨로 이동을 고려해보세요.

 final class ArchiveView: BaseView {
+    enum ArchiveLayoutGuide {
+        static let cellHeight: CGFloat = 132
+        static let chipSpacing: CGFloat = BKSpacing.spacing2
+        static let chipViewHeight: CGFloat = 32
+        static let chipSectionInset = NSDirectionalEdgeInsets(
+            top: BKSpacing.spacing3,
+            leading: BKSpacing.spacing5,
+            bottom: BKSpacing.spacing3,
+            trailing: BKSpacing.spacing5
+        )
+    }
+
     // ... 나머지 코드

이렇게 하면 외부에서도 ArchiveView.ArchiveLayoutGuide.cellHeight 형태로 접근할 수 있습니다.

src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveCell.swift (1)

13-13: identifier 네이밍을 클래스 이름과 일치시키세요.

identifier가 "ArchiveResultCell"로 정의되어 있지만 클래스 이름은 ArchiveCell입니다. 일관성을 위해 identifier를 "ArchiveCell"로 변경하는 것이 좋습니다.

-    static let identifier = "ArchiveResultCell"
+    static let identifier = "ArchiveCell"
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift (1)

212-308: Mock 데이터 메서드에 TODO 마커를 추가하세요.

Mock 데이터 구현임을 더 명확히 하기 위해 TODO 마커를 추가하면 좋겠습니다.

 // MARK: - Mock Data -> API 연결 후 삭제
 
+// TODO: API 연결 후 실제 데이터 페칭 로직으로 교체
 private func createMockChips() -> [ChipData] {
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewController.swift (3)

86-89: TODO 주석을 추가하여 향후 구현 계획을 명시하세요.

네비게이션 구현이 보류된 것을 명확히 하기 위해 TODO를 추가하면 좋겠습니다.

 @objc
 private func searchButtonTapped() {
+    // TODO: 검색 화면 네비게이션 구현
     //        coordinator?.didTapSearchButton()
     print("검색 버튼 눌림")
 }

92-95: TODO 주석을 추가하여 향후 구현 계획을 명시하세요.

설정 화면 네비게이션 구현이 보류된 것을 명확히 하기 위해 TODO를 추가하면 좋겠습니다.

 @objc
 private func settingsButtonTapped() {
+    // TODO: 설정 화면 네비게이션 구현
     //        coordinator?.didTapSettingButton()
     print("세팅 버튼 눌림")
 }

98-102: TODO 주석을 추가하여 향후 구현 계획을 명시하세요.

책 상세 화면 네비게이션 구현이 보류된 것을 명확히 하기 위해 TODO를 추가하면 좋겠습니다.

 private func handleBookTapped(_ book: ArchiveBook) {
+    // TODO: 책 상세 화면 또는 기록 화면 네비게이션 구현
     // 책 상세 화면으로 이동하거나 기록 화면으로 이동
     //        coordinator?.showBookDetail(book: book)
     print("기록 선택됨: \(book.title)")
 }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 254eeba and 73d3ddc.

📒 Files selected for processing (14)
  • src/Projects/BKDesign/PreviewApp/Sources/View/BKChipDemoViewController.swift (1 hunks)
  • src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift (3 hunks)
  • src/Projects/BKDesign/Sources/Components/Chip/BKChip.swift (1 hunks)
  • src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (8 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveCell.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveCoordinator.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveTempViewController.swift (0 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewController.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ArchiveBook.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/Model/BookStatus.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ChipData.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift (1 hunks)
💤 Files with no reviewable changes (1)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveTempViewController.swift
🧰 Additional context used
🧠 Learnings (5)
📓 Common learnings
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsViewController.swift:3-5
Timestamp: 2025-07-22T05:39:10.746Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 UI 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 사용될 예정인 라이브러리들은 제거하지 않고 유지하는 것을 원한다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:124-133
Timestamp: 2025-07-10T08:21:49.399Z
Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코드는 별도 파일로 분리하지 않고 테스트 파일 내에 유지하는 것이 그들의 코드 구성 방식입니다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:38-48
Timestamp: 2025-07-08T17:17:40.046Z
Learning: doyeonk429는 BKDesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모드 색상을 반환하도록 의도적으로 구현했으며, 나중에 다크모드 디자인이 완성되면 해당 케이스만 구현하면 되는 구조로 설계했다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:0-0
Timestamp: 2025-07-10T08:21:44.204Z
Learning: doyeonk429는 BKDesign PreviewApp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성을 위한 것으로, 테스트 파일에서는 일반적인 "주석 처리된 코드 제거" 규칙을 적용하지 않는다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.
src/Projects/BKDesign/PreviewApp/Sources/View/BKChipDemoViewController.swift (5)

Learnt from: clxxrlove
PR: #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: clxxrlove
PR: #80
File: src/Projects/BKDesign/Sources/Components/BottomSheet/BKBottomSheetViewController.swift:148-148
Timestamp: 2025-07-14T05:23:04.937Z
Learning: Reed-iOS 프로젝트의 BKBottomSheetViewController에서 버튼 영역 높이(84)는 디자인 시스템에 기반한 의도적인 고정값입니다. clxxrlove에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.

Learnt from: doyeonk429
PR: #105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.

Learnt from: doyeonk429
PR: #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: #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/Summary/BKBookSummaryView.swift (3)

Learnt from: clxxrlove
PR: #80
File: src/Projects/BKDesign/Sources/Components/BottomSheet/BKBottomSheetViewController.swift:148-148
Timestamp: 2025-07-14T05:23:04.937Z
Learning: Reed-iOS 프로젝트의 BKBottomSheetViewController에서 버튼 영역 높이(84)는 디자인 시스템에 기반한 의도적인 고정값입니다. clxxrlove에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.

Learnt from: doyeonk429
PR: #68
File: src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift:86-92
Timestamp: 2025-07-10T08:21:16.126Z
Learning: BKButtonGroup의 horizontal 레이아웃에서 stackView.distribution을 .fillProportionally로 설정한 것은 의도된 디자인입니다. doyeonk429는 버튼들이 콘텐츠 길이에 따라 다른 너비를 가지는 것을 선호합니다.

Learnt from: doyeonk429
PR: #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/PreviewApp/Sources/View/CatalogViewController.swift (2)

Learnt from: doyeonk429
PR: #68
File: src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift:86-92
Timestamp: 2025-07-10T08:21:16.126Z
Learning: BKButtonGroup의 horizontal 레이아웃에서 stackView.distribution을 .fillProportionally로 설정한 것은 의도된 디자인입니다. doyeonk429는 버튼들이 콘텐츠 길이에 따라 다른 너비를 가지는 것을 선호합니다.

Learnt from: doyeonk429
PR: #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/BKPresentation/Sources/Common/Extension/UINavigationController+.swift (1)

Learnt from: doyeonk429
PR: #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)이 현재 다크 모드에서도 라이트 모드 색상을 반환하는 것은 의도적인 구현입니다. 아직 다크 모드가 구현되지 않았지만, 미래의 다크 모드 지원을 위한 코드 구조로 준비되어 있습니다.

🧬 Code Graph Analysis (6)
src/Projects/BKDesign/Sources/Components/Chip/BKChip.swift (4)
src/Projects/BKDesign/Sources/Components/Label/BKLabel.swift (3)
  • setText (80-83)
  • setFontStyle (75-78)
  • setColor (85-88)
src/Projects/BKDesign/PreviewApp/Sources/View/BKChipDemoViewController.swift (1)
  • setupUI (14-40)
src/Projects/BKDesign/Sources/Extensions/UIColor+.swift (4)
  • bkBaseColor (91-102)
  • bkBorderColor (65-76)
  • bkBackgroundColor (38-50)
  • bkContentColor (52-63)
src/Projects/BKDesign/Sources/Extensions/UIView+.swift (1)
  • addSubviews (7-9)
src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ArchiveBook.swift (1)
src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ChipData.swift (2)
  • hash (10-12)
  • lhs (14-19)
src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (2)
src/Projects/BKDesign/Sources/Components/Label/BKLabel.swift (1)
  • setText (80-83)
src/Projects/BKDesign/Sources/Extensions/UIView+.swift (1)
  • addSubviews (7-9)
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveCell.swift (2)
src/Projects/BKDesign/Sources/Extensions/UIView+.swift (1)
  • addSubviews (7-9)
src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (2)
  • clearView (134-142)
  • configure (103-132)
src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift (1)
src/Projects/BKDesign/Sources/Extensions/UIColor+.swift (1)
  • bkContentColor (52-63)
src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ChipData.swift (1)
src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ArchiveBook.swift (2)
  • hash (13-16)
  • lhs (18-23)
🪛 SwiftLint (0.57.0)
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewController.swift

[Warning] 39-39: Remove overridden functions that don't do anything except call their super

(unneeded_override)

🔇 Additional comments (8)
src/Projects/BKDesign/Sources/Components/Chip/BKChip.swift (1)

41-44: LGTM! 적절한 cornerRadius 설정입니다.

layoutSubviews에서 프레임 높이의 절반으로 cornerRadius를 설정하여 완전한 pill 모양을 만드는 것은 적절한 구현입니다.

src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (1)

90-96: 초기화 로직의 분기 처리가 적절합니다.

스타일에 따라 다른 setup/layout 메서드를 호출하는 방식이 명확하고 이해하기 쉽습니다.

src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveCoordinator.swift (1)

19-22: LGTM! MVVM 패턴 적용이 적절합니다.

임시 뷰컨트롤러에서 실제 ArchiveViewController와 ArchiveViewModel을 사용하는 구조로 변경된 것이 좋습니다. 의존성 주입과 coordinator 할당이 올바르게 구현되었습니다.

src/Projects/BKPresentation/Sources/ArchiveFlow/Model/BookStatus.swift (1)

5-10: LGTM! 명확하고 간결한 enum 정의입니다.

책의 읽기 상태를 나타내는 enum이 명확하게 정의되었습니다. String raw value와 CaseIterable 준수가 적절하며, 한국어 케이스명도 직관적입니다.

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

44-48: LGTM! 기존 패턴과 일관성 있는 구현입니다.

새로운 BKChip 데모 버튼과 네비게이션 로직이 기존 카탈로그의 패턴을 잘 따르고 있습니다. 버튼 생성, 스택뷰 추가, 액션 바인딩이 모두 일관성 있게 구현되었습니다.

Also applies to: 65-66, 87-93

src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ChipData.swift (1)

5-20: LGTM! 일관성 있는 해시 및 동등성 구현

ChipData에서 해시와 동등성 비교가 모두 title 기준으로 일관성 있게 구현되어 있어 좋습니다. ArchiveBook과 달리 올바른 패턴을 따르고 있습니다.

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

7-41: LGTM! BKChip 컴포넌트 데모 구현이 적절합니다.

BKChip의 활성화/비활성화 상태를 명확하게 보여주는 데모 구현입니다. UI 설정과 레이아웃이 적절하고, 각 칩의 상태별 동작을 잘 보여주고 있습니다.

src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift (1)

154-163: LGTM! 데이터 업데이트 로직이 깔끔합니다.

칩과 책 데이터를 동시에 업데이트하는 메서드가 잘 구현되어 있습니다. 인덱스 범위 체크도 적절히 되어 있어 안전합니다.

Comment thread src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift Outdated
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/Summary/BKBookSummaryView.swift (1)

89-97: 메서드명 네이밍 컨벤션 수정이 필요합니다.

이전 리뷰에서 언급된 대로 setupforRecordlayoutforRecordsetupForRecordlayoutForRecord로 수정해주세요.

🧹 Nitpick comments (1)
src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (1)

153-240: 코드 중복을 제거하여 유지보수성을 개선해주세요.

layout() 메서드와 layoutForRecord() 메서드에서 content hugging/compression resistance 설정 코드가 중복됩니다. 이 부분을 별도 메서드로 추출하는 것을 고려해보세요.

예시:

private func configureContentPriorities() {
    authorLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
    authorLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    separatorLabel.setContentHuggingPriority(.required, for: .horizontal)
    separatorLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
    publisherLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
    publisherLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
}

그리고 두 layout 메서드에서 이를 호출하도록 수정할 수 있습니다.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 73d3ddc and 7c4503e.

📒 Files selected for processing (2)
  • src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (8 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ArchiveBook.swift (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/Model/ArchiveBook.swift
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsViewController.swift:3-5
Timestamp: 2025-07-22T05:39:10.746Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 UI 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 사용될 예정인 라이브러리들은 제거하지 않고 유지하는 것을 원한다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:124-133
Timestamp: 2025-07-10T08:21:49.399Z
Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코드는 별도 파일로 분리하지 않고 테스트 파일 내에 유지하는 것이 그들의 코드 구성 방식입니다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:38-48
Timestamp: 2025-07-08T17:17:40.046Z
Learning: doyeonk429는 BKDesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모드 색상을 반환하도록 의도적으로 구현했으며, 나중에 다크모드 디자인이 완성되면 해당 케이스만 구현하면 되는 구조로 설계했다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:0-0
Timestamp: 2025-07-10T08:21:44.204Z
Learning: doyeonk429는 BKDesign PreviewApp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성을 위한 것으로, 테스트 파일에서는 일반적인 "주석 처리된 코드 제거" 규칙을 적용하지 않는다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.
src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (10)

Learnt from: doyeonk429
PR: #105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.

Learnt from: doyeonk429
PR: #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: clxxrlove
PR: #80
File: src/Projects/BKDesign/Sources/Components/BottomSheet/BKBottomSheetViewController.swift:148-148
Timestamp: 2025-07-14T05:23:04.937Z
Learning: Reed-iOS 프로젝트의 BKBottomSheetViewController에서 버튼 영역 높이(84)는 디자인 시스템에 기반한 의도적인 고정값입니다. clxxrlove에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.

Learnt from: doyeonk429
PR: #68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:0-0
Timestamp: 2025-07-10T08:21:44.204Z
Learning: doyeonk429는 BKDesign PreviewApp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성을 위한 것으로, 테스트 파일에서는 일반적인 "주석 처리된 코드 제거" 규칙을 적용하지 않는다.

Learnt from: doyeonk429
PR: #98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsViewController.swift:3-5
Timestamp: 2025-07-22T05:39:10.746Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 UI 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 사용될 예정인 라이브러리들은 제거하지 않고 유지하는 것을 원한다.

Learnt from: clxxrlove
PR: #69
File: src/Projects/BKDesign/PreviewApp/Sources/View/CatalogViewController.swift:57-70
Timestamp: 2025-07-10T14:01:04.933Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 요구사항을 적용하지 않는 것을 선호한다.

Learnt from: doyeonk429
PR: #98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.

Learnt from: clxxrlove
PR: #94
File: src/Projects/BKData/Sources/Repository/DefaultBookRepository.swift:15-40
Timestamp: 2025-07-21T05:16:18.481Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것을 선호한다.

Learnt from: doyeonk429
PR: #68
File: src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift:86-92
Timestamp: 2025-07-10T08:21:16.126Z
Learning: BKButtonGroup의 horizontal 레이아웃에서 stackView.distribution을 .fillProportionally로 설정한 것은 의도된 디자인입니다. doyeonk429는 버튼들이 콘텐츠 길이에 따라 다른 너비를 가지는 것을 선호합니다.

Learnt from: clxxrlove
PR: #94
File: src/Projects/BKData/Sources/API/BookAPI.swift:51-58
Timestamp: 2025-07-20T08:11:52.850Z
Learning: Reed-iOS 프로젝트에서 clxxrlove는 미구현 기능의 경우 API 구조를 먼저 정의하고 실제 구현은 나중에 하는 단계적 개발 방식을 사용한다. upsert 같은 기능에서 body가 nil로 설정되어 있어도 이는 의도적인 것일 수 있다.

🧬 Code Graph Analysis (1)
src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (2)
src/Projects/BKDesign/Sources/Components/Label/BKLabel.swift (1)
  • setText (80-83)
src/Projects/BKDesign/Sources/Extensions/UIView+.swift (1)
  • addSubviews (7-9)
🔇 Additional comments (5)
src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (5)

10-10: 새로운 record 스타일 케이스 추가가 적절합니다.

.record 케이스가 .regular와 동일한 썸네일 크기와 placeholder를 사용하는 것이 일관성 있고 합리적입니다.

Also applies to: 15-15, 23-23


33-33: record 스타일을 위한 UI 컴포넌트들이 잘 구성되었습니다.

textContainer, recordView, 그리고 관련 레이블들이 디자인 시스템에 맞게 적절히 추가되었습니다.

Also applies to: 68-80


107-107: recordCount 파라미터 추가가 잘 설계되었습니다.

옵셔널 파라미터로 하위 호환성을 유지하면서 새로운 기능을 깔끔하게 추가했습니다.

Also applies to: 128-132


139-142: clearView 메서드에 record 관련 정리 로직이 적절히 추가되었습니다.

새로운 UI 요소들에 대한 정리 작업이 일관성 있게 구현되었습니다.


247-247: 레이아웃 상수 추가가 적절합니다.

디자인 시스템의 BKSpacing.spacing4를 사용한 일관성 있는 구현입니다.

Copy link
Copy Markdown
Member

@clxxrlove clxxrlove left a comment

Choose a reason for hiding this comment

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

이것도 레이아웃이 꽤나 복잡하네요.
수고하셨습니다.

Comment thread src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift Outdated
Comment thread src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift
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: 2

♻️ Duplicate comments (1)
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift (1)

95-104: BaseView의 setupLayout() 자동 호출 활용

BaseView에서 setupLayout()을 자동으로 호출하므로 102번 라인의 직접 호출은 불필요합니다.

 override func setupView() {
     super.setupView()
     backgroundColor = .bkBaseColor(.primary)
     
     setupChipActions()
     setupScrollView()
     addSubviews(chipScrollView, bookCollectionView, emptyStateView)
-    setupLayout()
     updateEmptyState()
 }
🧹 Nitpick comments (2)
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift (1)

204-214: ArchiveLayoutGuide enum 위치 조정

레이아웃 상수를 정의하는 enum이 UICollectionViewDataSource extension 내부에 위치해 있습니다. 더 나은 구조를 위해 메인 클래스 내부나 파일 레벨로 이동하는 것을 고려해보세요.

-extension ArchiveView: UICollectionViewDataSource {
+// MARK: - Layout Constants
+private enum ArchiveLayoutGuide {
+    static let cellHeight: CGFloat = 132
+    static let chipSpacing: CGFloat = BKSpacing.spacing2
+    static let chipViewHeight: CGFloat = 36
+    static let chipSectionInset = NSDirectionalEdgeInsets(
+        top: BKSpacing.spacing3,
+        leading: BKSpacing.spacing5,
+        bottom: BKSpacing.spacing3,
+        trailing: BKSpacing.spacing5
+    )
+}
+
+extension ArchiveView: UICollectionViewDataSource {
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
         return books.count
     }
     
     // ... rest of the code ...
-    
-    enum ArchiveLayoutGuide {
-        static let cellHeight: CGFloat = 132
-        static let chipSpacing: CGFloat = BKSpacing.spacing2
-        static let chipViewHeight: CGFloat = 36
-        static let chipSectionInset = NSDirectionalEdgeInsets(
-            top: BKSpacing.spacing3,
-            leading: BKSpacing.spacing5,
-            bottom: BKSpacing.spacing3,
-            trailing: BKSpacing.spacing5
-        )
-    }
 }
src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift (1)

171-175: 중복 체크 로직 성능 개선

현재 중복 체크가 O(n²) 복잡도를 가집니다. Set을 활용하면 성능을 개선할 수 있습니다.

 let uniqueBooks = books.filter { book in
     !self.allBooks.contains { $0 == book }
 }

더 효율적인 방법:

let existingISBNs = Set(self.allBooks.map { $0.isbn })
let uniqueBooks = books.filter { !existingISBNs.contains($0.isbn) }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 1cbd4f5 and bfd3536.

📒 Files selected for processing (3)
  • src/Projects/BKDesign/Sources/Components/Chip/BKChip.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/Projects/BKDesign/Sources/Components/Chip/BKChip.swift
🧰 Additional context used
🧠 Learnings (13)
📓 Common learnings
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsViewController.swift:3-5
Timestamp: 2025-07-22T05:39:10.746Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 UI 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 사용될 예정인 라이브러리들은 제거하지 않고 유지하는 것을 원한다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:124-133
Timestamp: 2025-07-10T08:21:49.399Z
Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코드는 별도 파일로 분리하지 않고 테스트 파일 내에 유지하는 것이 그들의 코드 구성 방식입니다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:38-48
Timestamp: 2025-07-08T17:17:40.046Z
Learning: doyeonk429는 BKDesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모드 색상을 반환하도록 의도적으로 구현했으며, 나중에 다크모드 디자인이 완성되면 해당 케이스만 구현하면 되는 구조로 설계했다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:0-0
Timestamp: 2025-07-10T08:21:44.204Z
Learning: doyeonk429는 BKDesign PreviewApp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성을 위한 것으로, 테스트 파일에서는 일반적인 "주석 처리된 코드 제거" 규칙을 적용하지 않는다.
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.
📚 Learning: doyeonk429는 bottomtabbarcontroller에서 viewdidlayoutsubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#105
File: src/Projects/BKPresentation/Sources/TabBarFlow/BottomTabBarController.swift:24-30
Timestamp: 2025-07-24T13:00:59.096Z
Learning: doyeonk429는 BottomTabBarController에서 viewDidLayoutSubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케이스가 거의 없기 때문에 성능 최적화보다는 현재의 단순한 구현 방식이 더 적합하다고 판단합니다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift
  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: the loginviewmodel's authenticatewithtoken case in src/projects/bkpresentation/sources/authflow/view...
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.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 bkdesign previewapp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:0-0
Timestamp: 2025-07-10T08:21:44.204Z
Learning: doyeonk429는 BKDesign PreviewApp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성을 위한 것으로, 테스트 파일에서는 일반적인 "주석 처리된 코드 제거" 규칙을 적용하지 않는다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 emotionregistrationview에서 someemotion1-4 케이스들을 임시로 구현했으며, 해당하는 그래픽 디자인이 나온 후 수정할 예정이라고 명시...
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#112
File: src/Projects/BKPresentation/Sources/MainFlow/Note/View/EmotionRegistrationView.swift:52-53
Timestamp: 2025-07-28T10:44:32.256Z
Learning: clxxrlove는 EmotionRegistrationView에서 someEmotion1-4 케이스들을 임시로 구현했으며, 해당하는 그래픽 디자인이 나온 후 수정할 예정이라고 명시했다. 감정 선택 UI는 디자인 에셋 완성 후 구현하는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 reed-ios 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: url 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 reed-ios 프로젝트에서 ui 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 ...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsViewController.swift:3-5
Timestamp: 2025-07-22T05:39:10.746Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 UI 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 사용될 예정인 라이브러리들은 제거하지 않고 유지하는 것을 원한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 bkdesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#63
File: src/Projects/BKDesign/Sources/Extensions/UIColor+.swift:38-48
Timestamp: 2025-07-08T17:17:40.046Z
Learning: doyeonk429는 BKDesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모드 색상을 반환하도록 의도적으로 구현했으며, 나중에 다크모드 디자인이 완성되면 해당 케이스만 구현하면 되는 구조로 설계했다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코...
Learnt from: doyeonk429
PR: YAPP-Github/Reed-iOS#68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:124-133
Timestamp: 2025-07-10T08:21:49.399Z
Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코드는 별도 파일로 분리하지 않고 테스트 파일 내에 유지하는 것이 그들의 코드 구성 방식입니다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 noteview의 nextbuttontapped 메서드에서 폼 검증 실패 시 첫 번째 페이지로 되돌아가는 로직을 임시로 구현했으며, 추후 적절한 에러 처리 로직...
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#112
File: src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift:128-140
Timestamp: 2025-07-28T10:45:09.696Z
Learning: clxxrlove는 NoteView의 nextButtonTapped 메서드에서 폼 검증 실패 시 첫 번째 페이지로 되돌아가는 로직을 임시로 구현했으며, 추후 적절한 에러 처리 로직을 추가할 예정이라고 명시했다. 임시 화면 구현 단계에서는 기본 동작에 집중하고 에러 처리는 후속 작업으로 계획하는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 reed-ios 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것...
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#94
File: src/Projects/BKData/Sources/Repository/DefaultBookRepository.swift:15-40
Timestamp: 2025-07-21T05:16:18.481Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: clxxrlove는 reed-ios 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 ...
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.933Z
Learning: clxxrlove는 Reed-iOS 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 요구사항을 적용하지 않는 것을 선호한다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift
📚 Learning: reed-ios 프로젝트의 bkbottomsheetviewcontroller에서 버튼 영역 높이(84)는 디자인 시스템에 기반한 의도적인 고정값입니다. clxxrlove에 따르면 ...
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#80
File: src/Projects/BKDesign/Sources/Components/BottomSheet/BKBottomSheetViewController.swift:148-148
Timestamp: 2025-07-14T05:23:04.937Z
Learning: Reed-iOS 프로젝트의 BKBottomSheetViewController에서 버튼 영역 높이(84)는 디자인 시스템에 기반한 의도적인 고정값입니다. clxxrlove에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.

Applied to files:

  • src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveViewModel.swift

Comment thread src/Projects/BKPresentation/Sources/ArchiveFlow/ArchiveView.swift
@doyeonk429 doyeonk429 merged commit e796716 into develop Jul 31, 2025
2 checks passed
@doyeonk429 doyeonk429 deleted the BOOK-170-feature/#106 branch July 31, 2025 14:07
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-170/feat] 내서재 기본 UI 구현

2 participants