Skip to content

feat: 도서 등록 Flow 추가#103

Merged
clxxrlove merged 7 commits into
developfrom
BOOK-159-feature/#97
Jul 23, 2025
Merged

feat: 도서 등록 Flow 추가#103
clxxrlove merged 7 commits into
developfrom
BOOK-159-feature/#97

Conversation

@clxxrlove
Copy link
Copy Markdown
Member

@clxxrlove clxxrlove commented Jul 23, 2025

🔗 관련 이슈

📘 작업 유형

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

📙 작업 내역

  • 도서 등록 화면 추가
  • 도서 기록 제안 화면 추가
  • (결과적으로 쓰이진 못했으나) ButtonGroup이 여러 Button에 대해 영역 계산을 잘못하던 부분 수정

🧪 테스트 내역

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

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

ScreenRecording_07-23-2025.21-03-56_1.MP4

✅ PR 체크리스트

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

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

  • 사실, 도서 등록 화면에서 ButtonGroup.threeButtonGroup(_:)를 사용하려고 했는데요,
    디자인 시스템을 보아하니 이쪽 화면에서 쓰겠거니 해서 써보려고 했는데, 그렇지는 않더라구요.
    어떤 의도로 작성된지 궁금해요. 질문드립니다 !

Summary by CodeRabbit

  • 신규 기능

    • 도서 등록 상태를 선택할 수 있는 새로운 선택 컨트롤이 추가되었습니다.
    • 검색 결과에서 도서를 선택하면 도서 등록을 위한 하단 시트가 표시되고, 등록 상태 선택 및 등록 버튼이 제공됩니다.
    • 도서 등록 후, 독서 노트 시작을 제안하는 안내 시트가 추가되었습니다.
  • 버그 수정

    • 버튼 그룹의 가로 배치 시 버튼 크기가 균등하게 조정됩니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 23, 2025

"""

Walkthrough

도서 검색 결과에서 도서를 탭하면 도서 등록 플로우가 실행되도록 기능이 추가되었습니다. 새로운 BookRegistrationStatusView가 도서 등록 상태 선택을 담당하며, 등록 버튼 및 후속 안내 시트가 추가되었습니다. 기존 코드에는 일부 스타일 및 주석 변경이 이루어졌습니다.

Changes

파일/경로 변경 요약
src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift .horizontal 레이아웃에서 stackView의 distribution을 .fillEqually로 변경
src/Projects/BKPresentation/Sources/MainFlow/Search/View/BookRegistrationStatusView.swift BookRegistrationStatusView UIView 및 BookRegistrationStatus enum 신설, 상태 선택 및 콜백 처리 추가
src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchView.swift UICollectionViewDelegate 확장: didSelectItemAt 구현, 도서 선택 시 이벤트 전송
src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchViewController.swift SearchViewEvent에 .upsertBook(String) 추가, 도서 등록/상태 선택/후속 안내 시트 플로우 구현
src/Projects/BKPresentation/Sources/MainFlow/Search/ViewModel/SearchViewModel.swift Action, SideEffect enum에 upsertBook 관련 주석 추가(실제 기능 영향 없음)

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant SearchView
    participant SearchViewController
    participant BookRegistrationStatusView

    User->>SearchView: 도서 검색 결과 아이템 탭
    SearchView->>SearchViewController: .upsertBook(isbn) 이벤트 전송
    SearchViewController->>BookRegistrationStatusView: 도서 등록 시트 표시
    User->>BookRegistrationStatusView: 상태 선택
    BookRegistrationStatusView->>SearchViewController: onSelected 콜백
    User->>BookRegistrationStatusView: "도서 등록" 버튼 탭
    BookRegistrationStatusView->>SearchViewController: 시트 닫기, handleRegistrationSelection 호출
    SearchViewController->>User: 등록 안내 시트 표시(노트 시작 여부)
    User->>SearchViewController: "네, 시작할게요!" 또는 "아니요, 나중에요" 탭
    SearchViewController->>User: 시트 닫기
Loading

Estimated code review effort

3 (~45분)

Suggested reviewers

  • doyeonk429
    """

📜 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 f92eeb3 and fcf2f7e.

📒 Files selected for processing (1)
  • src/Projects/BKPresentation/Sources/MainFlow/Search/View/BookRegistrationStatusView.swift (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Projects/BKPresentation/Sources/MainFlow/Search/View/BookRegistrationStatusView.swift
⏰ 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
✨ 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-159-feature/#97

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

🧹 Nitpick comments (3)
src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchViewController.swift (3)

71-80: 이벤트 구독 로직 개선 필요

변수명이 혼란스럽습니다. ISBN을 처리하는데 변수명이 query로 되어 있어 의미가 명확하지 않습니다.

-            .sink { [weak self] query in
-                self?.presentBookRegistration(with: query)
+            .sink { [weak self] isbn in
+                self?.presentBookRegistration(with: isbn)

125-130: TODO 주석 해결 필요

정적 분석 도구에서 지적한 대로 TODO 주석이 있습니다. 현재는 로깅만 하고 있지만, 실제 뷰모델 액션 연결이 필요합니다.

향후 뷰모델 연결 구현에 도움이 필요하시면 코드 생성을 도와드릴 수 있습니다.


132-155: 노트 제안 플로우 완성도 높음

두 번째 바텀시트를 통한 노트 제안 플로우가 사용자 경험을 고려하여 잘 설계되었습니다. 버튼 액션도 적절하게 구현되어 있습니다.

그래픽 디자인 작업 완료 후 실제 이미지로 교체하는 것을 잊지 마세요 (TODO 주석 참고).

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between d82d6ae and f92eeb3.

📒 Files selected for processing (5)
  • src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Search/View/BookRegistrationStatusView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchViewController.swift (3 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Search/ViewModel/SearchViewModel.swift (2 hunks)
🧠 Learnings (4)
📓 Common learnings
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#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로 설정되어 있어도 이는 의도적인 것일 수 있다.
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 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것을 선호한다.
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: 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에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.
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 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 요구사항을 적용하지 않는 것을 선호한다.
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/Button/BKButtonGroup.swift (1)

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는 버튼들이 콘텐츠 길이에 따라 다른 너비를 가지는 것을 선호합니다.

src/Projects/BKPresentation/Sources/MainFlow/Search/ViewModel/SearchViewModel.swift (2)

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: #79
File: src/Projects/BKPresentation/Sources/MainFlow/Setting/ViewModel/SettingViewModel.swift:34-35
Timestamp: 2025-07-11T12:13:49.406Z
Learning: clxxrlove prefers to comment out incomplete features in SettingViewModel (like logout and withdrawal functionality) rather than removing them entirely, keeping the architecture ready for future implementation. This approach allows for easier connection of functionality when ready to implement.

src/Projects/BKPresentation/Sources/MainFlow/Search/View/BookRegistrationStatusView.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: 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에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.

🪛 SwiftLint (0.57.0)
src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchViewController.swift

[Warning] 128-128: TODOs should be resolved (- upsert 성공 시 따라오는 동작으로 변경해야 함)

(todo)


[Warning] 133-133: TODOs should be resolved (- 그래픽 디자인 작업 이후 변경)

(todo)

🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
Learnt from: clxxrlove
PR: YAPP-Github/Reed-iOS#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로 설정되어 있어도 이는 의도적인 것일 수 있다.
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 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것을 선호한다.
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: 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에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.
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 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 요구사항을 적용하지 않는 것을 선호한다.
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/Button/BKButtonGroup.swift (1)

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는 버튼들이 콘텐츠 길이에 따라 다른 너비를 가지는 것을 선호합니다.

src/Projects/BKPresentation/Sources/MainFlow/Search/ViewModel/SearchViewModel.swift (2)

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: #79
File: src/Projects/BKPresentation/Sources/MainFlow/Setting/ViewModel/SettingViewModel.swift:34-35
Timestamp: 2025-07-11T12:13:49.406Z
Learning: clxxrlove prefers to comment out incomplete features in SettingViewModel (like logout and withdrawal functionality) rather than removing them entirely, keeping the architecture ready for future implementation. This approach allows for easier connection of functionality when ready to implement.

src/Projects/BKPresentation/Sources/MainFlow/Search/View/BookRegistrationStatusView.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: 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에 따르면 작은 기기에서도 동일한 크기가 유지되어야 하며, 동적 계산보다는 상수화만 필요합니다.

🪛 SwiftLint (0.57.0)
src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchViewController.swift

[Warning] 128-128: TODOs should be resolved (- upsert 성공 시 따라오는 동작으로 변경해야 함)

(todo)


[Warning] 133-133: TODOs should be resolved (- 그래픽 디자인 작업 이후 변경)

(todo)

🔇 Additional comments (10)
src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift (1)

102-102: 변경된 수평 버튼 분포(.fillEqually)에 의도치 않은 영향 없음

전체 코드베이스에서 .horizontal 레이아웃을 사용하는 곳은 다음 두 곳뿐입니다:

  • threeButtonGroup 메서드 (src/Projects/BKDesign/Sources/Components/Button/BKButtonGroup.swift:202)
  • 데모 뷰 컨트롤러 (src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonGroupDemoViewController.swift)

BKDialogBKBottomSheetViewController 등 프로덕션 컴포넌트에는 .horizontal 레이아웃 호출이 없어, 이번 변경으로 인한 부작용은 없습니다.

변경 사항을 그대로 진행해도 좋습니다.

src/Projects/BKPresentation/Sources/MainFlow/Search/ViewModel/SearchViewModel.swift (2)

31-31: 단계적 개발 접근 방식을 확인했습니다.

도서 등록 기능을 위한 upsertBook 액션이 주석 처리되어 있습니다. 학습된 패턴에 따르면 UI 구현을 먼저 완료하고 뷰모델 연결은 후속 단계에서 진행하는 방식으로 보입니다.


42-42: SideEffect 준비 코드 확인

upsert(Book) 사이드이펙트도 향후 구현을 위해 준비되어 있습니다. Action과 SideEffect가 일관되게 준비된 점이 좋습니다.

src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchView.swift (1)

238-246: 도서 선택 이벤트 처리가 올바르게 구현되었습니다.

컬렉션 뷰 델리게이트 메서드가 적절하게 구현되었습니다. 안전한 언래핑과 패턴 매칭을 사용하여 도서 결과인 경우에만 .upsertBook 이벤트를 전송하는 로직이 정확합니다.

src/Projects/BKPresentation/Sources/MainFlow/Search/View/SearchViewController.swift (2)

12-12: 새로운 이벤트 케이스 추가 확인

.upsertBook(String) 이벤트 케이스가 적절하게 추가되었습니다. ISBN을 문자열로 전달하는 설계가 합리적입니다.


104-123: 도서 등록 플로우 구현이 잘 되었습니다.

바텀시트를 활용한 도서 등록 UI 플로우가 체계적으로 구현되었습니다. BookRegistrationStatusView와의 연동 로직도 적절합니다.

src/Projects/BKPresentation/Sources/MainFlow/Search/View/BookRegistrationStatusView.swift (4)

7-11: 도서 등록 상태 열거형이 적절하게 정의되었습니다.

읽기 상태를 나타내는 enum이 명확하고 직관적인 rawValue와 함께 잘 정의되었습니다.


13-35: 뷰 컴포넌트 구조가 잘 설계되었습니다.

콜백 패턴을 활용한 선택 상태 알림 메커니즘과 적절한 접근 제어자 사용이 인상적입니다. private(set)을 사용하여 외부에서 읽기만 가능하도록 한 점이 좋습니다.


38-65: 레이아웃 설정이 체계적으로 구현되었습니다.

SnapKit을 활용한 제약 조건 설정과 버튼 생성 로직이 깔끔합니다. BKButtonGroup의 변경사항과 일치하는 .fillEqually 분산 방식을 사용한 점도 좋습니다.


79-82: 레이아웃 상수 정의가 적절합니다.

버튼 높이를 상수로 정의하여 유지보수성을 높인 점이 좋습니다.

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.

사실 버튼 그룹은 1개 2개 조합만 있는 거였는데, 혹시 사용하실 일 있으실까봐 바텀시트 예시에 있는 3개짜리 버튼 그룹도 임시로 만들어둔거였습니다 ! 실제로 디자인에서 차이가 있었는지는 미처 고려하지 못했네요 ㅠㅠ 죄송합니다

@clxxrlove clxxrlove merged commit e92f32f into develop Jul 23, 2025
3 checks passed
@clxxrlove clxxrlove deleted the BOOK-159-feature/#97 branch July 23, 2025 14:48
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-159/feat] 도서 검색 결과 액션 추가

2 participants