feat: 도서 등록 Flow 추가#103
Conversation
|
""" Walkthrough도서 검색 결과에서 도서를 탭하면 도서 등록 플로우가 실행되도록 기능이 추가되었습니다. 새로운 BookRegistrationStatusView가 도서 등록 상태 선택을 담당하며, 등록 버튼 및 후속 안내 시트가 추가되었습니다. 기존 코드에는 일부 스타일 및 주석 변경이 이루어졌습니다. Changes
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: 시트 닫기
Estimated code review effort3 (~45분) Suggested reviewers
📜 Recent review detailsConfiguration used: .coderabbit.yaml 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ 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)
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. 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)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
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
📒 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)
BKDialog나BKBottomSheetViewController등 프로덕션 컴포넌트에는.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: 레이아웃 상수 정의가 적절합니다.버튼 높이를 상수로 정의하여 유지보수성을 높인 점이 좋습니다.
There was a problem hiding this comment.
사실 버튼 그룹은 1개 2개 조합만 있는 거였는데, 혹시 사용하실 일 있으실까봐 바텀시트 예시에 있는 3개짜리 버튼 그룹도 임시로 만들어둔거였습니다 ! 실제로 디자인에서 차이가 있었는지는 미처 고려하지 못했네요 ㅠㅠ 죄송합니다
🔗 관련 이슈
📘 작업 유형
📙 작업 내역
🧪 테스트 내역
🎨 스크린샷 또는 시연 영상 (선택)
ScreenRecording_07-23-2025.21-03-56_1.MP4
✅ PR 체크리스트
💬 추가 설명 or 리뷰 포인트 (선택)
ButtonGroup.threeButtonGroup(_:)를 사용하려고 했는데요,디자인 시스템을 보아하니 이쪽 화면에서 쓰겠거니 해서 써보려고 했는데, 그렇지는 않더라구요.
어떤 의도로 작성된지 궁금해요. 질문드립니다 !
Summary by CodeRabbit
신규 기능
버그 수정