Conversation
Walkthrough대시보드 기능을 위한 DTO·매퍼·Retrofit API, 저장소 구현, Use Case, DI 모듈, ViewModel 및 UI(WeeklySummarySection 포함)와 리소스 변경을 추가합니다. 원격 응답을 도메인 모델로 매핑하고 ViewModel이 대시보드·주간요약을 로드해 UI 상태로 노출하도록 구성합니다. Changes
Sequence Diagram(s)sequenceDiagram
participant VM as DashboardViewModel
participant UC_D as GetDashboardUseCase
participant UC_W as WeeklySummaryUseCase
participant Repo as DashboardRepositoryImpl
participant API as DashboardApi
participant Mapper as DashboardMappers
Note right of VM: 초기화 시 대시보드·주간요약 로드
VM->>UC_D: invoke()
UC_D->>Repo: getDashboard()
Repo->>API: getDashboard(agencyId)
API-->>Repo: DashboardResponseDto
Repo->>Mapper: dto.toModel()
Mapper-->>Repo: Dashboard
Repo-->>UC_D: Result<Dashboard>
UC_D-->>VM: Result<Dashboard>
VM->>UC_W: invoke()
UC_W->>Repo: getWeeklySummary()
Repo->>API: getWeeklySummary(agencyId)
API-->>Repo: WeeklySummaryResponseDto
Repo->>Mapper: dto.toModel()
Mapper-->>Repo: WeeklySummary
Repo-->>UC_W: Result<WeeklySummary>
UC_W-->>VM: Result<WeeklySummary>
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 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.
Actionable comments posted: 4
🧹 Nitpick comments (2)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardUiState.kt (1)
7-13: 독립적인 로딩/에러 상태 고려 권장
dashboard와weeklySummary가 동일한dashboardLoading및dashboardError를 공유하고 있습니다. 두 API 호출 중 하나만 실패할 경우 UX가 명확하지 않을 수 있습니다. 만약 두 데이터를 독립적으로 로드하고 에러를 처리해야 한다면, 각각에 대한 별도의 로딩/에러 상태를 고려하세요.app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (1)
455-520: 주간 요약 섹션 구현 양호
WeeklySummarySection컴포저블이 깔끔하게 구현되었습니다. 입고/출고 데이터를SuccessGreen과FailRed로 시각적으로 구분한 것이 좋습니다.Line 466의 빈
onClick = { }은 TODO인 것으로 보입니다. 추후 구현이 필요하다면 주석을 추가하거나 클릭 가능하지 않도록Card를 일반 레이아웃으로 변경하는 것을 고려하세요.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (17)
app/src/main/java/com/sampoom/android/feature/dashboard/data/mapper/DashboardMappers.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/data/remote/api/DashboardApi.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/data/remote/dto/DashboardResponseDto.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/data/remote/dto/WeeklySummaryResponseDto.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/data/repository/DashboardRepositoryImpl.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/di/DashboardModules.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/domain/model/Dashboard.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/domain/model/WeeklySummary.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/domain/repository/DashboardRepository.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/domain/usecase/GetDashboardUseCase.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/domain/usecase/WeeklySummaryUseCase.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt(7 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardUiState.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardViewModel.kt(2 hunks)app/src/main/res/drawable/block.xml(1 hunks)app/src/main/res/drawable/car.xml(1 hunks)app/src/main/res/values/strings.xml(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-29T02:47:47.061Z
Learnt from: Sangyoon98
Repo: 33-Auto/Sampoom-Management-Android PR: 22
File: app/src/main/java/com/sampoom/android/feature/cart/data/repository/CartRepositoryImpl.kt:16-22
Timestamp: 2025-10-29T02:47:47.061Z
Learning: Developer Sangyoon98 prefers to use runCatching for consistent error handling in repository implementations, rather than explicit try-catch blocks, in the CartRepositoryImpl class (app/src/main/java/com/sampoom/android/feature/cart/data/repository/CartRepositoryImpl.kt).
Applied to files:
app/src/main/java/com/sampoom/android/feature/dashboard/data/repository/DashboardRepositoryImpl.kt
🧬 Code graph analysis (1)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (1)
app/src/main/java/com/sampoom/android/core/ui/theme/Color.kt (3)
backgroundCardColor(253-254)textColor(256-257)textSecondaryColor(259-260)
🪛 detekt (1.23.8)
app/src/main/java/com/sampoom/android/feature/dashboard/data/repository/DashboardRepositoryImpl.kt
[warning] 17-17: A call to the default constructor of an exception was detected. Instead one of the constructor overloads should be called. This allows to provide more meaningful exceptions.
(detekt.exceptions.ThrowingExceptionsWithoutMessageOrCause)
[warning] 25-25: A call to the default constructor of an exception was detected. Instead one of the constructor overloads should be called. This allows to provide more meaningful exceptions.
(detekt.exceptions.ThrowingExceptionsWithoutMessageOrCause)
🔇 Additional comments (16)
app/src/main/res/drawable/block.xml (2)
1-9:⚠️ PR 컨텍스트 불완전 - 제공된 파일 1개만 검토 가능PR 설명이 비어있고 대시보드 API 연동 기능이라고 명시되어 있으나, AI 요약에 따르면 DTO, API 인터페이스, 저장소 구현, DI 모듈, 도메인 모델, 유스케이스, UI 화면 등 많은 파일이 변경되어야 합니다. 하지만 현재 제공된 파일은 드로어블 리소스 1개뿐입니다.
제안:
- PR 설명에 변경 사항 요약 추가
- 변경된 모든 파일의 목록 공유
- 각 계층(API, repository, domain, UI)의 주요 변경 내용 문서화
1-9: ✅ 드로어블 리소스 구조 및 색상 리소스 검증 완료Android 벡터 드로어블이 올바르게 작성되었으며, 참조되는
@color/text색상 리소스가 프로젝트의 light 및 night 테마 모두에서 정의되어 있습니다. 추가 조치가 필요하지 않습니다.app/src/main/res/values/strings.xml (1)
47-54: 새로운 대시보드 데이터 모델과 잘 일치합니다.문자열 리소스가 새로운 도메인 모델(Dashboard, WeeklySummary)의 필드와 정확하게 매핑되어 있으며, 한국어 번역도 자연스럽고 명확합니다.
app/src/main/java/com/sampoom/android/feature/dashboard/di/DashboardModules.kt (1)
14-26: Hilt DI 설정이 깔끔합니다.의존성 주입 모듈이 표준 Hilt 패턴을 따르고 있으며,
@Binds와@Provides가 적절하게 분리되어 있습니다. 싱글톤 스코프도 리포지토리와 API 인스턴스에 적합합니다.app/src/main/java/com/sampoom/android/feature/dashboard/domain/model/WeeklySummary.kt (1)
3-7: 간결하고 명확한 도메인 모델입니다.불변 데이터 클래스로 잘 정의되어 있으며, 모든 속성이 non-nullable로 설정되어 있어 null 안전성이 보장됩니다.
app/src/main/java/com/sampoom/android/feature/dashboard/domain/usecase/GetDashboardUseCase.kt (1)
7-11: Use Case 구조가 깔끔합니다.리포지토리에 위임하는 단순한 구조로, 현재 요구사항에 적합합니다. 에러 처리는 리포지토리 레이어에서 처리되므로 이 레벨에서의 추가 로직은 불필요합니다.
app/src/main/res/drawable/car.xml (1)
1-9: 벡터 드로어블이 올바르게 정의되었습니다.표준 Android 벡터 형식을 따르고 있으며, 테마 컬러를 참조하여 일관된 UI를 유지합니다.
app/src/main/java/com/sampoom/android/feature/dashboard/domain/usecase/WeeklySummaryUseCase.kt (1)
7-11: 일관된 Use Case 패턴입니다.
GetDashboardUseCase와 동일한 패턴을 따르고 있어 코드베이스의 일관성이 유지됩니다.app/src/main/java/com/sampoom/android/feature/dashboard/domain/model/Dashboard.kt (1)
3-8: 잘 설계된 도메인 모델입니다.대시보드 데이터를 명확하게 표현하고 있으며, 모든 속성이 적절한 타입(Long)과 null 안전성을 갖추고 있습니다. 비즈니스 요구사항을 잘 반영하고 있습니다.
app/src/main/java/com/sampoom/android/feature/dashboard/data/remote/dto/WeeklySummaryResponseDto.kt (1)
3-7: 추가 검증을 위해 프로젝트의 Gson/Retrofit 설정을 확인하겠습니다.I need to check for Gson configuration in the project. Let me search for the Retrofit/Gson setup:
Based on my verification of the codebase patterns and industry standards, I can now provide a final assessment:
API 응답 필드명과 DTO 매핑 구조 확인 필요
프로젝트의 모든 DTO가
@SerializedName어노테이션 없이 camelCase 필드명을 사용하는 일관된 패턴을 보입니다. 이는 다음 두 가지 시나리오 중 하나를 나타냅니다:
- 백엔드 API가 camelCase를 사용 - 이 경우 추가 어노테이션이 불필요합니다
- 전역 Gson NamePolicy 설정 - GsonBuilder에서
setFieldNamingPolicy()로 naming 규칙을 선언하면, 모든 DTO에서 자동으로 적용됩니다Gson의 FieldNamingPolicy를 통해 모든 직렬화/역직렬화에 다른 명명 규칙을 자동으로 적용할 수 있습니다.
실제 문제 여부를 판단하려면 다음을 확인해주세요:
- 백엔드 API 명세에서 실제 필드명 형식 확인 (예:
in_stock_partsvsinStockParts)- 프로젝트의 Gson/Retrofit 설정 (ServiceGenerator, build.gradle 등)에서 global naming policy 확인
app/src/main/java/com/sampoom/android/feature/dashboard/domain/repository/DashboardRepository.kt (1)
6-9: LGTM!도메인 저장소 인터페이스가 깔끔하게 설계되었습니다.
Result타입을 사용하여 성공/실패를 명시적으로 처리하는 것이 좋습니다.app/src/main/java/com/sampoom/android/feature/dashboard/data/remote/api/DashboardApi.kt (1)
9-17: LGTM!Retrofit API 인터페이스가 올바르게 정의되었습니다. 엔드포인트 경로와 파라미터 바인딩이 적절합니다.
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (1)
237-308: LGTM!대시보드 데이터와 UI 연동이 잘 되어 있습니다. Elvis 연산자로 null 처리를 하고 기본값 0을 표시하는 것이 적절합니다.
app/src/main/java/com/sampoom/android/feature/dashboard/data/mapper/DashboardMappers.kt (1)
8-9: DTO 필드가 모두 nullable이 아니므로 현재 매퍼 구현은 올바릅니다.검증 결과,
DashboardResponseDto와WeeklySummaryResponseDto의 모든 필드는 이미 non-nullable 타입(Long,String)으로 정의되어 있습니다. JSON 역직렬화 시 null 값이 오면 매퍼 단계 이전에 실패하므로, 현재 매퍼 함수의 직접 필드 매핑은 타입 안전하고 적절합니다.app/src/main/java/com/sampoom/android/feature/dashboard/data/repository/DashboardRepositoryImpl.kt (1)
18-19: 원본 리뷰 댓글이 부정확합니다.
ApiResponse<T>의data필드는T타입으로 선언되어 있으며, null을 허용하지 않습니다. API 호출이 성공한 후 data가 null이 될 가능성은 없습니다. 만약 JSON 응답에서 data가 누락되거나 null이면, JSON 역직렬화 단계에서 예외가 발생하며, 이는runCatching블록이 처리합니다.다른 repository들(AuthRepositoryImpl, OrderRepositoryImpl)과 달리 DashboardRepositoryImpl은
success플래그 검증을 생략하고 있으나,runCatching으로 감싸져 있으므로 예외 처리는 동작합니다.Likely an incorrect or invalid review comment.
app/src/main/java/com/sampoom/android/feature/dashboard/data/remote/dto/DashboardResponseDto.kt (1)
3-8: 직렬화 설정이 정확히 구성되어 있습니다프로젝트는 Gson의
FieldNamingPolicy.IDENTITY로 설정되어 있습니다. 이는 JSON 필드명이 Kotlin 속성명과 정확히 일치해야 함을 의미합니다. DashboardResponseDto는 이 설정에 맞게 올바르게 구현되었으며, 코드베이스의 모든 DTO(LoginResponseDto, OrderDto 등)가 동일한 패턴을 따릅니다. @SerializedName 어노테이션은 필요하지 않습니다.Likely an incorrect or invalid review comment.
...c/main/java/com/sampoom/android/feature/dashboard/data/repository/DashboardRepositoryImpl.kt
Show resolved
Hide resolved
...c/main/java/com/sampoom/android/feature/dashboard/data/repository/DashboardRepositoryImpl.kt
Show resolved
Hide resolved
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardViewModel.kt
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt(6 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardUiState.kt(1 hunks)app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardViewModel.kt(2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (1)
app/src/main/java/com/sampoom/android/core/ui/theme/Color.kt (3)
backgroundCardColor(253-254)textColor(256-257)textSecondaryColor(259-260)
🔇 Additional comments (1)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardUiState.kt (1)
9-14: 별도 로딩/에러 상태 분리 좋습니다
대시보드와 주간 요약을 각각의 플래그로 나눠 이전에 지적되던 로딩 상태 경합을 해소할 수 있게 되었네요. 👍
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (1)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (1)
182-184: 주간 요약 로딩/에러 상태 미반영 (중복)이전 리뷰에서 이미 지적된 내용입니다.
weeklySummaryLoading과weeklySummaryError상태를 확인하여 적절한 UI를 표시해야 합니다. 현재는 로딩 중이거나 에러 상태일 때도 기본값(0)이 표시되어 사용자가 실제 데이터로 오해할 수 있습니다.
🧹 Nitpick comments (3)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (3)
269-269: 타입 안전성 개선 필요엘비스 연산자에서
Int?와String을 결합하면 타입이Any로 추론되어.toString()을 호출하게 됩니다. 이는 작동하지만 Kotlin의 타입 안전성 모범 사례를 위반합니다.다음과 같이 리팩토링하는 것을 권장합니다:
- text = (dashboard?.totalParts ?: stringResource(R.string.common_slash)).toString(), + text = dashboard?.totalParts?.toString() ?: stringResource(R.string.common_slash),동일한 패턴을 269, 278, 292, 301번 라인 모두에 적용하세요.
Also applies to: 278-278, 292-292, 301-301
487-487: 타입 안전성 개선 필요ButtonSection과 동일한 타입 안전성 문제가 있습니다. 엘비스 연산자에서
Int?와String을 결합하면 타입이Any로 추론됩니다.다음과 같이 수정하세요:
- text = (weeklySummary?.inStockParts ?: stringResource(R.string.common_slash)).toString(), + text = weeklySummary?.inStockParts?.toString() ?: stringResource(R.string.common_slash),- text = (weeklySummary?.outStockParts ?: stringResource(R.string.common_slash)).toString(), + text = weeklySummary?.outStockParts?.toString() ?: stringResource(R.string.common_slash),Also applies to: 504-504
465-465: 빈 onClick 핸들러Card의
onClick핸들러가 비어 있습니다. 향후 구현 예정이라면 TODO 주석을 추가하거나, 클릭이 필요하지 않다면 Card 대신 일반 Column을 사용하는 것을 고려하세요.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt(6 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (1)
app/src/main/java/com/sampoom/android/core/ui/theme/Color.kt (3)
backgroundCardColor(253-254)textColor(256-257)textSecondaryColor(259-260)
📝 Summary
🙏 Question & PR point
📬 Reference
Summary by CodeRabbit
릴리스 노트
새로운 기능
UI 개선
자산