Feature/#56 feat graduation progress - #81
Conversation
Home -> Graduation Progress Screen Navigate 동작 구현
졸업 요건 확인 화면 GUI 구현
- 졸업요건확인 화면에서 popBackStack 시 시간표 화면으로 천이 되는 현상 수정
- GraduationProgressViewModel 추가 - Graduation Progress 더미 데이터를 Remote에서 가져오는 동작 추가
개요이 PR은 졸업 요건 진행 현황을 표시하는 새로운 기능을 추가합니다. 데이터 모델부터 UI까지 완전한 계층을 구현하며, 졸업 진행 상황을 조회하고 화면에 표시하는 전체 흐름을 포함합니다. 변경 사항
시퀀스 다이어그램sequenceDiagram
participant UI as 사용자<br/>(UI 클릭)
participant VM as GraduationProgress<br/>ViewModel
participant UC as GetGraduation<br/>ProgressUseCase
participant Repo as GraduationRepository<br/>Impl
participant DS as RemoteGraduation<br/>DataSource
participant State as MVI State
UI->>VM: getGraduationProgress()
VM->>State: isLoading = true
VM->>UC: invoke()
UC->>Repo: getGraduationProgress()
Repo->>DS: getGraduationProgress()
DS-->>Repo: GraduationProcessListData
Repo-->>UC: GraduationProcessListData
UC-->>VM: Result<GraduationProcessListData>
alt Success
VM->>State: graduationProgress = data<br/>isLoading = false
else Failure
VM->>State: isLoading = false
VM->>State: HandleException(throwable)
end
sequenceDiagram
participant Home as HomeScreen
participant Timetable as TimetableScreen
participant TimetableVM as TimetableViewModel
participant Nav as NavController
participant GradScreen as GraduationProgress<br/>Screen
Home->>Home: 사용자가 졸업요건 클릭
Home->>Timetable: onClickGraduationProgress()
Timetable->>TimetableVM: navigateGraduationProgress()
TimetableVM->>TimetableVM: post(NavigateGraduationProgress)
Timetable->>Nav: navigateGraduationProgress()
Nav->>GradScreen: navigate to<br/>graduation-progress route
GradScreen-->>GradScreen: 졸업 진행 화면 표시
코드 리뷰 소요 시간🎯 3 (Moderate) | ⏱️ ~20 minutes 관련된 PR
추천 검토자
시
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 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: 7
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/data/graduation/di/GraduationRepositoryModule.kt`:
- Around line 9-12: The module name uses PascalCase (GraduationRepositoryModule)
but project convention is camelCase; rename the module symbol to
graduationRepositoryModule and update all usages/registrations (e.g., where
InitKoin references this module) accordingly; keep the bindings inside
(RemoteGraduationDataSource -> RemoteGraduationDataSourceImpl and
GraduationRepository -> GraduationRepositoryImpl) unchanged, and ensure any
imports or tests that reference GraduationRepositoryModule are updated to the
new graduationRepositoryModule identifier.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/domain/graduation/usecase/GetGraduationProgressUseCase.kt`:
- Around line 4-5: Remove the unused imports in GetGraduationProgressUseCase.kt:
delete the imports of GraduationProcessResponseData and AcademicRepository (they
are not referenced in the file); after removal, run a quick compile or IDE
cleanup to ensure no other unused symbols remain and save the file.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressSampleData.kt`:
- Line 1: 현재 presentation 패키지의 GraduationProgressSampleData.kt에 있는
graduationProgressResponseSampleData 샘플 응답을 data 계층으로 이동시키고
RemoteGraduationDataSourceImpl이 presentation을 참조하지 않도록 수정하세요; 구체적으로
graduationProgressResponseSampleData 를 data 계층의 fixtures 또는 sample 디렉토리로 옮기고 해당
파일의 패키지 선언을 data 계층 네임스페이스로 변경한 뒤 RemoteGraduationDataSourceImpl에서 import 경로를 새
위치로 업데이트(및 불필요한 presentation 패키지 의존성 제거) 하세요.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressScreen.kt`:
- Around line 53-57: The top title and summary values in
GraduationProgressScreen are hardcoded (e.g., the CchAppBarWithTitle call and
the static "109 / 3.03 / 83.2" display); change the screen to read the current
user's data from the existing profile and academicSummary models and pass those
values into CchAppBarWithTitle and the summary section (use nullable-safe
accessors), and if profile or academicSummary is absent or incomplete hide the
related summary UI instead of showing dummy values; update
GraduationProgressScreen to fetch/inject profile/academicSummary and
conditionally render the title and summary sections accordingly.
- Around line 28-41: The route is not collecting side effects so
GraduationProgressSideEffect.HandleException emitted by
GraduationProgressViewModel is ignored; update GraduationProgressRoute to
collect viewModel.mviStore.sideEffects (or use viewModel.sideEffects collector)
and call the existing handleException function when a HandleException side
effect is received, and also ensure callers (e.g., the GraduationProgressRoute
invocation in TimetableNavigation.kt) pass through a handleException callback to
the route so exceptions are surfaced; look for GraduationProgressRoute,
GraduationProgressViewModel, GraduationProgressSideEffect.HandleException, and
handleException to add the collector and propagate the handler.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/home/HomeScreen.kt`:
- Around line 16-24: HomeRoute currently passes a no-arg callback
navigateGraduationProgress into HomeScreen so both major cards navigate to the
same destination; change the callback signature to accept an identifier (e.g.,
MajorType or majorName) and update HomeRoute, HomeScreen, and the two card click
handlers to pass the appropriate value (primary vs. double-major) through;
update all call sites (including the other occurrences around the
HomeScreen/card rendering) to use the new navigateGraduationProgress(majorId)
signature so the destination receives which major to show.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/remote/graduation/RemoteGraduationDataSourceImpl.kt`:
- Around line 5-10: RemoteGraduationDataSourceImpl is importing
presentation-level graduationProgressResponseSampleData which violates layer
dependency rules; move the sample fixture out of the presentation layer into the
data/common layer (e.g., create a sample data object in the data module) and
update RemoteGraduationDataSourceImpl to import that new location (or remove the
sample import and return a data-layer fixture). Ensure references to
graduationProgressResponseSampleData in RemoteGraduationDataSourceImpl are
replaced with the new data-layer symbol and keep the public API types
(RemoteGraduationDataSource, GraduationProcessListData) unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 0e18d843-d255-407d-a9be-6641bc7a966d
📒 Files selected for processing (24)
composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/App.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/MainNavigator.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/common/model/graduation/GraduationProcess.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/common/model/response/graduation/GraduationProcessResponse.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/data/graduation/datasource/RemoteGraduationDataSource.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/data/graduation/di/GraduationRepositoryModule.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/data/graduation/repository/GraduationRepositoryImpl.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/di/DomainModules.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/di/InitKoin.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/di/PresentationModules.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/domain/graduation/repository/GraduationRepository.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/domain/graduation/usecase/GetGraduationProgressUseCase.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/component/CchGraduationProgressContainer.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/component/CchSemesterGradeButton.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressContract.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressSampleData.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressScreen.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressViewModel.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/home/HomeScreen.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/timetable/navigation/TimetableNavigation.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/timetable/timetable/TimetableContract.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/timetable/timetable/TimetableScreen.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/timetable/timetable/TimetableViewModel.ktcomposeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/remote/graduation/RemoteGraduationDataSourceImpl.kt
| val GraduationRepositoryModule = module { | ||
| single<RemoteGraduationDataSource> { RemoteGraduationDataSourceImpl() } | ||
| single<GraduationRepository> { GraduationRepositoryImpl(get()) } | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
모듈 네이밍 컨벤션 불일치
InitKoin.kt의 다른 모듈들(authRepositoryModule, timetableRepositoryModule, openMajorRepositoryModule 등)은 camelCase를 사용하는 반면, 이 모듈은 PascalCase(GraduationRepositoryModule)를 사용하고 있습니다. 일관성을 위해 graduationRepositoryModule로 변경하는 것을 권장합니다.
♻️ 제안된 수정
-val GraduationRepositoryModule = module {
+val graduationRepositoryModule = module {
single<RemoteGraduationDataSource> { RemoteGraduationDataSourceImpl() }
single<GraduationRepository> { GraduationRepositoryImpl(get()) }
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/data/graduation/di/GraduationRepositoryModule.kt`
around lines 9 - 12, The module name uses PascalCase
(GraduationRepositoryModule) but project convention is camelCase; rename the
module symbol to graduationRepositoryModule and update all usages/registrations
(e.g., where InitKoin references this module) accordingly; keep the bindings
inside (RemoteGraduationDataSource -> RemoteGraduationDataSourceImpl and
GraduationRepository -> GraduationRepositoryImpl) unchanged, and ensure any
imports or tests that reference GraduationRepositoryModule are updated to the
new graduationRepositoryModule identifier.
| import com.chukchukhaksa.mobile.common.model.response.graduation.GraduationProcessResponseData | ||
| import com.chukchukhaksa.mobile.domain.academic.repository.AcademicRepository |
There was a problem hiding this comment.
사용되지 않는 import 제거 필요
GraduationProcessResponseData와 AcademicRepository가 import되어 있지만 실제로 사용되지 않습니다. 복사-붙여넣기 과정에서 남은 것으로 보입니다.
🧹 제안된 수정
package com.chukchukhaksa.mobile.domain.graduation.usecase
import com.chukchukhaksa.mobile.common.model.graduation.GraduationProcessListData
-import com.chukchukhaksa.mobile.common.model.response.graduation.GraduationProcessResponseData
-import com.chukchukhaksa.mobile.domain.academic.repository.AcademicRepository
import com.chukchukhaksa.mobile.domain.common.runCatchingIgnoreCancelled
import com.chukchukhaksa.mobile.domain.graduation.repository.GraduationRepository📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| import com.chukchukhaksa.mobile.common.model.response.graduation.GraduationProcessResponseData | |
| import com.chukchukhaksa.mobile.domain.academic.repository.AcademicRepository | |
| package com.chukchukhaksa.mobile.domain.graduation.usecase | |
| import com.chukchukhaksa.mobile.common.model.graduation.GraduationProcessListData | |
| import com.chukchukhaksa.mobile.domain.common.runCatchingIgnoreCancelled | |
| import com.chukchukhaksa.mobile.domain.graduation.repository.GraduationRepository |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/domain/graduation/usecase/GetGraduationProgressUseCase.kt`
around lines 4 - 5, Remove the unused imports in
GetGraduationProgressUseCase.kt: delete the imports of
GraduationProcessResponseData and AcademicRepository (they are not referenced in
the file); after removal, run a quick compile or IDE cleanup to ensure no other
unused symbols remain and save the file.
| @@ -0,0 +1,148 @@ | |||
| package com.chukchukhaksa.mobile.presentation.home.graduationprogress | |||
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -e
rg -n -C2 '\bgraduationProgressResponseSampleData\b|\bgraduationProgressSampleData\b' --type ktRepository: cchaksa/cchaksa-app
Length of output: 89
🏁 Script executed:
#!/bin/bash
# Search for usages of the sample data without specifying file type
rg -n -C2 '\bgraduationProgressResponseSampleData\b|\bgraduationProgressSampleData\b'Repository: cchaksa/cchaksa-app
Length of output: 3366
🏁 Script executed:
#!/bin/bash
# Also search for imports of the GraduationProgressSampleData file
rg -n 'import.*GraduationProgressSampleData'Repository: cchaksa/cchaksa-app
Length of output: 45
🏁 Script executed:
#!/bin/bash
# Check the actual content of the file to understand what's exported
cat -n composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressSampleData.kt | head -50Repository: cchaksa/cchaksa-app
Length of output: 1738
샘플 응답을 presentation 패키지에서 제거하고 data 계층으로 이동해야 합니다.
RemoteGraduationDataSourceImpl(data 계층의 remote 구현)이 현재 com.chukchukhaksa.mobile.presentation.home.graduationprogress 패키지에서 graduationProgressResponseSampleData를 직접 import하고 있어 계층 의존성이 역전되어 있습니다. 더미 응답 데이터는 data 계층의 fixture/shared sample 디렉토리로 옮기고, RemoteGraduationDataSourceImpl의 import를 업데이트해야 합니다.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressSampleData.kt`
at line 1, 현재 presentation 패키지의 GraduationProgressSampleData.kt에 있는
graduationProgressResponseSampleData 샘플 응답을 data 계층으로 이동시키고
RemoteGraduationDataSourceImpl이 presentation을 참조하지 않도록 수정하세요; 구체적으로
graduationProgressResponseSampleData 를 data 계층의 fixtures 또는 sample 디렉토리로 옮기고 해당
파일의 패키지 선언을 data 계층 네임스페이스로 변경한 뒤 RemoteGraduationDataSourceImpl에서 import 경로를 새
위치로 업데이트(및 불필요한 presentation 패키지 의존성 제거) 하세요.
| fun GraduationProgressRoute( | ||
| popBackStack: () -> Unit = {}, | ||
| viewModel: GraduationProgressViewModel = koinViewModel(), | ||
| ) { | ||
| val uiState by viewModel.mviStore.uiState.collectAsStateWithLifecycle() | ||
|
|
||
| LaunchedEffect(Unit) { | ||
| viewModel.getGraduationProgress() | ||
| } | ||
|
|
||
| GraduationProgressScreen( | ||
| graduationProgress = uiState.graduationProgress, | ||
| onClickBackButton = popBackStack, | ||
| ) |
There was a problem hiding this comment.
예외 side effect가 수집되지 않아 실패가 조용히 사라집니다.
GraduationProgressViewModel은 실패 시 GraduationProgressSideEffect.HandleException을 발행하는데, 이 라우트에서는 sideEffects를 collect하지 않습니다. 지금 상태로는 로딩만 끝나고 오류 전달은 완전히 유실됩니다.
🔧 제안된 수정
+import com.chukchukhaksa.mobile.common.ui.collectWithLifecycle
+
`@Composable`
fun GraduationProgressRoute(
popBackStack: () -> Unit = {},
+ handleException: (Throwable) -> Unit = {},
viewModel: GraduationProgressViewModel = koinViewModel(),
) {
val uiState by viewModel.mviStore.uiState.collectAsStateWithLifecycle()
+
+ viewModel.mviStore.sideEffects.collectWithLifecycle { sideEffect ->
+ when (sideEffect) {
+ is GraduationProgressSideEffect.HandleException -> handleException(sideEffect.throwable)
+ }
+ }
LaunchedEffect(Unit) {
viewModel.getGraduationProgress()TimetableNavigation.kt의 GraduationProgressRoute(...) 호출부에서도 handleException을 함께 넘겨야 합니다.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressScreen.kt`
around lines 28 - 41, The route is not collecting side effects so
GraduationProgressSideEffect.HandleException emitted by
GraduationProgressViewModel is ignored; update GraduationProgressRoute to
collect viewModel.mviStore.sideEffects (or use viewModel.sideEffects collector)
and call the existing handleException function when a HandleException side
effect is received, and also ensure callers (e.g., the GraduationProgressRoute
invocation in TimetableNavigation.kt) pass through a handleException callback to
the route so exceptions are surfaced; look for GraduationProgressRoute,
GraduationProgressViewModel, GraduationProgressSideEffect.HandleException, and
handleException to add the collector and propagate the handler.
| CchAppBarWithTitle( | ||
| title = "18학번 정보통신학부 졸업요건", | ||
| isShowAddButton = false, | ||
| onClickBackButton = { onClickBackButton() }, | ||
| ) |
There was a problem hiding this comment.
사용자별로 달라져야 할 정보가 모두 하드코딩돼 있습니다.
어느 계정으로 들어와도 상단 타이틀이 "18학번 정보통신학부 졸업요건"으로 고정되고, 총 취득학점/GPA/백분위도 109 / 3.03 / 83.2로 표시됩니다. 더미 졸업요건 데이터를 쓰더라도 이 화면의 사용자 요약값은 기존 profile/academicSummary에서 받아오거나, 준비되지 않았다면 해당 섹션을 숨기는 쪽이 맞습니다.
Also applies to: 78-83
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/graduationprogress/GraduationProgressScreen.kt`
around lines 53 - 57, The top title and summary values in
GraduationProgressScreen are hardcoded (e.g., the CchAppBarWithTitle call and
the static "109 / 3.03 / 83.2" display); change the screen to read the current
user's data from the existing profile and academicSummary models and pass those
values into CchAppBarWithTitle and the summary section (use nullable-safe
accessors), and if profile or academicSummary is absent or incomplete hide the
related summary UI instead of showing dummy values; update
GraduationProgressScreen to fetch/inject profile/academicSummary and
conditionally render the title and summary sections accordingly.
| fun HomeRoute( | ||
| profile: Profile, | ||
| academicSummary: AcademicSummary | ||
| academicSummary: AcademicSummary, | ||
| navigateGraduationProgress: () -> Unit, | ||
| ) { | ||
| HomeScreen( | ||
| profile = profile, | ||
| academicSummary = academicSummary | ||
| academicSummary = academicSummary, | ||
| navigateGraduationProgress = navigateGraduationProgress, |
There was a problem hiding this comment.
주전공/복수전공 선택 정보가 네비게이션에서 사라집니다.
navigateGraduationProgress가 무인자 콜백이라 두 카드가 모두 같은 목적지로 이동합니다. 지금 구조로는 복수전공 사용자가 어떤 전공의 졸업요건을 보려는지 전달할 수 없어서, 두 버튼이 사실상 같은 화면/같은 데이터로 수렴합니다. 전공 타입이나 전공명을 함께 넘기도록 시그니처를 확장해야 합니다.
Also applies to: 50-66
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/presentation/home/home/HomeScreen.kt`
around lines 16 - 24, HomeRoute currently passes a no-arg callback
navigateGraduationProgress into HomeScreen so both major cards navigate to the
same destination; change the callback signature to accept an identifier (e.g.,
MajorType or majorName) and update HomeRoute, HomeScreen, and the two card click
handlers to pass the appropriate value (primary vs. double-major) through;
update all call sites (including the other occurrences around the
HomeScreen/card rendering) to use the new navigateGraduationProgress(majorId)
signature so the destination receives which major to show.
| import com.chukchukhaksa.mobile.presentation.home.graduationprogress.graduationProgressResponseSampleData | ||
|
|
||
| class RemoteGraduationDataSourceImpl(): RemoteGraduationDataSource { | ||
| override suspend fun getGraduationProgress(): GraduationProcessListData { | ||
| return graduationProgressResponseSampleData | ||
| } |
There was a problem hiding this comment.
레이어 의존성 방향 위반
remote 레이어가 presentation 레이어의 샘플 데이터를 import하고 있습니다. 이는 클린 아키텍처의 의존성 규칙을 위반합니다 (data/remote → presentation 방향).
더미 데이터라도 data 또는 common 레이어에 위치시키는 것이 바람직합니다. 실제 API 연동 시 이 import가 제거되더라도, 현재 상태에서 아키텍처 위반이 존재합니다.
🛠️ 제안된 수정
샘플 데이터를 data 레이어로 이동:
-import com.chukchukhaksa.mobile.presentation.home.graduationprogress.graduationProgressResponseSampleData
+import com.chukchukhaksa.mobile.data.graduation.GraduationProgressSampleData.graduationProgressResponseSampleData🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@composeApp/src/commonMain/kotlin/com/chukchukhaksa/mobile/remote/graduation/RemoteGraduationDataSourceImpl.kt`
around lines 5 - 10, RemoteGraduationDataSourceImpl is importing
presentation-level graduationProgressResponseSampleData which violates layer
dependency rules; move the sample fixture out of the presentation layer into the
data/common layer (e.g., create a sample data object in the data module) and
update RemoteGraduationDataSourceImpl to import that new location (or remove the
sample import and return a data-layer fixture). Ensure references to
graduationProgressResponseSampleData in RemoteGraduationDataSourceImpl are
replaced with the new data-layer symbol and keep the public API types
(RemoteGraduationDataSource, GraduationProcessListData) unchanged.
📌 PR 요약
🌱 작업한 내용
🌱 PR 포인트
📸 스크린샷
📮 관련 이슈
RCA 룰을 사용하여 코드 리뷰를 해주세요
R (Request Changes): 적극적으로 반영을 고려해주세요C (Comment): 웬만하면 반영해주세요A (Approve): 반영해도 좋고, 넘어가도 좋습니다. 사소한 의견입니다.Summary by CodeRabbit
릴리스 노트
새로운 기능
스타일