-
Notifications
You must be signed in to change notification settings - Fork 0
#181 refactor: hilt 의존성 제거 #183
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
Conversation
- hilt 의존성 제거 - OpenMajor Koin 의존성 주입 - common:security 모듈 제거 - 전체적인 koin 모듈 코드 형태 일원화 및 네이밍 수정
Walkthrough이 변경 사항은 프로젝트 전반에 걸쳐 Hilt 기반의 의존성 주입(Dependency Injection) 구현을 완전히 제거하고, Hilt 관련 코드, 어노테이션, DI 모듈, 플러그인, 빌드 스크립트, 모델 및 보조 클래스, 인터페이스 등을 삭제하거나 Koin 기반 DI로 대체합니다. DI 모듈 및 ViewModel 바인딩도 Koin DSL로 재작성되었습니다. Changes
Changes Table
Sequence Diagram(s)sequenceDiagram
participant App
participant Koin
participant ViewModel
participant UseCase
participant Repository
App->>Koin: DI 모듈 초기화
App->>ViewModel: ViewModel 요청
Koin->>ViewModel: ViewModel 생성 및 의존성 주입
ViewModel->>UseCase: UseCase 호출
UseCase->>Repository: Repository 호출
Repository-->>UseCase: 결과 반환
UseCase-->>ViewModel: 결과 반환
ViewModel-->>App: UI 상태 업데이트
Assessment against linked issues
Possibly related PRs
Suggested reviewers
Poem
Tip ⚡️ Faster reviews with caching
Enjoy the performance boost—your workflow just got faster. ✨ Finishing Touches
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
CodeRabbit Configuration File (
|
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: 2
🔭 Outside diff range comments (2)
gradle/libs.versions.toml (1)
70-71: 🛠️ Refactor suggestionKoin 버전을 정식(stable) 릴리스로 교체하는 것을 권장합니다
현재koin = "4.1.0-Beta10"베타 버전을 사용하고 있습니다. 베타 버전은 API 변경·회귀 가능성이 높아 운영 환경에서 예기치 않은 장애가 발생할 수 있습니다. 안드로이드-Compose 환경에서는 Koin 3.5.x(안정화) 라인이 널리 사용되고 있으며, 2025-05 기준 최신 LTS 는3.5.6입니다.-koin = "4.1.0-Beta10" +koin = "3.5.6"베타 기능이 필요하지 않다면 안정화 버전으로 교체해 의존성 리스크를 낮춰 주세요.
presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/OpenMajorViewModel.kt (1)
64-72: 🛠️ Refactor suggestion빈
catch {}블록은 예외를 삼켜 버립니다
예외가 발생해도 로그·사이드이펙트가 없으므로 문제를 파악하기 어렵습니다. 최소 로그 출력 또는 사용자 피드백이 필요합니다.-}.catch { -}.launchIn(viewModelScope) +}.catch { throwable -> + Timber.e(throwable, "오픈 전공 목록 로드 실패") + postSideEffect(OpenMajorSideEffect.ShowErrorToast) +}.launchIn(viewModelScope)
Timber사용 시RemoteConfig나 Crashlytics 연동을 통해 장애를 조기에 탐지할 수 있습니다.
🧹 Nitpick comments (9)
local/common/src/main/java/com/suwiki/local/common/datastore/proto/UserPreferenceSerializer.kt (1)
10-10: Hilt @Inject 제거 확인 및 클래스 선언 스타일 개선
@Inject어노테이션이 제거되어 Hilt 의존성이 깔끔하게 제거되었습니다. 이 변경에 따라UserPreferenceSerializer가 Koin 모듈에 올바르게 등록되어 DI 컨테이너에서 제공되는지 반드시 확인해주세요. 누락되면 DataStore 초기화 시 런타임 오류가 발생할 수 있습니다.또한 Kotlin 스타일 가이드에 맞춰 클래스 선언과 콜론(
:) 사이에 공백을 추가하는 것을 권장합니다:-class UserPreferenceSerializer: Serializer<UserPreference> { +class UserPreferenceSerializer : Serializer<UserPreference> {local/openmajor/src/main/java/com/suwiki/local/openmajor/di/LocalOpenMajorDataSourceModule.kt (1)
14-14: 불필요한 빈 줄 제거 권장파일 끝에 불필요한 빈 줄이 있습니다. 코드 일관성을 위해 제거하는 것이 좋습니다.
} -14domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/GetOpenMajorListUseCase.kt (1)
7-7: 불필요한 후행 쉼표 제거 필요생성자에서
@Inject주석이 성공적으로 제거되었지만, 파라미터 목록 끝에 불필요한 쉼표가 있습니다. 코드 가독성과 일관성을 위해 제거해주세요.-class GetOpenMajorListUseCase (private val openMajorRepository: OpenMajorRepository, ) { +class GetOpenMajorListUseCase (private val openMajorRepository: OpenMajorRepository) {presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/di/OpenMajorViewModelModule.kt (1)
10-10: 의존성 명시를 통한 코드 가독성 향상 제안현재
get()함수를 사용하여 익명으로 의존성을 주입하고 있습니다. 코드의 가독성과 유지보수성을 높이기 위해 어떤 타입이 주입되는지 명시적으로 표시하는 것이 좋습니다.- OpenMajorViewModel(get(), get(), savedStateHandle) + OpenMajorViewModel( + getOpenMajorListUseCase = get(), + lessonSearchUseCase = get(), + savedStateHandle = savedStateHandle + )local/timetable/src/main/java/com.suwiki.local.timetable/di/LocalTimetableDataSourceModule.kt (1)
8-9: 사용하지 않는 import 제거 필요
org.koin.dsl.bindimport가 더 이상 사용되지 않는 것으로 보입니다. 코드 정리를 위해 제거하는 것이 좋겠습니다.-import org.koin.dsl.binddata/timetable/src/main/java/com/suwiki/data/timetable/di/TitmetableRepositoryModule.kt (1)
7-8: 사용하지 않는 import 제거 필요
org.koin.core.module.dsl.bind와org.koin.core.module.dsl.singleOfimport가 코드에서 더 이상 사용되지 않습니다. 미사용 import를 제거하는 것이 좋겠습니다.-import org.koin.core.module.dsl.bind -import org.koin.core.module.dsl.singleOfgradle/libs.versions.toml (1)
208-208: Compose 번들에ui-tooling과ui-test-manifest가 누락되었습니다
compose-debug번들로 별도 관리하고 있지만, 디버그/프리뷰 편의성을 위해compose기본 번들에 포함시키는 프로젝트도 많습니다. 개발 워크플로에 따라 번들 구성을 재검토해 보세요.remote/openmajor/src/main/java/com/suwiki/remote/openmajor/datasource/RemoteOpenMajorDataSourceImpl.kt (1)
6-14: 네트워크 예외가 그대로 전파됩니다 – Result 랩핑 또는 에러 매핑이 필요합니다
majorApi.*().getOrThrow()는 HTTP/L7 오류를throw하여 상위 계층(ViewModel 등)으로 바로 전파됩니다. 오류 유형에 따라 사용자 메시지 매핑·재시도 전략 등을 다르게 적용하려면, DataSource 레이어에서 적절한Result변환 혹은 custom 예외 매핑을 수행하는 편이 유지보수에 유리합니다.return runCatching { majorApi.getOpenMajorVersion() } .mapCatching { it.getOrThrow().version }이와 같은 패턴을 사용하면 도메인/프레젠테이션 계층에서 functor(성공/실패) 기반으로 공통 처리할 수 있습니다.
presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/OpenMajorViewModel.kt (1)
75-83: 리스트 필터링 로직이 메인 스레드에서 동기 실행됩니다
allOpenMajorList.toOpenMajorList()가 큰 리스트를 다룰 경우 UI 프레임 드랍이 발생할 수 있습니다.withContext(Dispatchers.Default)로 오프로드하거나, Flow 로 변환해 백그라운드에서 처리하도록 개선을 고려해 주세요.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (107)
app-compose/build.gradle.kts(1 hunks)app-compose/src/main/java/com/kunize/uswtimetable/SuwikiApplication.kt(2 hunks)build-logic/convention/build.gradle.kts(0 hunks)build-logic/convention/src/main/java/AndroidHiltConventionPlugin.kt(0 hunks)build-logic/convention/src/main/java/DataConventionPlugin.kt(0 hunks)build-logic/convention/src/main/java/PresentationComposeConventionPlugin.kt(0 hunks)build-logic/convention/src/main/java/RemoteConventionPlugin.kt(0 hunks)build.gradle.kts(0 hunks)common/android/build.gradle.kts(0 hunks)common/android/src/main/java/com/suwiki/common/android/Dispatcher.kt(0 hunks)common/android/src/main/java/com/suwiki/common/android/DispatchersModule.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/PurchaseHistory.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/exam/ExamEvaluationList.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/exam/MyExamEvaluation.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureEvaluationAverage.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureEvaluationExtraAverage.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureEvaluationList.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureInfo.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/MyLectureEvaluation.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/notice/Notice.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/notice/NoticeDetail.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/user/Suspension.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/user/Token.kt(0 hunks)common/model/src/main/java/com/suwiki/common/model/user/User.kt(0 hunks)common/security/.gitignore(0 hunks)common/security/build.gradle.kts(0 hunks)common/security/proguard-rules.pro(0 hunks)common/security/src/main/AndroidManifest.xml(0 hunks)common/security/src/main/java/com/suwiki/common/security/SecurityPreferences.kt(0 hunks)common/security/src/main/java/com/suwiki/common/security/di/DataStoreModule.kt(0 hunks)common/security/src/main/java/com/suwiki/common/security/di/SecureDataStore.kt(0 hunks)common/security/src/test/java/com/suwiki/security/ExampleUnitTest.kt(0 hunks)data/openmajor/src/main/java/com/suwiki/data/openmajor/datasource/RemoteOpenMajorDataSource.kt(0 hunks)data/openmajor/src/main/java/com/suwiki/data/openmajor/repository/OpenMajorRepositoryImpl.kt(0 hunks)data/timetable/src/main/java/com/suwiki/data/timetable/di/TitmetableRepositoryModule.kt(1 hunks)data/timetable/src/main/java/com/suwiki/data/timetable/repository/OpenLectureRepositoryImpl.kt(0 hunks)data/timetable/src/main/java/com/suwiki/data/timetable/repository/TimetableRepositoryImpl.kt(0 hunks)domain/openmajor/build.gradle.kts(1 hunks)domain/openmajor/src/main/java/com/suwiki/domain/openmajor/di/OpenMajorUseCaseModule.kt(1 hunks)domain/openmajor/src/main/java/com/suwiki/domain/openmajor/repository/OpenMajorRepository.kt(0 hunks)domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/GetBookmarkedOpenMajorListUseCase.kt(0 hunks)domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/GetOpenMajorListUseCase.kt(1 hunks)domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/RegisterBookmarkUseCase.kt(0 hunks)domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/UnRegisterBookmarkUseCase.kt(0 hunks)domain/timetable/build.gradle.kts(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/TimetableUseCaseModule.kt(1 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/timetableDomainModule.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/DeleteTimetableCellUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/DeleteTimetableUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetAllTimetableUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetMainTimetableUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetOpenLectureListUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetTimetableCellTypeUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/InsertTimetableCellUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/InsertTimetableUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/SetMainTimetableCreateTime.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/SetTimetableCellTypeUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/UpdateOpenLectureIfNeedUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/UpdateTimetableCellUseCase.kt(0 hunks)domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/UpdateTimetableUseCase.kt(0 hunks)gradle/libs.versions.toml(1 hunks)local/common/build.gradle.kts(0 hunks)local/common/src/main/java/com/suwiki/local/common/database/di/DaoModule.kt(0 hunks)local/common/src/main/java/com/suwiki/local/common/datastore/di/DataStoreModule.kt(0 hunks)local/common/src/main/java/com/suwiki/local/common/datastore/di/NormalDataStore.kt(0 hunks)local/common/src/main/java/com/suwiki/local/common/datastore/proto/UserPreferenceSerializer.kt(1 hunks)local/openmajor/build.gradle.kts(1 hunks)local/openmajor/src/main/java/com/suwiki/local/openmajor/datasource/LocalOpenMajorDataSourceImpl.kt(0 hunks)local/openmajor/src/main/java/com/suwiki/local/openmajor/di/LocalDataSourceModule.kt(0 hunks)local/openmajor/src/main/java/com/suwiki/local/openmajor/di/LocalOpenMajorDataSourceModule.kt(1 hunks)local/timetable/build.gradle.kts(0 hunks)local/timetable/src/main/java/com.suwiki.local.timetable/datasource/LocalOpenLectureDatasourceImpl.kt(0 hunks)local/timetable/src/main/java/com.suwiki.local.timetable/datasource/LocalTimetableDatasourceImpl.kt(0 hunks)local/timetable/src/main/java/com.suwiki.local.timetable/di/LocalTimetableDataSourceModule.kt(1 hunks)presentation/navigator/build.gradle.kts(1 hunks)presentation/navigator/src/main/java/com/suwiki/presentation/navigator/MainActivity.kt(0 hunks)presentation/navigator/src/main/java/com/suwiki/presentation/navigator/MainScreen.kt(1 hunks)presentation/navigator/src/main/java/com/suwiki/presentation/navigator/MainViewModel.kt(1 hunks)presentation/navigator/src/main/java/com/suwiki/presentation/navigator/di/MainViewModelModule.kt(1 hunks)presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/OpenMajorScreen.kt(0 hunks)presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/OpenMajorViewModel.kt(1 hunks)presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/di/OpenMajorModule.kt(0 hunks)presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/di/OpenMajorViewModelModule.kt(1 hunks)presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/model/OpenMajor.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/celleditor/CellEditorScreen.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/celleditor/CellEditorViewModel.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/di/TimetableModule.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/di/TimetableViewModelModule.kt(1 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/openlecture/OpenLectureScreen.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/openlecture/OpenLectureViewModel.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetable/TimetableScreen.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetable/TimetableViewModel.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetableeditor/TimetableEditorScreen.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetableeditor/TimetableEditorViewModel.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetablelist/TimetableListScreen.kt(0 hunks)presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetablelist/TimetableListViewModel.kt(0 hunks)remote/common/build.gradle.kts(0 hunks)remote/common/src/main/java/com/suwiki/remote/common/authenticator/TokenAuthenticator.kt(0 hunks)remote/common/src/main/java/com/suwiki/remote/common/di/ApiModule.kt(1 hunks)remote/common/src/main/java/com/suwiki/remote/common/di/NetworkModule.kt(0 hunks)remote/common/src/main/java/com/suwiki/remote/common/di/Qualifier.kt(0 hunks)remote/common/src/main/java/com/suwiki/remote/common/di/RepositoryModule.kt(0 hunks)remote/common/src/main/java/com/suwiki/remote/common/interceptor/AuthenticationInterceptor.kt(0 hunks)remote/common/src/main/java/com/suwiki/remote/common/repository/AuthRepository.kt(0 hunks)remote/common/src/main/java/com/suwiki/remote/common/repository/AuthRepositoryImpl.kt(0 hunks)remote/openmajor/src/main/java/com/suwiki/remote/openmajor/datasource/RemoteOpenMajorDataSourceImpl.kt(1 hunks)remote/openmajor/src/main/java/com/suwiki/remote/openmajor/di/RemoteDataSourceModule.kt(0 hunks)
⛔ Files not processed due to max files limit (5)
- remote/openmajor/src/main/java/com/suwiki/remote/openmajor/di/RemoteOpenMajorApiModule.kt
- remote/openmajor/src/main/java/com/suwiki/remote/openmajor/di/RemoteOpenMajorDataSourceModule.kt
- remote/timetable/src/main/java/com.suwiki.remote.timetable/datasource/RemoteOpenLectureDataSourceImpl.kt
- remote/timetable/src/main/java/com.suwiki.remote.timetable/di/RemoteTimetableDataSourceModule.kt
- settings.gradle.kts
💤 Files with no reviewable changes (86)
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/DeleteTimetableUseCase.kt
- build-logic/convention/src/main/java/PresentationComposeConventionPlugin.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/InsertTimetableUseCase.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/UpdateTimetableUseCase.kt
- local/common/build.gradle.kts
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/SetMainTimetableCreateTime.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/DeleteTimetableCellUseCase.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/UpdateTimetableCellUseCase.kt
- data/timetable/src/main/java/com/suwiki/data/timetable/repository/OpenLectureRepositoryImpl.kt
- local/timetable/src/main/java/com.suwiki.local.timetable/datasource/LocalTimetableDatasourceImpl.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/SetTimetableCellTypeUseCase.kt
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetable/TimetableScreen.kt
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/celleditor/CellEditorScreen.kt
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetablelist/TimetableListViewModel.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetMainTimetableUseCase.kt
- domain/timetable/build.gradle.kts
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetableeditor/TimetableEditorViewModel.kt
- presentation/navigator/src/main/java/com/suwiki/presentation/navigator/MainActivity.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetTimetableCellTypeUseCase.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetAllTimetableUseCase.kt
- build-logic/convention/src/main/java/RemoteConventionPlugin.kt
- local/common/src/main/java/com/suwiki/local/common/database/di/DaoModule.kt
- build-logic/convention/src/main/java/DataConventionPlugin.kt
- data/timetable/src/main/java/com/suwiki/data/timetable/repository/TimetableRepositoryImpl.kt
- common/android/build.gradle.kts
- common/model/src/main/java/com/suwiki/common/model/user/Suspension.kt
- common/security/src/main/AndroidManifest.xml
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/openlecture/OpenLectureViewModel.kt
- remote/common/src/main/java/com/suwiki/remote/common/di/NetworkModule.kt
- local/timetable/src/main/java/com.suwiki.local.timetable/datasource/LocalOpenLectureDatasourceImpl.kt
- common/security/.gitignore
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/InsertTimetableCellUseCase.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/UpdateOpenLectureIfNeedUseCase.kt
- presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/OpenMajorScreen.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/usecase/GetOpenLectureListUseCase.kt
- local/timetable/build.gradle.kts
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetablelist/TimetableListScreen.kt
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetableeditor/TimetableEditorScreen.kt
- remote/common/src/main/java/com/suwiki/remote/common/repository/AuthRepositoryImpl.kt
- domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/RegisterBookmarkUseCase.kt
- presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/di/OpenMajorModule.kt
- build.gradle.kts
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/celleditor/CellEditorViewModel.kt
- local/common/src/main/java/com/suwiki/local/common/datastore/di/DataStoreModule.kt
- data/openmajor/src/main/java/com/suwiki/data/openmajor/datasource/RemoteOpenMajorDataSource.kt
- remote/common/build.gradle.kts
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureEvaluationExtraAverage.kt
- common/android/src/main/java/com/suwiki/common/android/Dispatcher.kt
- common/security/build.gradle.kts
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureEvaluationAverage.kt
- domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/UnRegisterBookmarkUseCase.kt
- common/security/src/main/java/com/suwiki/common/security/SecurityPreferences.kt
- domain/timetable/src/main/java/com/suwiki/domain/timetable/timetableDomainModule.kt
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/MyLectureEvaluation.kt
- build-logic/convention/build.gradle.kts
- remote/common/src/main/java/com/suwiki/remote/common/interceptor/AuthenticationInterceptor.kt
- common/model/src/main/java/com/suwiki/common/model/notice/Notice.kt
- local/openmajor/src/main/java/com/suwiki/local/openmajor/datasource/LocalOpenMajorDataSourceImpl.kt
- domain/openmajor/src/main/java/com/suwiki/domain/openmajor/usecase/GetBookmarkedOpenMajorListUseCase.kt
- common/model/src/main/java/com/suwiki/common/model/user/Token.kt
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureEvaluationList.kt
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/openlecture/OpenLectureScreen.kt
- remote/common/src/main/java/com/suwiki/remote/common/di/RepositoryModule.kt
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/lecture/LectureInfo.kt
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/di/TimetableModule.kt
- common/security/src/test/java/com/suwiki/security/ExampleUnitTest.kt
- remote/openmajor/src/main/java/com/suwiki/remote/openmajor/di/RemoteDataSourceModule.kt
- common/security/src/main/java/com/suwiki/common/security/di/SecureDataStore.kt
- common/model/src/main/java/com/suwiki/common/model/user/User.kt
- presentation/timetable/src/main/java/com/suwiki/presentation/timetable/timetable/TimetableViewModel.kt
- domain/openmajor/src/main/java/com/suwiki/domain/openmajor/repository/OpenMajorRepository.kt
- local/common/src/main/java/com/suwiki/local/common/datastore/di/NormalDataStore.kt
- common/model/src/main/java/com/suwiki/common/model/notice/NoticeDetail.kt
- remote/common/src/main/java/com/suwiki/remote/common/repository/AuthRepository.kt
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/PurchaseHistory.kt
- build-logic/convention/src/main/java/AndroidHiltConventionPlugin.kt
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/exam/ExamEvaluationList.kt
- common/model/src/main/java/com/suwiki/common/model/lectureevaluation/exam/MyExamEvaluation.kt
- common/security/proguard-rules.pro
- common/android/src/main/java/com/suwiki/common/android/DispatchersModule.kt
- remote/common/src/main/java/com/suwiki/remote/common/di/Qualifier.kt
- remote/common/src/main/java/com/suwiki/remote/common/authenticator/TokenAuthenticator.kt
- local/openmajor/src/main/java/com/suwiki/local/openmajor/di/LocalDataSourceModule.kt
- presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/model/OpenMajor.kt
- data/openmajor/src/main/java/com/suwiki/data/openmajor/repository/OpenMajorRepositoryImpl.kt
- common/security/src/main/java/com/suwiki/common/security/di/DataStoreModule.kt
🧰 Additional context used
🧬 Code Graph Analysis (1)
presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/OpenMajorViewModel.kt (2)
data/timetable/src/main/java/com/suwiki/data/timetable/repository/OpenLectureRepositoryImpl.kt (1)
getOpenMajor(79-81)domain/timetable/src/main/java/com/suwiki/domain/timetable/repository/OpenLectureRepository.kt (1)
getOpenMajor(19-19)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build
🔇 Additional comments (20)
remote/common/src/main/java/com/suwiki/remote/common/di/ApiModule.kt (1)
3-13: Hilt에서 Koin으로의 마이그레이션이 정확하게 수행되었습니다.의존성 주입 프레임워크를 Hilt에서 Koin으로 변경하는 구현이 올바르게 이루어졌습니다.
AuthApi를 제공하는 방식이 Koin DSL을 사용하여 적절하게 변환되었으며, 이전의@NoAuthRetrofit한정자가 Koin의named("NoAuthRetrofit")로 올바르게 대체되었습니다.domain/openmajor/build.gradle.kts (1)
11-12: Hilt 의존성이 Koin으로 적절하게 대체되었습니다.도메인 레이어에서 Hilt 의존성이 제거되고 Koin 의존성으로 교체된 것이 확인됩니다. 이는 PR 목표에 부합하는 변경입니다.
app-compose/build.gradle.kts (2)
27-27: remote.common 모듈 의존성 추가가 적절합니다.Hilt 제거 및 Koin 도입에 따라 remote.common 모듈 의존성이 추가되었습니다. 이 모듈에서 정의된 Koin 모듈을 애플리케이션에서 로드하기 위해 필요한 변경으로 보입니다.
31-31: local.common 모듈 의존성 추가가 적절합니다.Hilt 제거 및 Koin 도입에 따라 local.common 모듈 의존성이 추가되었습니다. 이 모듈에서 정의된 Koin 모듈을 애플리케이션에서 로드하기 위해 필요한 변경입니다.
local/openmajor/build.gradle.kts (1)
26-28: Koin 의존성이 적절하게 추가되었습니다.Hilt 의존성을 제거하고 Koin 의존성(core 및 android)을 추가한 것이 확인됩니다. Android 라이브러리 모듈에서 필요한 모든 Koin 관련 의존성이 올바르게 추가되었습니다.
presentation/navigator/build.gradle.kts (1)
14-16: Koin Compose 의존성이 올바르게 추가되었습니다.Hilt에서 Koin으로 의존성 주입 프레임워크를 전환하는 과정에서 필요한 Koin Compose 관련 의존성들이 적절히 추가되었습니다. 특히 Compose에서 ViewModel 관련 기능과 Navigation 통합을 위한 라이브러리들이 포함되어 있어 변경 사항이 잘 구현되었습니다.
presentation/navigator/src/main/java/com/suwiki/presentation/navigator/MainScreen.kt (2)
18-18: Hilt에서 Koin으로 import 변경이 잘 이루어졌습니다.기존 Hilt 관련 import 문을 제거하고 Koin의 ViewModel 관련 import로 적절히 대체되었습니다.
25-25: ViewModel 주입 방식이 Koin으로 성공적으로 변경되었습니다.기존
hiltViewModel()에서koinViewModel()로 ViewModel 주입 방식이 성공적으로 변경되었습니다. 이는 PR 목표에 맞게 Hilt 의존성을 Koin으로 대체하는 작업의 중요한 부분입니다.domain/openmajor/src/main/java/com/suwiki/domain/openmajor/di/OpenMajorUseCaseModule.kt (1)
1-9: OpenMajor 모듈의 Koin 의존성 주입이 잘 구현되었습니다.이 새로운 파일은 Koin을 사용하여 OpenMajor 모듈의 UseCase를 제공하는 모듈을 정의합니다.
factory함수를 사용하여GetOpenMajorListUseCase의 새 인스턴스를 매번 주입하도록 설정된 것이 적절합니다.PR 목표에 언급된 "OpenMajor 모듈에 Koin 의존성 주입 도입"에 부합하는 구현입니다.
presentation/navigator/src/main/java/com/suwiki/presentation/navigator/di/MainViewModelModule.kt (1)
1-9: MainViewModel을 위한 Koin 모듈이 적절히 구현되었습니다.이 새로운 파일은 Koin의
viewModelOfDSL을 사용하여 MainViewModel을 등록하는 모듈을 정의합니다. 이 접근 방식은 ViewModel의 생명주기를 적절히 관리하면서 Koin을 통한, Jetpack Compose와 함께 사용되는 ViewModel 주입에 가장 적합한 방식입니다.PR 목표에 명시된 대로 Hilt를 Koin으로 대체하는 작업의 일환으로, 프로젝트 전반에 걸친 Koin 모듈 표준화에도 잘 부합합니다.
presentation/navigator/src/main/java/com/suwiki/presentation/navigator/MainViewModel.kt (1)
18-18: Hilt 주석이 성공적으로 제거되었습니다.ViewModel에서 Hilt 관련 주석(
@HiltViewModel,@Inject)을 제거한 것이 확인됩니다. 이제 이 ViewModel은 Koin을 통해 제공되어야 합니다. MainViewModel 관련 Koin 모듈이 어딘가에 정의되어 있는지 확인하세요.local/openmajor/src/main/java/com/suwiki/local/openmajor/di/LocalOpenMajorDataSourceModule.kt (1)
8-12: Koin 모듈이 잘 구현되었습니다.LocalOpenMajorDataSource 인터페이스를 위한 Koin 모듈이 정확하게 구현되었습니다. 이전의 Hilt 모듈을 대체하는 구현으로 적절합니다.
presentation/openmajor/src/main/java/com/suwiki/presentation/openmajor/di/OpenMajorViewModelModule.kt (1)
8-12: ViewModel 제공을 위한 Koin 모듈이 잘 구현되었습니다.OpenMajorViewModel을 위한 Koin 모듈이 정확하게 구현되었습니다. SavedStateHandle을 올바르게 처리하고 있어 좋습니다.
local/timetable/src/main/java/com.suwiki.local.timetable/di/LocalTimetableDataSourceModule.kt (2)
12-14: Koin 타입 명시 스타일로 리팩토링되었습니다.
single<LocalTimetableDataSource>구문을 사용하여 인터페이스 타입을 명시적으로 지정하도록 변경되었습니다. 이는 기존 bind 메서드를 사용하는 방식에서 더 명확한 스타일로 변경된 것입니다.
16-18: Koin 타입 명시 스타일로 리팩토링되었습니다.
single<LocalOpenLectureDataSource>구문을 사용하여 인터페이스 타입을 명시적으로 지정하도록 변경되었습니다. 이는 이전 스타일에서 더 명확한 스타일로 일관성 있게 변경되었습니다.data/timetable/src/main/java/com/suwiki/data/timetable/di/TitmetableRepositoryModule.kt (1)
12-13: Koin DI 스타일 통일
single<Interface> { Implementation(...) }형식으로 레포지토리 바인딩 스타일이 변경되었습니다. 이전singleOf와bind방식에서 더 직관적인 형태로 변경되었으며, PR 목표에 맞게 Koin 모듈 스타일이 통일되었습니다.presentation/timetable/src/main/java/com/suwiki/presentation/timetable/di/TimetableViewModelModule.kt (2)
12-22: Koin을 사용한 ViewModel 주입 모듈이 잘 구현되었습니다.Hilt에서 Koin으로 마이그레이션하는 PR 목표에 맞게 ViewModel 주입을 위한 Koin 모듈이 잘 구현되었습니다.
SavedStateHandle이 필요한 ViewModel(CellEditorViewModel,TimetableEditorViewModel)과 일반 ViewModel에 대한 주입 방식이 적절히 구분되어 있습니다.
3-10: 필요한 import들이 잘 정리되어 있습니다.ViewModel과 SavedStateHandle, Koin 관련 import들이 필요에 맞게 잘 정의되어 있습니다.
app-compose/src/main/java/com/kunize/uswtimetable/SuwikiApplication.kt (2)
6-21: 모듈 import가 명확히 구조화되었습니다.Hilt에서 Koin으로의 마이그레이션 과정에서 필요한 모든 모듈이 체계적으로 import 되었습니다. 도메인, 데이터, 프레젠테이션, 로컬, 리모트 레이어별로 필요한 모듈들이 명확하게 구분되어 있습니다.
33-63: 모듈 등록이 체계적으로 카테고리화되었습니다.Koin 모듈 등록이 다음과 같이 명확한 카테고리로 구분되어 있어 가독성과 유지보수성이 향상되었습니다:
- data module
- domain module
- presentation module
- local module (common 포함)
- remote module (common 포함)
이러한 구조화는 의존성 그래프를 이해하기 쉽게 만들고 앱의 아키텍처를 명확히 보여줍니다.
| package com.suwiki.domain.timetable | ||
|
|
||
| import com.suwiki.domain.timetable.usecase.* | ||
| import org.koin.dsl.module | ||
|
|
||
| val timetableUseCaseModule = module { |
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.
🛠️ Refactor suggestion
Domain 레이어에 DI 프레임워크 의존이 생겼습니다
domain 모듈은 비프레임워크·순수 Kotlin 계층으로 유지하는 것이 Clean Architecture 원칙이며, 테스트 용이성과 모듈 독립성이 높아집니다. Koin 모듈 정의는 :di, :app 또는 :presentation 과 같은 상위 레이어에 두고, 도메인 모듈에는 순수한 UseCase·Interface 만 남기는 방향을 권장합니다.
- val timetableUseCaseModule = module { ... }
+ // domain 모듈 밖(예: :app-di)으로 이동추후 DI 프레임워크 교체 시 영향 범위를 줄일 수 있습니다.
Committable suggestion skipped: line range outside the PR's diff.
| fun initData() = intent { | ||
| reduce { state.copy(isLoading = true) } | ||
| joinAll(getOpenMajor(), getBookmarkedOpenMajor()) | ||
| joinAll(getOpenMajor()) | ||
| reduce { state.copy(isLoading = false) } | ||
| } |
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.
joinAll(getOpenMajor()) 는 컴파일 오류를 유발합니다
joinAll 의 매개변수는 Job 객체인데, 현재 getOpenMajor() 는 Unit 을 반환합니다. 빌드 단계에서 None of the following functions can be called with the arguments supplied 오류가 발생합니다.
-joinAll(getOpenMajor())
+getOpenMajor() // 또는 launch { getOpenMajor() }대기(Join)가 필요하다면 val job = getOpenMajor() 처럼 Job 을 반환하도록 함수를 변경하고 job.join() 을 호출해 주세요.
📝 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.
| fun initData() = intent { | |
| reduce { state.copy(isLoading = true) } | |
| joinAll(getOpenMajor(), getBookmarkedOpenMajor()) | |
| joinAll(getOpenMajor()) | |
| reduce { state.copy(isLoading = false) } | |
| } | |
| fun initData() = intent { | |
| reduce { state.copy(isLoading = true) } | |
| - joinAll(getOpenMajor()) | |
| + getOpenMajor() // 또는 launch { getOpenMajor() } | |
| reduce { state.copy(isLoading = false) } | |
| } |
jinukeu
left a 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.
고생하셨습니다
koin은 나중에 한번 싹- 정리하시죠
📌 PR 요약
🌱 작업한 내용
🌱 PR 포인트
각 모듈들에 정의되어 있는 koin 모듈들은 전부 SuwikiApplication에 등록하였습니다.
koin 모듈 코드 형태가 조금씩 달라서 최대한 일원화 하는 방향으로 작업했습니다.
작업하면서 사용되지 않고 있는 코드들 또한 제거하였습니다.
모든 기능들에 대해서 테스트를 해본 거 같은데, 의존성 주입이 잘못되면 런타임 에러가 발생하기 때문에 더 추가적인 테스트가 필요할 거 같습니다.
예상보다 코드 변경량이 많네요...ㅎㅎ; 다음부터는 코드 변경량 조절 좀 할게여...!!
📸 스크린샷
📮 관련 이슈
Summary by CodeRabbit
신규 기능
버그 수정
리팩터
기타