Conversation
|
Caution Review failedThe pull request is closed. Walkthrough문의 제출 기능을 계층별로 추가: DTO, Retrofit 서비스, 원격 데이터소스(인터페이스 + 구현), 저장소 구현, 유스케이스, 뷰모델, DI 바인딩, MyInquireFragment 패키지 이동·뷰모델 통합 및 네비게이션 경로 업데이트. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Fragment as MyInquireFragment
participant ViewModel as InquiryViewModel
participant UseCase as PostInquiryUseCase
participant Repo as InquiryRepositoryImpl
participant DataSource as InquiryRemoteDataSourceImpl
participant Service as InquiryService
participant API as API_Server
User->>Fragment: 제목/내용/카테고리 입력 후 제출
Fragment->>Fragment: 유효성 검사(제목/내용 >=5, 카테고리 >=1)
Fragment->>ViewModel: postInquiry(title, content, categories)
rect rgb(230, 245, 255)
Note over ViewModel: 로딩 시작
end
ViewModel->>UseCase: invoke(...)
UseCase->>Repo: postInquiry(...)
Repo->>Repo: PostInquiryRequestDto 생성
Repo->>DataSource: postInquiry(request)
DataSource->>Service: postInquiry(body)
Service->>API: POST /api/v2/inquiries
alt 성공
API-->>Service: 200 OK
Service-->>DataSource: NullableBaseResponse<Unit>
DataSource-->>Repo: NullableBaseResponse<Unit>
Repo-->>UseCase: Result.success(Unit)
UseCase-->>ViewModel: success
ViewModel->>Fragment: 성공 처리 (이동/메시지)
else 실패
API-->>Service: Error
Service-->>DataSource: Error/예외
DataSource-->>Repo: 예외 전달
Repo-->>UseCase: Result.failure
UseCase-->>ViewModel: failure
ViewModel->>Fragment: errorMessage 표시
end
rect rgb(230, 255, 230)
Note over ViewModel: 로딩 종료
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20–25 minutes 검토 시 주의 사항:
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches✅ Passed checks (4 passed)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (3)
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: 1
🧹 Nitpick comments (5)
app/src/main/java/com/example/findu/data/dataremote/datasource/InquiryRemoteDataSource.kt (1)
6-8: 인터페이스 구조는 좋습니다. 작은 포맷팅 제안이 있어요.suspend function 선언부에 불필요한 공백이 있네요 (
postInquiry( request부분).다음과 같이 정리할 수 있습니다:
interface InquiryRemoteDataSource { - suspend fun postInquiry( request: PostInquiryRequestDto): NullableBaseResponse<Unit> + suspend fun postInquiry(request: PostInquiryRequestDto): NullableBaseResponse<Unit> }app/src/main/java/com/example/findu/data/dataremote/model/request/InquiryRequestDto.kt (1)
7-14: 프로퍼티 이름과 직렬화 이름 간의 불일치를 확인해주세요.코드에서는
category(단수)로 선언했지만, 서버로 전송될 때는categories(복수)로 매핑됩니다. 프로퍼티가List<String>타입이므로 복수형 이름이 더 자연스러울 것 같아요.일관성을 위해 프로퍼티 이름도 복수형으로 변경하는 것을 고려해보세요:
@Serializable data class PostInquiryRequestDto( @SerialName("title") val title: String, @SerialName("content") val content: String, @SerialName("categories") - val category: List<String> + val categories: List<String> )app/src/main/java/com/example/findu/presentation/ui/my/viewmodel/InquiryViewModel.kt (1)
26-41: 입력 값 검증을 추가하면 더 좋을 것 같아요.현재
postInquiry메서드는 title, content, categories의 유효성을 확인하지 않고 바로 API를 호출합니다. 빈 문자열이나 빈 리스트가 전달될 경우 불필요한 네트워크 요청이 발생할 수 있어요.다음과 같이 입력 검증을 추가하는 것을 고려해보세요:
fun postInquiry(title: String, content: String, categories: List<String>) { viewModelScope.launch { + if (title.isBlank() || content.isBlank() || categories.isEmpty()) { + _postInquirySuccess.value = false + _errorMessage.value = "모든 필드를 입력해주세요." + return@launch + } + _loadingState.value = true postInquiryUseCase(title, content, categories)app/src/main/java/com/example/findu/data/dataremote/service/InquiryService.kt (1)
6-6: 사용하지 않는 import 제거 필요
retrofit2.http.Header가 import되어 있지만 코드에서 사용되지 않고 있어요. 제거해주시면 좋을 것 같습니다.-import retrofit2.http.Headerapp/src/main/java/com/example/findu/data/dataremote/datasourceimpl/InquiryRemoteDataSourceImpl.kt (1)
4-4: 사용하지 않는 import들 정리 필요다음 import들이 코드에서 사용되지 않고 있어요:
- Line 4:
BaseResponse- Line 8:
handleBaseResponse- Line 9:
InquiryRepository제거해주시면 코드가 더 깔끔해질 것 같습니다.
-import com.example.findu.data.dataremote.model.base.BaseResponse -import com.example.findu.data.dataremote.util.handleBaseResponse -import com.example.findu.domain.repository.InquiryRepositoryAlso applies to: 8-9
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (18)
app/src/main/java/com/example/findu/data/dataremote/datasource/InquiryRemoteDataSource.kt(1 hunks)app/src/main/java/com/example/findu/data/dataremote/datasourceimpl/InquiryRemoteDataSourceImpl.kt(1 hunks)app/src/main/java/com/example/findu/data/dataremote/model/request/InquiryRequestDto.kt(1 hunks)app/src/main/java/com/example/findu/data/dataremote/service/InquiryService.kt(1 hunks)app/src/main/java/com/example/findu/data/repositoryimpl/InquiryRepositoryImpl.kt(1 hunks)app/src/main/java/com/example/findu/di/DataSourceModule.kt(3 hunks)app/src/main/java/com/example/findu/di/RepositoryModule.kt(4 hunks)app/src/main/java/com/example/findu/di/ServiceModule.kt(2 hunks)app/src/main/java/com/example/findu/domain/repository/InquiryRepository.kt(1 hunks)app/src/main/java/com/example/findu/domain/usecase/PostInquiryUseCase.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/my/MyFragment.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/my/MyInterestFragment.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/my/MyReportHistoryFragment.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/my/MyViewedAnimalFragment.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/my/inquiry/MyInquireFragment.kt(6 hunks)app/src/main/java/com/example/findu/presentation/ui/my/viewmodel/InquiryViewModel.kt(1 hunks)app/src/main/java/com/example/findu/presentation/ui/my/viewmodel/MyViewModel.kt(1 hunks)app/src/main/res/navigation/nav_graph.xml(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/example/findu/presentation/ui/my/inquiry/MyInquireFragment.kt (4)
app/src/main/java/com/example/findu/presentation/ui/my/MyFragment.kt (1)
observeViewModel(205-266)app/src/main/java/com/example/findu/presentation/ui/my/MyInterestFragment.kt (1)
observeViewModel(89-110)app/src/main/java/com/example/findu/presentation/ui/my/MyReportHistoryFragment.kt (1)
observeViewModel(83-94)app/src/main/java/com/example/findu/presentation/ui/my/MyViewedAnimalFragment.kt (1)
observeViewModel(88-101)
🔇 Additional comments (19)
app/src/main/java/com/example/findu/presentation/ui/my/MyInterestFragment.kt (1)
17-17: 패키지 재구성에 맞춘 import 업데이트, 깔끔합니다!MyViewModel의 새 패키지 경로로 import가 정확하게 업데이트되었습니다.
app/src/main/java/com/example/findu/presentation/ui/my/viewmodel/InquiryViewModel.kt (1)
43-47: 상태 초기화 메서드, 좋습니다!UI 상태를 깔끔하게 초기화하는 메서드가 있어서 좋네요. 다이얼로그 닫기나 화면 재진입 시 유용하게 쓰일 것 같습니다.
app/src/main/java/com/example/findu/presentation/ui/my/MyFragment.kt (1)
32-32: Import 추가 완료!MyViewModel의 새 패키지 경로를 정확하게 import했습니다.
app/src/main/java/com/example/findu/presentation/ui/my/MyViewedAnimalFragment.kt (1)
15-15: Import 정리 완료!MyViewModel의 새 패키지로 import가 업데이트되었고, 사용하지 않는 import도 정리된 것 같습니다.
app/src/main/java/com/example/findu/di/ServiceModule.kt (1)
10-10: DI 설정이 깔끔하게 추가되었습니다!InquiryService의 의존성 주입 설정이 다른 서비스들과 동일한 패턴으로 잘 구현되었습니다. Singleton 스코프도 적절하게 적용되었어요.
Also applies to: 107-111
app/src/main/java/com/example/findu/presentation/ui/my/MyReportHistoryFragment.kt (1)
16-16: Import 업데이트 완료!MyViewModel의 새 위치로 import가 정확하게 변경되었습니다.
app/src/main/java/com/example/findu/presentation/ui/my/viewmodel/MyViewModel.kt (1)
1-1: 패키지 구조 개선 👍ViewModel을 별도의 viewmodel 패키지로 분리한 것 좋네요. 코드 구조가 더 명확해졌습니다.
app/src/main/java/com/example/findu/di/RepositoryModule.kt (1)
80-82: InquiryRepository DI 바인딩 잘 추가되었습니다Dagger Hilt 바인딩이 올바르게 구성되어 있고, 다른 Repository 바인딩들과 일관된 패턴을 따르고 있네요.
app/src/main/java/com/example/findu/di/DataSourceModule.kt (1)
100-102: DataSource 바인딩 깔끔합니다InquiryRemoteDataSource의 DI 설정이 잘 되어 있고, 기존 패턴과 일관성 있게 구현되었네요.
app/src/main/res/navigation/nav_graph.xml (1)
230-230: 네비게이션 경로 업데이트 확인MyInquireFragment의 패키지 경로가 정확하게 업데이트되었습니다.
app/src/main/java/com/example/findu/domain/repository/InquiryRepository.kt (1)
4-10: 도메인 인터페이스 깔끔하게 정의되었습니다
Result<Unit>을 사용한 에러 핸들링이 좋고, 파라미터 구조도 명확하네요.app/src/main/java/com/example/findu/data/dataremote/service/InquiryService.kt (1)
9-14: Retrofit 서비스 정의 잘 되어 있습니다POST 엔드포인트와 요청 DTO 설정이 올바르게 구성되어 있네요.
app/src/main/java/com/example/findu/data/repositoryimpl/InquiryRepositoryImpl.kt (1)
10-23: Repository 구현 깔끔합니다
runCatching과handleBaseResponse를 활용한 에러 핸들링이 잘 되어 있고, DTO 생성 로직도 명확하네요.app/src/main/java/com/example/findu/data/dataremote/datasourceimpl/InquiryRemoteDataSourceImpl.kt (1)
13-18: DataSource 구현 깔끔합니다Service로의 위임 로직이 간단명료하게 구현되어 있네요.
app/src/main/java/com/example/findu/domain/usecase/PostInquiryUseCase.kt (1)
6-14: 깔끔한 유즈케이스 구현입니다!의존성 주입과 레포지토리 위임이 잘 구현되어 있네요. 아키텍처 레이어 분리가 명확합니다.
app/src/main/java/com/example/findu/presentation/ui/my/inquiry/MyInquireFragment.kt (4)
1-1: Hilt 통합이 올바르게 구성되었습니다!패키지 재구성, 의존성 주입 설정, ViewModel 연결이 잘 되어 있네요.
Also applies to: 14-15, 18-19, 21-23, 25-25, 30-30
39-39: 카테고리 처리 로직이 개선되었습니다!리스트를 사용한 카테고리 수집 방식이 더 깔끔하고 확장 가능하네요. 타입 체크도 안전하게 처리되었습니다.
Also applies to: 54-54, 61-65, 69-69
74-79: 최소 길이 검증 로직이 추가되었습니다.5자 이상 검증으로 유효성을 강화했네요. 스팸성 문의를 방지할 수 있겠습니다.
158-180: Chip 초기화 로직이 깔끔하게 개선되었습니다!인라인 확장 함수와 listOf 사용으로 코드가 더 읽기 쉬워졌네요. 스타일링도 일관성 있게 적용되었습니다.
Related issue 🛠
Work Description 📝
Screenshot 📸
2025-10-28.05.20.38.mov
Uncompleted Tasks 😅
To Reviewers 📢
서버 쪽이랑 연락을 늦게 해버려 늦게 올립니다 죄송합니다 ㅠㅠ
Summary by CodeRabbit