feat: 내서재 기본 UI만 구현#121
Conversation
Walkthrough본 변경사항은 "내 서재"(Archive) 화면의 기본 UI를 구현합니다. 필터 칩 컴포넌트, 책 셀, 빈 상태 화면, 칩 및 책 데이터 모델, 뷰모델, 뷰, 뷰컨트롤러, 셀, 칩 컴포넌트 등이 신규로 추가되었으며, 관련된 임시 뷰 컨트롤러가 제거되고, 네비게이션 스타일 일부가 보완되었습니다. Changes
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)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~40 minutes Assessment against linked issues
Suggested labels
Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. 📜 Recent review detailsConfiguration used: .coderabbit.yaml 📒 Files selected for processing (1)
🧰 Additional context used🧠 Learnings (12)📓 Common learnings📚 Learning: the loginviewmodel's authenticatewithtoken case in src/projects/bkpresentation/sources/authflow/view...Applied to files:
📚 Learning: doyeonk429는 bkdesign previewapp의 테스트 파일에서 주석 처리된 코드를 의도적으로 남겨두어 쉽게 테스트 구성을 전환할 수 있도록 구현한다. 이는 개발 편의성...Applied to files:
📚 Learning: clxxrlove는 emotionregistrationview에서 someemotion1-4 케이스들을 임시로 구현했으며, 해당하는 그래픽 디자인이 나온 후 수정할 예정이라고 명시...Applied to files:
📚 Learning: doyeonk429는 reed-ios 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: url 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시...Applied to files:
📚 Learning: doyeonk429는 reed-ios 프로젝트에서 ui 구현 단계에서 미래의 기능 연결을 위해 필요한 import들을 미리 추가해두는 방식을 선호한다. 현재 사용되지 않더라도 곧 ...Applied to files:
📚 Learning: doyeonk429는 bottomtabbarcontroller에서 viewdidlayoutsubviews의 레이어 재생성 방식을 유지하기를 선호합니다. 탭바에서는 레이아웃 변경 케...Applied to files:
📚 Learning: doyeonk429는 bkdesign 프로젝트에서 다크모드 지원 코드를 미래를 위한 사전 준비 코드로 구현하고 있다. 현재 다크모드 디자인이 없어서 모든 다크모드 분기에서 라이트모...Applied to files:
📚 Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코...Applied to files:
📚 Learning: clxxrlove는 reed-ios 프로젝트에서 기능 구현 시 우선순위를 명확하게 설정한다. 기본 기능 구현을 먼저 완료하고, 에러 처리나 안정성 개선은 이후 단계에서 진행하는 것...Applied to files:
📚 Learning: clxxrlove는 noteview의 nextbuttontapped 메서드에서 폼 검증 실패 시 첫 번째 페이지로 되돌아가는 로직을 임시로 구현했으며, 추후 적절한 에러 처리 로직...Applied to files:
📚 Learning: clxxrlove는 reed-ios 프로젝트에서 테스트/데모용 코드와 프로덕션 코드에 대해 다른 코드 품질 기준을 적용한다. 테스트용 뷰에서는 안전성 검증 등의 엄격한 코드 품질 ...Applied to files:
🔇 Additional comments (6)
✨ 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: 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 반환 타입 최적화 고려
bookStatuscomputed 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
📒 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! 데이터 업데이트 로직이 깔끔합니다.칩과 책 데이터를 동시에 업데이트하는 메서드가 잘 구현되어 있습니다. 인덱스 범위 체크도 적절히 되어 있어 안전합니다.
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (1)
src/Projects/BKDesign/Sources/Components/Summary/BKBookSummaryView.swift (1)
89-97: 메서드명 네이밍 컨벤션 수정이 필요합니다.이전 리뷰에서 언급된 대로
setupforRecord와layoutforRecord를setupForRecord와layoutForRecord로 수정해주세요.
🧹 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
📒 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를 사용한 일관성 있는 구현입니다.
clxxrlove
left a comment
There was a problem hiding this comment.
이것도 레이아웃이 꽤나 복잡하네요.
수고하셨습니다.
There was a problem hiding this comment.
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
📒 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.swiftsrc/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
🔗 관련 이슈
📘 작업 유형
📙 작업 내역
🧪 테스트 내역
🎨 스크린샷 또는 시연 영상 (선택)
✅ PR 체크리스트
💬 추가 설명 or 리뷰 포인트 (선택)
Summary by CodeRabbit
신규 기능
개선 및 기타