-
Notifications
You must be signed in to change notification settings - Fork 0
feat: 도서 검색 실패시 대응(카카오톡 채널 문의 이동) #241
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Conversation
WalkthroughGradle 로컬 속성 접근을 Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant UI as BookSearchUi
participant Presenter as BookSearchPresenter
participant SideEffectHandler as HandleBookSearchSideEffect
participant UriHandler as LocalUriHandler
User->>UI: 빈 검색 화면에서 "문의하기" 클릭
UI->>Presenter: eventSink(OnInquireClick)
Presenter->>Presenter: searchUiState 유지/업데이트 없음
Presenter->>SideEffectHandler: Emit NavigateToKakaoTalkChannel
rect rgb(235,245,255)
Note right of SideEffectHandler: 사이드이펙트 처리 (카카오톡 URL 열기)
SideEffectHandler->>SideEffectHandler: val url = BuildConfig.REED_KAKAOTALK_CHANNEL_URL
SideEffectHandler->>UriHandler: openUri(url)
UriHandler-->>User: 카카오톡 채널로 포워딩 (앱/브라우저)
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this 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
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (13)
app/build.gradle.ktsbuild-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.ktcore/network/build.gradle.ktscore/ocr/build.gradle.ktsfeature/login/build.gradle.ktsfeature/onboarding/stability/onboarding.stabilityfeature/search/build.gradle.ktsfeature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchPresenter.ktfeature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchUi.ktfeature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchUiState.ktfeature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/HandleBookSearchSideEffect.ktfeature/search/src/main/res/values/strings.xmlfeature/search/stability/search.stability
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-07-20T12:34:23.786Z
Learnt from: easyhooon
Repo: YAPP-Github/Reed-Android PR: 61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 `booket.android.feature` convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.
Applied to files:
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.ktcore/network/build.gradle.ktsfeature/search/build.gradle.ktsfeature/login/build.gradle.ktscore/ocr/build.gradle.kts
📚 Learning: 2025-08-28T12:25:54.058Z
Learnt from: easyhooon
Repo: YAPP-Github/Reed-Android PR: 174
File: feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchPresenter.kt:128-133
Timestamp: 2025-08-28T12:25:54.058Z
Learning: In BookSearchPresenter.kt, when a guest user tries to register a book and is redirected to login, the bottom sheet (isBookRegisterBottomSheetVisible) and selection state (selectedBookIsbn, selectedBookStatus) are intentionally kept open/preserved so that when the user returns from login, they can continue from where they left off without losing context.
Applied to files:
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchUiState.ktfeature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchPresenter.ktfeature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchUi.ktfeature/search/stability/search.stability
🧬 Code graph analysis (5)
core/network/build.gradle.kts (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.kt (1)
getLocalProperty(15-17)
app/build.gradle.kts (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.kt (1)
getLocalProperty(15-17)
feature/search/build.gradle.kts (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.kt (1)
getLocalProperty(15-17)
feature/login/build.gradle.kts (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.kt (1)
getLocalProperty(15-17)
core/ocr/build.gradle.kts (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.kt (1)
getLocalProperty(15-17)
⏰ 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). (2)
- GitHub Check: ci-build
- GitHub Check: Compose Stability Check
🔇 Additional comments (20)
feature/onboarding/stability/onboarding.stability (1)
28-34:highlightTextResnullable 변경이 올바르게 구현되었습니다.자동 생성된 stability 파일의 변경 사항이 실제 구현부와 일치하는지 확인했습니다:
구현부:
OnboardingPage.kt라인 29에서highlightTextRes: Int? = null으로 올바르게 정의되었고, 라인 34-42에서 null 값을 적절히 처리합니다 (null일 때AnnotatedString, null이 아닐 때HighlightedText사용).호출 지점:
OnboardingUi.kt의 모든 호출 지점이 올바르게 처리됩니다 (페이지 0, 1은 highlight 텍스트를 전달하고, 페이지 2는 전달하지 않아 기본값 null 사용).Stability 주석:
kotlin.Int?는 primitive type이 아니므로 "class with no mutable properties" 표기가 정확합니다.변경 사항이 완벽하게 처리되었으므로 추가 조정은 필요하지 않습니다.
feature/search/src/main/res/values/strings.xml (1)
8-10: LGTM!빈 검색 결과에 대한 문자열 리소스가 명확하고 사용자 친화적입니다. 제목, 설명, 액션 버튼으로 구성된 구조가 적절합니다.
feature/login/build.gradle.kts (1)
3-3: LGTM!로컬 속성 접근 방식을 중앙화된
getLocalProperty함수로 통일한 리팩토링이 올바르게 적용되었습니다. 디버그 및 릴리스 빌드 타입에서 적절하게 사용되고 있습니다.Also applies to: 14-26
core/network/build.gradle.kts (1)
3-3: LGTM!서버 베이스 URL 접근 방식이 새로운
getLocalProperty유틸리티로 올바르게 마이그레이션되었습니다. 디버그 및 릴리스 빌드에서 일관되게 적용되어 있습니다.Also applies to: 21-21, 25-25
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/HandleBookSearchSideEffect.kt (1)
6-7: LGTM!카카오톡 채널로 이동하는 사이드 이펙트 처리가 올바르게 구현되었습니다.
LocalUriHandler를 사용하여 외부 URI를 여는 표준 Compose 패턴을 따르고 있습니다.Also applies to: 16-16, 24-26
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.kt (1)
3-3: LGTM!로컬 속성 접근을 중앙화하는
getLocalProperty함수가 깔끔하게 구현되었습니다. 여러 모듈에서 일관된 방식으로 로컬 속성에 접근할 수 있게 되었습니다.Also applies to: 15-17
app/build.gradle.kts (1)
4-4: LGTM!앱 모듈에서 로컬 속성 접근 방식이
getLocalProperty로 일관되게 마이그레이션되었습니다. KAKAO_NATIVE_APP_KEY의 매니페스트 플레이스홀더 처리에서 따옴표 제거 로직도 적절합니다.Also applies to: 35-35, 46-46, 58-59
feature/search/stability/search.stability (1)
7-11: 자동 생성된 파일입니다.Compose Stability Analyzer가 생성한 파일로, 새로운 프리뷰 함수들(
BookRecentSearchPreview,BookSearchEmptyResultPreview)과 코드 변경사항이 올바르게 반영되어 있습니다. 모든 Composable 함수가 적절하게 안정성 분석되었습니다.Also applies to: 22-31
feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchUi.kt (4)
27-29: LGTM!새로운 문의하기 버튼 기능에 필요한
ReedButton,ReedButtonColorStyle,smallButtonStyleimport가 적절하게 추가되었습니다.
120-132: LGTM!
UiState에서SearchUiState로의 마이그레이션이 올바르게 적용되었습니다.when분기문에서 스마트 캐스트를 통해exception속성에 안전하게 접근하고 있습니다.
185-205: LGTM!검색 결과가 없을 때의 UI가 깔끔하게 구성되었습니다. 제목, 설명, 문의하기 버튼이 적절한 spacing과 함께 배치되어 있으며,
OnInquireClick이벤트가 올바르게 연결되어 있습니다.
326-337: LGTM!빈 검색 결과 상태에 대한 새로운 프리뷰 함수가 추가되어 개발 시 UI 확인이 용이해졌습니다.
BookSearchContent를 직접 사용하여 불필요한 Scaffold 래핑 없이 핵심 콘텐츠를 프리뷰합니다.feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchPresenter.kt (3)
70-70: LGTM!
SearchUiState로의 상태 타입 마이그레이션이 올바르게 적용되었습니다. 초기값으로SearchUiState.Idle을 사용하는 것이 적절합니다.
86-127: LGTM!검색 흐름에서의 상태 전환이 적절하게 구현되었습니다:
- 첫 페이지 검색 시
SearchUiState.Loading→SearchUiState.Success또는SearchUiState.Error- 페이지네이션 시
FooterState를 별도로 관리
264-266: LGTM!
OnInquireClick이벤트 핸들러가NavigateToKakaoTalkChannel사이드 이펙트를 올바르게 트리거합니다.feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchUiState.kt (4)
17-22: LGTM!
SearchUiStatesealed interface가 잘 설계되었습니다.Errorvariant가Throwable을 포함하여 UI에서 에러 타입에 따른 처리가 가능하고,@Immutable어노테이션으로 Compose 최적화가 적용되어 있습니다.
24-41: LGTM!
BookSearchUiState의 구조가 명확합니다.isEmptySearchResult계산 속성이SearchUiState.Success이면서 결과가 0인 경우를 정확하게 판별합니다.
49-51: LGTM!
NavigateToKakaoTalkChannel사이드 이펙트가data object로 정의되어 파라미터가 필요 없는 네비게이션 액션에 적합합니다.
69-69: LGTM!
OnInquireClick이벤트가 적절하게 추가되었습니다.core/ocr/build.gradle.kts (1)
3-3: 프로퍼티 누락 시 타입 안전성 문제 해결 필요
getLocalProperty함수가String(null 불가) 타입으로 선언되어 있으나, 실제 구현에서는gradleLocalProperties().getProperty()가 null을 반환할 수 있습니다.CLOUD_VISION_API_KEY가local.properties에 없을 경우 null이 반환되어 타입 안전성 위반이 발생합니다.함수 반환 타입을
String?으로 변경하거나, null 시 기본값을 제공하거나, 필수 프로퍼티 누락 시 명시적 오류를 발생시키는 방식으로 개선해야 합니다. 현재 이 함수는 여러 모듈(app, feature/login, feature/search, core/ocr, core/network)에서 사용되고 있으므로 일관된 에러 처리가 필요합니다.
There was a problem hiding this 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
🧹 Nitpick comments (1)
feature/search/build.gradle.kts (1)
15-21: 구조가 올바르게 수정되었습니다.이전 리뷰에서 지적된
defaultConfig의 중첩 문제가 해결되었습니다.buildFeatures와defaultConfig가 모두android블록의 직접 자식으로 올바르게 배치되어 있으며, BuildConfig 기능이 적절히 활성화되었습니다.다만, 프로젝트를 빌드하기 위해서는
REED_KAKAOTALK_CHANNEL_URL속성을local.properties에 추가해야 합니다. 팀의 다른 개발자들이 프로젝트를 정상적으로 빌드할 수 있도록 README 또는 개발 가이드에 이 속성의 설정 방법을 문서화하는 것이 좋습니다.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
feature/search/build.gradle.kts
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-20T12:34:23.786Z
Learnt from: easyhooon
Repo: YAPP-Github/Reed-Android PR: 61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 `booket.android.feature` convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.
Applied to files:
feature/search/build.gradle.kts
🧬 Code graph analysis (1)
feature/search/build.gradle.kts (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Extensions.kt (1)
getLocalProperty(15-17)
⏰ 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). (2)
- GitHub Check: Compose Stability Check
- GitHub Check: ci-build
🔇 Additional comments (1)
feature/search/build.gradle.kts (1)
3-3: 올바른 import 추가입니다.프로젝트의 공통 유틸리티 함수인
getLocalProperty를 import하여 사용하는 것은 다른 모듈(app, core/ocr, core/network, feature/login)과 일관된 패턴을 따릅니다.
🔗 관련 이슈
📙 작업 설명
🧪 테스트 내역 (선택)
📸 스크린샷 또는 시연 영상 (선택)
Reed.mp4
💬 추가 설명 or 리뷰 포인트 (선택)
Summary by CodeRabbit
릴리스 노트
새 기능
기타
✏️ Tip: You can customize this high-level summary in your review settings.