-
Notifications
You must be signed in to change notification settings - Fork 0
Revert "[Chore] Koin Annotation 으로 정리 #210" #217
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
Walkthrough종속성 주입(DI) 프레임워크를 Koin에서 Dagger/Hilt로 전환하는 대규모 마이그레이션입니다. 여러 DI 모듈이 추가되고, 리포지토리 및 ViewModel 어노테이션이 업데이트되며, 빌드 설정이 Hilt를 지원하도록 조정되었습니다. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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. 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: 13
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
app/build.gradle.kts (1)
110-119: Koin 의존성이 중복 선언되었습니다.110-113번 줄에서 하드코딩된 버전(3.5.3)으로 Koin 의존성을 추가했는데, 116-118번 줄에서 버전 카탈로그(
libs.*)를 사용하여 동일한 Koin 의존성을 다시 선언하고 있습니다.이는 다음과 같은 문제를 발생시킬 수 있습니다:
- Gradle이 버전 충돌을 해결하면서 예상치 못한 버전 선택
- 빌드 시간 증가
- 런타임에 클래스패스 문제 발생 가능
하나의 방식으로 통일하세요. 버전 카탈로그 방식을 권장합니다.
♻️ 수정 제안
- // Koin - implementation("io.insert-koin:koin-core:3.5.3") - implementation("io.insert-koin:koin-android:3.5.3") - implementation("io.insert-koin:koin-androidx-compose:3.5.3") - // Koin implementation(libs.koin.android) implementation(libs.koin.androidx.compose)app/src/main/java/com/konkuk/medicarecall/App.kt (1)
37-49: DI 프레임워크 완전히 통일해야 합니다 - 현재 상태는 작동하지 않습니다.프로젝트에서 Hilt와 Koin이 혼재되어 있는 것이 맞습니다. 더 정확히는:
- App.kt: Koin만 사용 (KoinComponent, startKoin으로 초기화)
- Hilt 모듈들: RepositoryModule, NetworkModule, ApiModule 정의되어 있음 (@module @Installin)
- 리포지토리들: @Inject 생성자로 Hilt 의존성 주입 기대
- MainActivity.kt: @androidentrypoint + koinViewModel() 사용으로 두 프레임워크 혼용
가장 큰 문제는 App.kt에 @HiltAndroidApp이 없어서 Hilt가 실제로 초기화되지 않는다는 것입니다. 이렇게 되면:
- Hilt 모듈이 정의되어도 작동하지 않음
- @Inject 생성자 의존성 주입 실패 → 런타임 크래시
- Koin에는 리포지토리 정의가 없어서 주입 불가
해결책: Koin으로 완전히 통일하거나 Hilt로 완전히 마이그레이션해야 합니다. PR이 "Revert"라면 이전 상태(Koin 전용)로 돌아가는 것을 권장합니다.
🤖 Fix all issues with AI agents
In @app/build.gradle.kts:
- Line 1: 현재 파일의 잘못된 import 문 'import java.lang.module.ModuleFinder.compose'를
제거하세요; ModuleFinder에 compose라는 정적 멤버가 없으므로 이 import는 무효입니다. 만약 Gradle Kotlin
DSL에서 Compose 설정이 필요하다면 import 대신 build.gradle.kts의 plugins 또는 android 블록(예:
compose 옵션/플러그인 선언)으로 처리하도록 구성하고, 파일 내 해당 잘못된 import 라인(import
java.lang.module.ModuleFinder.compose)을 삭제하세요.
In @app/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.kt:
- Around line 1-12: CalendarModule is registering CalendarViewModel with Koin
while the project uses Hilt; since CalendarViewModel has no dependencies, remove
the Koin module and convert the view model to Hilt: annotate CalendarViewModel
with @HiltViewModel and add an @Inject no-arg constructor, delete or stop
providing calendarModule, and update any consumers (Activities/Fragments) to
obtain the view model via Hilt (use @AndroidEntryPoint on the host and use the
Hilt-backed ViewModel retrieval like by viewModels() or hiltViewModel()).
In @app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.kt:
- Around line 1-121: Remove the unused Hilt module classes (e.g., NetworkModule,
ApiModule, RepositoryModule) that are dead code and not referenced by
App.kt/Koin; locate files named NetworkModule.kt, ApiModule.kt,
RepositoryModule.kt (and any Hilt module classes inside them), delete those
files or their Hilt module class definitions, and then update imports/usages
across the project (search for references to NetworkModule, ApiModule,
RepositoryModule or @Module/@InstallIn annotations) to ensure nothing imports
the removed symbols; leave the existing Koin modules (networkModule, apiModule,
repositoryModule, appModules) intact and run a build to fix any remaining
unresolved references.
In @app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt:
- Around line 57-144: Several repository implementation classes referenced by
the @Binds methods in RepositoryModule (e.g., ElderIdRepositoryImpl,
EldersHealthInfoRepositoryImpl, EldersInfoRepositoryImpl, GlucoseRepositoryImpl,
HealthRepositoryImpl, HomeRepositoryImpl, MealRepositoryImpl,
MedicineRepositoryImpl, MentalRepositoryImpl, NoticeRepositoryImpl,
SleepRepositoryImpl, StatisticsRepositoryImpl, SubscribeRepositoryImpl,
UpdateElderInfoRepositoryImpl) are missing the required @Inject on their
constructors; add @Inject to each implementation's primary constructor so Hilt
can provide them for the abstract bind methods (ensure the annotated constructor
is the primary/only constructor and that the class is concrete and public so the
binding in bindElderIdRepository, bindEldersHealthInfoRepository,
bindEldersInfoRepository, bindGlucoseRepository, bindHealthRepository,
bindHomeRepository, bindMealRepository, bindMedicineRepository,
bindMentalRepository, bindNoticeRepository, bindSleepRepository,
bindStatisticsRepository, bindSubscribeRepository, and
bindUpdateElderInfoRepository succeeds).
In @app/src/main/java/com/konkuk/medicarecall/data/di/SettingsModule.kt:
- Around line 1-68: SettingsModule.kt uses Koin while the project mixes Koin and
Hilt; align this module with the project's chosen DI strategy. Decide which DI
framework to standardize on, then either (A) convert the Koin modules
(settingsApiModule, settingsRepositoryModule, settingsViewModelModule,
settingsModules) into Hilt @Module/@Provides/@Binds and @HiltViewModel-annotated
ViewModels to match the network/MainActivity Hilt setup, or (B) keep Koin but
add a clear TODO and documentation plus a compatibility bridge so Hilt-provided
singletons (e.g., Retrofit, network bindings) are exposed to Koin consumers;
update module registration and remove mixed-use patterns accordingly.
In
@app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/DataStoreRepositoryImpl.kt:
- Around line 8-20: You have both Hilt and Koin active which causes conflicting
injections (see MainActivity using @AndroidEntryPoint and koinViewModel(),
App.kt calling startKoin, KoinModule.kt providing DataStoreRepository,
RepositoryModule.kt binding DataStoreRepository, and DataStoreRepositoryImpl
annotated with @Inject/@Singleton). Pick one DI framework and make the code
consistent: if you keep Hilt, remove startKoin and KoinModule usages, delete
koinViewModel() calls and Koin bindings, add @HiltAndroidApp to App.kt and keep
RepositoryModule.kt + DataStoreRepositoryImpl as Hilt bindings; if you keep
Koin, remove @AndroidEntryPoint and Hilt modules (RepositoryModule.kt), convert
DataStoreRepositoryImpl to be provided via Koin (remove @Inject/@Singleton), and
ensure MainActivity uses koinViewModel(); also remove duplicate providers so
only one module supplies DataStoreRepository.
In
@app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/FcmRepositoryImpl.kt:
- Around line 23-28: FcmRepositoryImpl currently mixes Hilt annotations
(@Singleton, @Inject, @ApplicationContext) into a Koin-based app; remove these
Hilt annotations from the FcmRepositoryImpl class and instead register and
inject it via your Koin modules, or alternatively convert the whole app to Hilt
by adding @HiltAndroidApp to the Application, replacing
startKoin()/KoinComponent/by inject() usages in App.kt, and providing the
bindings from ApiModule as Hilt modules; choose one approach and ensure
FcmRepositoryImpl is provided/constructed by the same DI framework as the rest
of the app.
In
@app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NaverPayRepositoryImpl.kt:
- Around line 10-12: NaverPayRepositoryImpl is annotated with @Inject for Hilt
but is also bound in the Koin repositoryModule, causing duplicate injection
bindings; remove the NaverPayRepository binding from the Koin repositoryModule
(where the NaverPayRepository is provided/created) so only Hilt-managed
NaverPayRepositoryImpl (and its dependency NaverPayService) remains, and verify
no other Koin bindings reference NaverPayRepository to avoid further conflicts.
In @app/src/main/java/com/konkuk/medicarecall/MainActivity.kt:
- Around line 41-43: MainActivity is annotated with @AndroidEntryPoint but still
calls koinViewModel(), mixing Hilt and Koin; pick one DI framework and make code
consistent: if you choose Hilt, remove koinViewModel() usages in MainActivity
and replace them with hiltViewModel() (and keep @AndroidEntryPoint); if you
choose Koin, remove the @AndroidEntryPoint annotation from MainActivity and
switch any Hilt-specific setup to Koin modules and keep koinViewModel(); update
imports and ViewModel retrieval in MainActivity accordingly so only one DI
system is used.
In @app/src/main/java/com/konkuk/medicarecall/ui/navigation/NavGraph.kt:
- Around line 178-182: HomeViewModel is missing Hilt annotations so
hiltViewModel(parentEntry) cannot provide it; add @HiltViewModel to the
HomeViewModel class declaration and annotate its primary constructor with
@Inject (e.g., @Inject constructor(...)) so Hilt can inject dependencies, and
add the imports dagger.hilt.android.lifecycle.HiltViewModel and
javax.inject.Inject; keep the class name HomeViewModel and ensure any
constructor parameters are provided by Hilt modules or other @Injectable types.
In @gradle/libs.versions.toml:
- Around line 21-23: Update the Hilt dependency versions in libs.versions.toml:
change the hilt entry (hilt) from "2.52" to "2.57.2", change
hiltNavigationCompose from "1.2.0" to "1.3.0", and change hiltManager
(androidx.hilt:hilt-compiler) from "1.0.0" to "1.3.0"; update the three values
where the keys hilt, hiltNavigationCompose, and hiltManager are defined so the
build uses the new stable versions.
🧹 Nitpick comments (6)
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/VerificationRepositoryImpl.kt (1)
11-13:@Singleton스코프 추가를 고려해보세요.
@Inject constructor는 잘 적용되었는데,@Singleton어노테이션이 없네요. 같은 PR의ElderRegisterRepositoryImpl은@Singleton을 사용하고 있어요.Repository는 보통 싱글톤으로 관리하는 게 일반적이라 (상태를 가지지 않는다면), 불필요한 객체 생성을 방지하려면
@Singleton을 추가하는 게 좋을 것 같아요.♻️ 제안하는 수정
+import javax.inject.Singleton + +@Singleton class VerificationRepositoryImpl @Inject constructor( private val authService: AuthService, ) : VerificationRepository {app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SetCallRepositoryImpl.kt (1)
11-13:@Singleton어노테이션 누락.
VerificationRepositoryImpl과 동일하게@Singleton이 없네요. Repository 구현체들 간에 스코프 일관성을 위해 추가하는 걸 추천해요.♻️ 제안하는 수정
+import javax.inject.Singleton + +@Singleton class SetCallRepositoryImpl @Inject constructor( private val service: SetCallService, ) : SetCallRepository {app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt (1)
8-18: Hilt 관련 dead code 정리가 필요합니다.이 모듈은 Koin으로 제대로 작동하고 있는데,
RepositoryModule.kt는 Hilt 설정(플러그인, @HiltAndroidApp 없음)이 없어서 실행되지 않는 dead code예요.Repository 구현체들의 unused @Inject 생성자와 이 Hilt 모듈을 제거하고 Koin 등록(KoinModule.kt의 repositoryModule)만 유지하면 깔끔해질 것 같습니다. HomeModule의 의존성 해결은 현재 잘 작동하고 있습니다.
app/src/main/java/com/konkuk/medicarecall/App.kt (1)
41-47: 모듈 목록 구성을 간결하게 개선할 수 있습니다.여러 모듈을
+연산자로 연결하는 방식도 동작하지만, 가독성을 위해 리스트로 평탄화하는 것을 고려해볼 수 있습니다.♻️ 선택적 개선 제안
modules( - settingsModules + - calendarModule + - homeModule + - homeDetailModule + - statisticsModule + - appModules + - defaultModule, + settingsModules + + listOf( + calendarModule, + homeModule, + homeDetailModule, + statisticsModule, + defaultModule, + ) + + appModules, )또는 완전히 평탄화:
modules( - settingsModules + - calendarModule + - homeModule + - homeDetailModule + - statisticsModule + - appModules + - defaultModule, + listOf( + settingsModules, + calendarModule, + homeModule, + homeDetailModule, + statisticsModule, + appModules, + defaultModule, + ).flatten(), )app/src/main/java/com/konkuk/medicarecall/data/di/NetworkModule.kt (1)
69-74: Json 설정 중복 제거를 추천합니다
provideAuthRetrofit과provideRetrofit에서 동일한 Json 설정이 반복되고 있습니다. 별도의provideJson()메서드로 추출하면 유지보수가 더 편해집니다.♻️ 제안하는 리팩토링
+ @Provides + @Singleton + fun provideJson(): Json { + return Json { + encodeDefaults = true + ignoreUnknownKeys = true + prettyPrint = true + isLenient = true + } + } + @Provides @Singleton @Named("AuthRetrofit") - fun provideAuthRetrofit(loggingInterceptor: HttpLoggingInterceptor): Retrofit { - val json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - prettyPrint = true - isLenient = true - } + fun provideAuthRetrofit( + loggingInterceptor: HttpLoggingInterceptor, + json: Json + ): Retrofit { val authOkHttpClient = OkHttpClient.Builder() .readTimeout(20, TimeUnit.SECONDS) .addInterceptor(loggingInterceptor) .build() return Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) .client(authOkHttpClient) .build() } @Provides @Singleton - fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit { - val json = Json { - encodeDefaults = true - ignoreUnknownKeys = true - prettyPrint = true - isLenient = true - } + fun provideRetrofit(okHttpClient: OkHttpClient, json: Json): Retrofit { return Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) .client(okHttpClient) .build() }Also applies to: 89-94
app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt (1)
3-46: 임포트 구성을 그룹화하면 가독성이 좋아질 것 같아요.인터페이스와 구현체가 섞여 있는데(특히 30-46번 줄), 인터페이스를 먼저 그룹화하고 그 다음 구현체를 그룹화하면 더 깔끔해 보일 것 같습니다. 하지만 기능에는 문제 없으니 선택 사항입니다.
♻️ 임포트 정리 제안
package com.konkuk.medicarecall.data.di +// Repository interfaces import com.konkuk.medicarecall.data.repository.DataStoreRepository import com.konkuk.medicarecall.data.repository.ElderIdRepository import com.konkuk.medicarecall.data.repository.ElderRegisterRepository import com.konkuk.medicarecall.data.repository.EldersHealthInfoRepository import com.konkuk.medicarecall.data.repository.EldersInfoRepository import com.konkuk.medicarecall.data.repository.FcmRepository +import com.konkuk.medicarecall.data.repository.GlucoseRepository +import com.konkuk.medicarecall.data.repository.HealthRepository +import com.konkuk.medicarecall.data.repository.HomeRepository +import com.konkuk.medicarecall.data.repository.MealRepository import com.konkuk.medicarecall.data.repository.MemberRegisterRepository +import com.konkuk.medicarecall.data.repository.MedicineRepository +import com.konkuk.medicarecall.data.repository.MentalRepository import com.konkuk.medicarecall.data.repository.NaverPayRepository import com.konkuk.medicarecall.data.repository.NoticeRepository import com.konkuk.medicarecall.data.repository.SetCallRepository +import com.konkuk.medicarecall.data.repository.SleepRepository +import com.konkuk.medicarecall.data.repository.StatisticsRepository import com.konkuk.medicarecall.data.repository.SubscribeRepository import com.konkuk.medicarecall.data.repository.UpdateElderInfoRepository import com.konkuk.medicarecall.data.repository.UserRepository import com.konkuk.medicarecall.data.repository.VerificationRepository + +// Repository implementations import com.konkuk.medicarecall.data.repositoryimpl.DataStoreRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.ElderIdRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.ElderRegisterRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.EldersHealthInfoRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.EldersInfoRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.FcmRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.GlucoseRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.HealthRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.HomeRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.MealRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.MemberRegisterRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.MedicineRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.MentalRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.NaverPayRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.NoticeRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.SetCallRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.SleepRepositoryImpl +import com.konkuk.medicarecall.data.repositoryimpl.StatisticsRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.SubscribeRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.UpdateElderInfoRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.UserRepositoryImpl import com.konkuk.medicarecall.data.repositoryimpl.VerificationRepositoryImpl -import com.konkuk.medicarecall.data.repository.HomeRepository -import com.konkuk.medicarecall.data.repositoryimpl.HomeRepositoryImpl -import com.konkuk.medicarecall.data.repository.GlucoseRepository -import com.konkuk.medicarecall.data.repositoryimpl.GlucoseRepositoryImpl -import com.konkuk.medicarecall.data.repository.MealRepository -import com.konkuk.medicarecall.data.repositoryimpl.MealRepositoryImpl -import com.konkuk.medicarecall.data.repository.MedicineRepository -import com.konkuk.medicarecall.data.repositoryimpl.MedicineRepositoryImpl -import com.konkuk.medicarecall.data.repository.SleepRepository -import com.konkuk.medicarecall.data.repositoryimpl.SleepRepositoryImpl -import com.konkuk.medicarecall.data.repository.HealthRepository -import com.konkuk.medicarecall.data.repositoryimpl.HealthRepositoryImpl -import com.konkuk.medicarecall.data.repository.MentalRepository -import com.konkuk.medicarecall.data.repositoryimpl.MentalRepositoryImpl -import com.konkuk.medicarecall.data.repository.StatisticsRepository -import com.konkuk.medicarecall.data.repositoryimpl.FcmRepositoryImpl -import com.konkuk.medicarecall.data.repositoryimpl.StatisticsRepositoryImpl + import dagger.Binds import dagger.Module import dagger.hilt.InstallIn
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (54)
app/build.gradle.ktsapp/src/main/java/com/konkuk/medicarecall/App.ktapp/src/main/java/com/konkuk/medicarecall/MainActivity.ktapp/src/main/java/com/konkuk/medicarecall/data/api/fcm/FcmService.ktapp/src/main/java/com/konkuk/medicarecall/data/di/ApiModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/NetworkModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/SettingsModule.ktapp/src/main/java/com/konkuk/medicarecall/data/di/StatisticsModule.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/DataStoreRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderIdRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderRegisterRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/EldersHealthInfoRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/EldersInfoRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/FcmRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/GlucoseRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HealthRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HomeRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MealRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MedicineRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MemberRegisterRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MentalRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NaverPayRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NoticeRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SetCallRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SleepRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/StatisticsRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SubscribeRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/UpdateElderInfoRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/UserRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/VerificationRepositoryImpl.ktapp/src/main/java/com/konkuk/medicarecall/ui/common/extension/NavBackStackEntryExt.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/calendar/viewmodel/CalendarViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/meal/viewmodel/MealViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/medicine/viewmodel/MedicineViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/DetailElderInfoViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/DetailHealthViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/DetailMyDataViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/EldersHealthViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/MyDataViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/NoticeViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/SubscribeViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/feature/statistics/viewmodel/StatisticsViewModel.ktapp/src/main/java/com/konkuk/medicarecall/ui/navigation/NavGraph.ktgradle/libs.versions.toml
💤 Files with no reviewable changes (30)
- app/src/main/java/com/konkuk/medicarecall/ui/feature/statistics/viewmodel/StatisticsViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/calendar/viewmodel/CalendarViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/SubscribeViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MealRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MentalRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/DetailMyDataViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/medicine/viewmodel/MedicineViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/DetailElderInfoViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/EldersHealthViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/UpdateElderInfoRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HomeRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/DetailHealthViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/NoticeViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/GlucoseRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/meal/viewmodel/MealViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/MyDataViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HealthRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/EldersInfoRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MedicineRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NoticeRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderIdRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SleepRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/EldersHealthInfoRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SubscribeRepositoryImpl.kt
- app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.kt
- app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/StatisticsRepositoryImpl.kt
⏰ 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). (1)
- GitHub Check: ci-build
🔇 Additional comments (10)
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MemberRegisterRepositoryImpl.kt (2)
9-9: Hilt 마이그레이션을 위한 올바른 import입니다.
javax.inject.Injectimport가 정확하게 추가되었습니다.
11-13: 생성자 주입 패턴이 제대로 적용되었고, MemberRegisterService도 문제없이 제공 중입니다.ApiModule.kt의
provideMemberRegisterService()메서드(lines 51-55)에서 Hilt를 통해 잘 제공되고 있습니다. 마이그레이션 완료! 🎉app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/FcmRepositoryImpl.kt (1)
12-12: Hilt import 추가 확인Hilt 마이그레이션에 필요한 import들이 정확하게 추가되었습니다.
@ApplicationContextqualifier와 JSR-330 표준 어노테이션들이 적절하게 포함되어 있네요.Also applies to: 15-16
app/src/main/java/com/konkuk/medicarecall/data/api/fcm/FcmService.kt (1)
22-22: LGTM! Hilt 설정이 올바릅니다.
FirebaseMessagingService에@AndroidEntryPoint를 적용하는 패턴이 정확해요. 이미 선언된@Inject필드들과 잘 맞물려서 동작할 거예요.Also applies to: 32-32
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderRegisterRepositoryImpl.kt (1)
23-25: LGTM! 올바른 Hilt DI 패턴이에요.
@Singleton과@Inject constructor를 함께 사용한 정확한 패턴이네요. 다른 Repository 구현체들도 이 패턴을 따르면 일관성이 좋을 것 같아요.app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/UserRepositoryImpl.kt (1)
12-16: Hilt 의존성 제공 구조는 올바르게 설정됨
@Injectconstructor를 사용한 UserRepositoryImpl의 세 가지 의존성(SettingService, AuthService, DataStoreRepository)은 모두 Hilt 모듈에서 제대로 제공되고 있습니다:
- SettingService → ApiModule의
@Provides provideSettingService()- AuthService → ApiModule의
@Provides provideAuthService()- DataStoreRepository → RepositoryModule의
@Binds bindDataStoreRepository()다만 코드베이스에 KoinModule.kt도 존재하여 Hilt와 Koin 프레임워크가 혼재되어 있습니다. 현재 UserRepositoryImpl 인스턴스화는 문제없지만, 장기적으로는 KoinModule.kt를 제거하고 DI 프레임워크를 통일하는 리팩토링을 고려해보세요.
app/src/main/java/com/konkuk/medicarecall/data/di/StatisticsModule.kt (1)
11-20: Koin과 Hilt 혼합으로 인한 DI 아키텍처 일관성 문제이 모듈은 프로젝트의 다른 부분이 Hilt로 전환되는 동안에도 계속 Koin을 사용하고 있습니다. 특히 StatisticsService는 ApiModule.kt (Hilt)와 StatisticsModule.kt (Koin)에서 중복 제공되고 있습니다.
실제 문제점:
- Retrofit은 NetworkModule에서 Hilt로 제공되지만, StatisticsModule에서
get<Retrofit>()로 Koin에 요청함 - Retrofit이 Koin 컨테이너에 등록되지 않았다면 런타임 실패 가능- StatisticsService가 두 프레임워크에서 모두 제공되어 충돌 가능성
- StatisticsScreen에서는
koinViewModel()을 사용하는데, 전체 앱이 Hilt로 이동 중이면 불일치 발생통계 기능이 현재 작동할 수 있지만, 프로젝트 전환 진행에 따라 언제든 깨질 수 있습니다.
app/src/main/java/com/konkuk/medicarecall/data/di/ApiModule.kt (2)
23-33: 모듈 구조가 깔끔하게 설정되었습니다.Dagger/Hilt로의 전환이 올바르게 적용되었습니다.
object로 선언하고SingletonComponent에 설치한 것이 적절합니다.
35-38: 두 Retrofit 인스턴스 모두 정상 제공됩니다.NetworkModule에서 다음 두 가지가 모두 제공되고 있습니다:
@Named("AuthRetrofit"): AuthRetrofit 인스턴스 (줄 67-84, 별도의 OkHttpClient 사용)- 일반 Retrofit: 인증 인터셉터와 인증자가 포함된 Retrofit 인스턴스 (줄 88-100)
이 설계는 의도된 것으로, RefreshService가 토큰 갱신 시 무한 루프를 피하기 위해 별도의 Retrofit이 필요합니다.
app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt (1)
53-55: 모듈 선언이 올바릅니다.
abstract class와@InstallIn(SingletonComponent::class)조합이@Binds를 사용하는 Hilt 모듈에 적합합니다.
| @@ -1,3 +1,4 @@ | |||
| import java.lang.module.ModuleFinder.compose | |||
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.
잘못된 import 구문입니다.
java.lang.module.ModuleFinder.compose는 유효하지 않은 import입니다. ModuleFinder는 Java 9의 모듈 시스템 API이며, compose라는 정적 멤버가 없습니다.
이 줄을 제거해야 합니다. 만약 Compose 관련 설정이 필요하다면, Gradle Kotlin DSL에서는 별도의 import 없이 플러그인 블록에서 처리됩니다.
🔧 수정 제안
-import java.lang.module.ModuleFinder.compose
import java.util.Properties📝 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 java.lang.module.ModuleFinder.compose | |
| import java.util.Properties |
🤖 Prompt for AI Agents
In @app/build.gradle.kts at line 1, 현재 파일의 잘못된 import 문 'import
java.lang.module.ModuleFinder.compose'를 제거하세요; ModuleFinder에 compose라는 정적 멤버가
없으므로 이 import는 무효입니다. 만약 Gradle Kotlin DSL에서 Compose 설정이 필요하다면 import 대신
build.gradle.kts의 plugins 또는 android 블록(예: compose 옵션/플러그인 선언)으로 처리하도록 구성하고, 파일
내 해당 잘못된 import 라인(import java.lang.module.ModuleFinder.compose)을 삭제하세요.
| package com.konkuk.medicarecall.data.di | ||
|
|
||
| import com.konkuk.medicarecall.ui.feature.calendar.viewmodel.CalendarViewModel | ||
| import org.koin.androidx.viewmodel.dsl.viewModel | ||
| import org.koin.dsl.module | ||
|
|
||
| val calendarModule = module { | ||
|
|
||
| viewModel { | ||
| CalendarViewModel() | ||
| } | ||
| } |
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.
🧩 Analysis chain
🏁 Script executed:
# Find CalendarViewModel definition and check its constructor
fd -t f "CalendarViewModel" --exec cat -n {} \;Repository: Medicare-Call/Medicare-Call-Android
Length of output: 1260
🏁 Script executed:
# Search for CalendarViewModel class definition
ast-grep --pattern 'class CalendarViewModel($_) {
$$$
}'Repository: Medicare-Call/Medicare-Call-Android
Length of output: 61
🏁 Script executed:
# Check for Hilt usage in the project
rg "@AndroidEntryPoint|@HiltAndroidApp|@Inject" --type kotlin -A 2 -B 2Repository: Medicare-Call/Medicare-Call-Android
Length of output: 7496
🏁 Script executed:
# Verify Koin module usage patterns
rg "koin|module\s*{" --type kotlin -lRepository: Medicare-Call/Medicare-Call-Android
Length of output: 172
프로젝트에서 Koin과 Hilt를 섞어 쓰고 있습니다.
현재 프로젝트는 대부분 Hilt를 사용 중입니다 (MainActivity, FcmService, 여러 Repository 구현체들). CalendarModule은 Koin으로 따로 관리되고 있네요.
한 가지 좋은 소식은 CalendarViewModel이 의존성이 없다는 점입니다. 생성자에 파라미터가 없고, 내부 상태만 관리하고 있거든요. 때문에 굳이 Koin으로 관리할 필요가 없습니다.
권장사항: DI 프레임워크를 Hilt로 통일하고, CalendarViewModel도 Hilt 방식으로 변경하세요. 프로젝트 전체가 일관성 있게 유지되고, 유지보수도 훨씬 수월해질 거예요.
🤖 Prompt for AI Agents
In @app/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.kt around
lines 1 - 12, CalendarModule is registering CalendarViewModel with Koin while
the project uses Hilt; since CalendarViewModel has no dependencies, remove the
Koin module and convert the view model to Hilt: annotate CalendarViewModel with
@HiltViewModel and add an @Inject no-arg constructor, delete or stop providing
calendarModule, and update any consumers (Activities/Fragments) to obtain the
view model via Hilt (use @AndroidEntryPoint on the host and use the Hilt-backed
ViewModel retrieval like by viewModels() or hiltViewModel()).
| val homeDetailModule = module { | ||
|
|
||
| viewModel { | ||
| GlucoseViewModel( | ||
| get(), | ||
| ) | ||
| } | ||
|
|
||
| viewModel { | ||
| MealViewModel( | ||
| get(), | ||
| ) | ||
| } | ||
|
|
||
| viewModel { | ||
| MedicineViewModel( | ||
| get(), | ||
| ) | ||
| } | ||
|
|
||
| viewModel { | ||
| SleepViewModel( | ||
| get(), | ||
| ) | ||
| } | ||
|
|
||
| viewModel { | ||
| HealthViewModel( | ||
| get(), | ||
| ) | ||
| } | ||
|
|
||
| viewModel { | ||
| MentalViewModel( | ||
| get(), | ||
| ) | ||
| } | ||
| } |
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.
🧩 Analysis chain
🏁 Script executed:
# Verify Koin and Hilt usage patterns
echo "=== Koin module declarations ==="
rg -n "= module \{" --type=kt
echo -e "\n=== Koin viewModel imports ==="
rg -n "import org.koin" --type=kt | head -20
echo -e "\n=== Hilt ViewModel usage ==="
rg -n "hiltViewModel|@HiltViewModel" --type=kt
echo -e "\n=== Hilt @Inject imports ==="
rg -n "import javax.inject.Inject|import dagger.hilt" --type=kt | head -20
echo -e "\n=== Application class ==="
fd -e kt | xargs rg -l "class.*Application" --type=ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 384
🏁 Script executed:
# Check the specific file mentioned in the review
echo "=== Checking HomeDetailModule.kt content ==="
find . -name "HomeDetailModule.kt" -type f
echo -e "\n=== Checking NavBackStackEntryExt.kt ==="
find . -name "NavBackStackEntryExt.kt" -type fRepository: Medicare-Call/Medicare-Call-Android
Length of output: 325
🏁 Script executed:
# Search for Koin and Hilt without type restrictions
echo "=== Koin module declarations ==="
rg "= module \{" -g "*.kt" | head -20
echo -e "\n=== Koin viewModel imports ==="
rg "import org.koin" -g "*.kt" | head -20
echo -e "\n=== Hilt ViewModel usage ==="
rg "hiltViewModel|@HiltViewModel" -g "*.kt" | head -20
echo -e "\n=== Hilt imports ==="
rg "import.*hilt|import javax.inject" -g "*.kt" | head -30Repository: Medicare-Call/Medicare-Call-Android
Length of output: 7764
🏁 Script executed:
# Read the specific files mentioned
echo "=== HomeDetailModule.kt content ==="
cat -n ./app/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.kt
echo -e "\n=== NavBackStackEntryExt.kt content ==="
cat -n ./app/src/main/java/com/konkuk/medicarecall/ui/common/extension/NavBackStackEntryExt.ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 2905
🏁 Script executed:
# Search for Application class
echo "=== Application class files ==="
rg "class.*Application" -g "*.kt" -A 15 | head -50Repository: Medicare-Call/Medicare-Call-Android
Length of output: 3439
🏁 Script executed:
# Check if repositories are registered in Koin
echo "=== Repository registration in Koin modules ==="
rg "repositoryModule|Repository\(" -g "*.kt" --context=3 | grep -E "(\.kt:|module|Repository)"
echo -e "\n=== Check RepositoryModule.kt (Hilt) ==="
cat -n ./app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt
echo -e "\n=== Check if repositories are in Koin modules ==="
rg "bind<.*Repository>|single.*Repository" -g "*.kt"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 19935
🏁 Script executed:
# Check all DI modules to see full registration
echo "=== List all DI modules ==="
fd -n -e kt . app/src/main/java/com/konkuk/medicarecall/data/di/
echo -e "\n=== KoinModule.kt content (network/api setup) ==="
wc -l ./app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.kt
head -50 ./app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 3127
🏁 Script executed:
# Check what modules are loaded in App.kt
echo "=== Full App.kt onCreate ==="
sed -n '15,40p' ./app/src/main/java/com/konkuk/medicarecall/App.ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 1061
🏁 Script executed:
# Check the constructors of the ViewModels in HomeDetailModule
echo "=== GlucoseViewModel constructor ==="
rg -A 5 "class GlucoseViewModel" -g "*.kt" | head -10
echo -e "\n=== MealViewModel constructor ==="
rg -A 5 "class MealViewModel" -g "*.kt" | head -10
echo -e "\n=== Check if these repositories are registered in Koin ==="
rg "GlucoseRepository|MealRepository|MedicineRepository|SleepRepository|HealthRepository|MentalRepository" -g "*.kt" | grep -E "(single|bind|module)"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 2767
🏁 Script executed:
# Check if Hilt is active and initialized
echo "=== Hilt @HiltViewModel annotations ==="
rg "@HiltViewModel" -g "*.kt" -B 2 -A 2
echo -e "\n=== Check for Hilt initialization in AndroidManifest ==="
grep -r "@HiltViewModel\|HiltViewModel\|dagger.hilt" . --include="*.xml" 2>/dev/null || echo "No manifest entries found"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 202
🏁 Script executed:
# Final verification - check if homeDetailModule is actually loaded in App
echo "=== Check App.kt for module loading ==="
cat ./app/src/main/java/com/konkuk/medicarecall/App.kt | grep -A 20 "modules("
echo -e "\n=== Check where homeDetailModule is defined/imported ==="
rg "homeDetailModule" -g "*.kt"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 1147
Koin과 Hilt 혼재로 인한 런타임 크래시 위험
HomeDetailModule의 ViewModelㅈ들이 Koin으로 등록되어 있는데, 이들이 의존하는 저장소들(GlucoseRepository, MealRepository, MedicineRepository, SleepRepository, HealthRepository, MentalRepository)은 RepositoryModule.kt의 Hilt에만 등록되어 있습니다.
문제:
- Koin의
get()으로 Hilt 등록 저장소를 찾을 수 없어 앱 실행 시 크래시 - NavBackStackEntryExt.kt의
hiltViewModel()로 조회하는 ViewModel은 Koin에만 등록되어 있어 Hilt가 찾을 수 없음 - 두 DI 프레임워크가 서로 다른 영역을 관리하면서 의존성 해결 불가
프로젝트 전체를 하나의 DI 프레임워크(Koin 또는 Hilt)로 통일하세요.
| package com.konkuk.medicarecall.data.di | ||
|
|
||
| import com.konkuk.medicarecall.BuildConfig | ||
| import com.konkuk.medicarecall.data.api.auth.AuthService | ||
| import com.konkuk.medicarecall.data.api.auth.RefreshService | ||
| import com.konkuk.medicarecall.data.api.elders.ElderRegisterService | ||
| import com.konkuk.medicarecall.data.api.elders.EldersInfoService | ||
| import com.konkuk.medicarecall.data.api.elders.SetCallService | ||
| import com.konkuk.medicarecall.data.api.fcm.FcmUpdateService | ||
| import com.konkuk.medicarecall.data.api.fcm.FcmValidationService | ||
| import com.konkuk.medicarecall.data.api.member.MemberRegisterService | ||
| import com.konkuk.medicarecall.data.api.payments.NaverPayService | ||
| import com.konkuk.medicarecall.data.network.AuthAuthenticator | ||
| import com.konkuk.medicarecall.data.network.AuthInterceptor | ||
| import com.konkuk.medicarecall.data.repository.DataStoreRepository | ||
| import com.konkuk.medicarecall.data.repository.ElderIdRepository | ||
| import com.konkuk.medicarecall.data.repository.ElderRegisterRepository | ||
| import com.konkuk.medicarecall.data.repository.EldersInfoRepository | ||
| import com.konkuk.medicarecall.data.repository.FcmRepository | ||
| import com.konkuk.medicarecall.data.repository.MemberRegisterRepository | ||
| import com.konkuk.medicarecall.data.repository.NaverPayRepository | ||
| import com.konkuk.medicarecall.data.repository.SetCallRepository | ||
| import com.konkuk.medicarecall.data.repository.VerificationRepository | ||
| import com.konkuk.medicarecall.data.repositoryimpl.DataStoreRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.ElderIdRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.ElderRegisterRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.EldersInfoRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.FcmRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.MemberRegisterRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.NaverPayRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.SetCallRepositoryImpl | ||
| import com.konkuk.medicarecall.data.repositoryimpl.VerificationRepositoryImpl | ||
| import kotlinx.serialization.json.Json | ||
| import okhttp3.MediaType.Companion.toMediaType | ||
| import okhttp3.OkHttpClient | ||
| import okhttp3.logging.HttpLoggingInterceptor | ||
| import org.koin.android.ext.koin.androidContext | ||
| import org.koin.core.qualifier.named | ||
| import org.koin.dsl.module | ||
| import retrofit2.Retrofit | ||
| import retrofit2.converter.kotlinx.serialization.asConverterFactory | ||
| import java.util.concurrent.TimeUnit | ||
|
|
||
| val networkModule = module { | ||
| single { | ||
| Json { | ||
| encodeDefaults = true | ||
| ignoreUnknownKeys = true | ||
| prettyPrint = true | ||
| isLenient = true | ||
| } | ||
| } | ||
|
|
||
| single { | ||
| HttpLoggingInterceptor().apply { | ||
| level = HttpLoggingInterceptor.Level.BODY | ||
| } | ||
| } | ||
|
|
||
| single { AuthInterceptor(get()) } | ||
|
|
||
| single { AuthAuthenticator(get(), get()) } | ||
|
|
||
| single(named("AuthOkHttpClient")) { | ||
| OkHttpClient.Builder() | ||
| .readTimeout(20, TimeUnit.SECONDS) | ||
| .addInterceptor(get<HttpLoggingInterceptor>()) | ||
| .build() | ||
| } | ||
|
|
||
| single { | ||
| OkHttpClient.Builder() | ||
| .readTimeout(20, TimeUnit.SECONDS) | ||
| .addInterceptor(get<AuthInterceptor>()) | ||
| .addInterceptor(get<HttpLoggingInterceptor>()) | ||
| .authenticator(get<AuthAuthenticator>()) | ||
| .build() | ||
| } | ||
|
|
||
| single(named("AuthRetrofit")) { | ||
| Retrofit.Builder() | ||
| .baseUrl(BuildConfig.BASE_URL) | ||
| .addConverterFactory(get<Json>().asConverterFactory("application/json".toMediaType())) | ||
| .client(get(named("AuthOkHttpClient"))) | ||
| .build() | ||
| } | ||
|
|
||
| single { | ||
| Retrofit.Builder() | ||
| .baseUrl(BuildConfig.BASE_URL) | ||
| .addConverterFactory(get<Json>().asConverterFactory("application/json".toMediaType())) | ||
| .client(get()) | ||
| .build() | ||
| } | ||
| } | ||
|
|
||
| val apiModule = module { | ||
| single { get<Retrofit>(named("AuthRetrofit")).create(RefreshService::class.java) } | ||
| single { get<Retrofit>().create(AuthService::class.java) } | ||
| single { get<Retrofit>().create(EldersInfoService::class.java) } | ||
| single { get<Retrofit>().create(MemberRegisterService::class.java) } | ||
| single { get<Retrofit>().create(ElderRegisterService::class.java) } | ||
| single { get<Retrofit>().create(SetCallService::class.java) } | ||
| single { get<Retrofit>().create(NaverPayService::class.java) } | ||
| single { get<Retrofit>().create(FcmValidationService::class.java) } | ||
| single { get<Retrofit>().create(FcmUpdateService::class.java) } | ||
| } | ||
|
|
||
| val repositoryModule = module { | ||
| single<DataStoreRepository> { DataStoreRepositoryImpl(androidContext()) } | ||
| single<VerificationRepository> { VerificationRepositoryImpl(get()) } | ||
| single<MemberRegisterRepository> { MemberRegisterRepositoryImpl(get()) } | ||
| single<EldersInfoRepository> { EldersInfoRepositoryImpl(get()) } | ||
| single<ElderRegisterRepository> { ElderRegisterRepositoryImpl(get()) } | ||
| single<ElderIdRepository> { ElderIdRepositoryImpl() } | ||
| single<SetCallRepository> { SetCallRepositoryImpl(get()) } | ||
| single<NaverPayRepository> { NaverPayRepositoryImpl(get()) } | ||
| single<FcmRepository> { FcmRepositoryImpl(androidContext(), get(), get()) } | ||
| } | ||
|
|
||
| val appModules = listOf(networkModule, apiModule, repositoryModule) |
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.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Application 클래스 찾기
echo "=== Application 클래스 검색 ==="
fd -type f -name "*.kt" | xargs rg -l 'class.*:.*Application'
# 다양한 이름으로 검색
echo -e "\n=== App, Application 파일 확인 ==="
fd -type f \( -name "App.kt" -o -name "*Application.kt" \)
# 전체 프로젝트 구조 파악
echo -e "\n=== 전체 모듈 파일 목록 ==="
fd -type f -name "*Module.kt" | head -20Repository: Medicare-Call/Medicare-Call-Android
Length of output: 737
🏁 Script executed:
#!/bin/bash
# DI 초기화 확인
echo "=== Koin startKoin 호출 찾기 ==="
rg -nP 'startKoin' --type=kt -A5 -B2
echo -e "\n=== Hilt @HiltAndroidApp 검색 ==="
rg -nP '@HiltAndroidApp' --type=kt -A3 -B2
echo -e "\n=== NetworkModule.kt 내용 확인 ==="
fd -type f -name "NetworkModule.kt" -exec cat {} \;Repository: Medicare-Call/Medicare-Call-Android
Length of output: 414
🏁 Script executed:
#!/bin/bash
# KoinModule.kt의 networkModule과 다른 모듈 비교
echo "=== KoinModule.kt 검색 ==="
fd -type f -name "KoinModule.kt" -exec wc -l {} \;
echo -e "\n=== Hilt DI 관련 어노테이션 전체 검색 ==="
rg -nP '@(Module|Provides|Singleton|Binds|InstallIn)' --type=kt | head -30
echo -e "\n=== Koin 관련 설정 전체 검색 ==="
rg -nP '(single|factory|viewModel|module)\s*\{' --type=kt | wc -lRepository: Medicare-Call/Medicare-Call-Android
Length of output: 405
🏁 Script executed:
#!/bin/bash
# App.kt 직접 읽기
echo "=== App.kt 내용 ==="
cat app/src/main/java/com/konkuk/medicarecall/App.kt
echo -e "\n=== DI Module 파일들 검색 ==="
find . -name "*Module.kt" -type f 2>/dev/null
echo -e "\n=== NetworkModule.kt 찾기 ==="
find . -name "NetworkModule.kt" -type f 2>/dev/nullRepository: Medicare-Call/Medicare-Call-Android
Length of output: 4931
🏁 Script executed:
#!/bin/bash
# DI 초기화 패턴 검색 (구문 수정)
echo "=== startKoin 검색 ==="
rg 'startKoin' -A 5 2>/dev/null || echo "No startKoin found"
echo -e "\n=== @HiltAndroidApp 검색 ==="
rg '@HiltAndroidApp' -A 3 2>/dev/null || echo "No @HiltAndroidApp found"
echo -e "\n=== koin 모듈 정의 검색 ==="
rg 'val.*Module.*=.*module' 2>/dev/null || echo "No Koin modules found"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 2114
🏁 Script executed:
#!/bin/bash
# 구체적으로 파일 내용 비교
echo "=== NetworkModule.kt 존재 여부 ==="
ls -la app/src/main/java/com/konkuk/medicarecall/data/di/ 2>/dev/null | grep -E "(Network|Koin)"
echo -e "\n=== KoinModule.kt 위치 ==="
find . -name "KoinModule.kt" -type f 2>/dev/null
echo -e "\n=== 모든 Module.kt 파일 ==="
find . -path "*/di/*" -name "*.kt" -type f 2>/dev/nullRepository: Medicare-Call/Medicare-Call-Android
Length of output: 979
🏁 Script executed:
#!/bin/bash
# NetworkModule.kt 내용 확인
echo "=== NetworkModule.kt 내용 ==="
cat app/src/main/java/com/konkuk/medicarecall/data/di/NetworkModule.kt
echo -e "\n=== ApiModule.kt와 RepositoryModule.kt 내용 확인 ==="
cat app/src/main/java/com/konkuk/medicarecall/data/di/ApiModule.kt
echo -e "\n=== RepositoryModule.kt ==="
cat app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 14638
🏁 Script executed:
#!/bin/bash
# App.kt의 모듈 초기화 확인
echo "=== App.kt에서 로드되는 모듈들 ==="
grep -n "modules(" app/src/main/java/com/konkuk/medicarecall/App.kt -A 10
echo -e "\n=== 각 모듈 파일의 내보내기 확인 ==="
grep -n "^val.*Module" app/src/main/java/com/konkuk/medicarecall/data/di/*.kt | grep -E "(appModules|settingsModules)"
echo -e "\n=== KoinModule.kt의 appModules 정의 ==="
grep -n "appModules" app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.kt -A 2Repository: Medicare-Call/Medicare-Call-Android
Length of output: 841
🏁 Script executed:
#!/bin/bash
# 최종 확인: Hilt 모듈들이 정말 사용되지 않는지 확인
echo "=== NetworkModule.kt, ApiModule.kt, RepositoryModule.kt 참조 검색 ==="
rg 'NetworkModule|ApiModule|RepositoryModule' --no-filename | grep -v '@Module\|@Provides\|@Binds\|@InstallIn\|import' || echo "No active references to Hilt modules"
echo -e "\n=== KoinModule.kt이 실제로 로드되는지 확인 ==="
rg 'appModules' -A 2 app/src/main/java/com/konkuk/medicarecall/App.kt
echo -e "\n=== 결론: 어떤 프레임워크가 실제 사용 중인가? ==="
echo "App.kt uses: Koin (via appModules from KoinModule.kt)"
echo "Hilt modules: NetworkModule.kt, ApiModule.kt, RepositoryModule.kt are NOT LOADED (dead code)"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 810
사용되지 않는 Hilt 모듈 제거
App.kt는 Koin만 초기화하고 있으며, appModules(KoinModule.kt에서 정의)을 통해 네트워크, API, 저장소 의존성을 모두 Koin으로 관리합니다. 그런데 NetworkModule.kt, ApiModule.kt, RepositoryModule.kt 같은 Hilt 기반 모듈들이 코드베이스에 남아있지만 실제로는 어디서도 로드되지 않습니다. 불필요한 죽은 코드이므로 제거하세요.
🤖 Prompt for AI Agents
In @app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.kt around lines
1 - 121, Remove the unused Hilt module classes (e.g., NetworkModule, ApiModule,
RepositoryModule) that are dead code and not referenced by App.kt/Koin; locate
files named NetworkModule.kt, ApiModule.kt, RepositoryModule.kt (and any Hilt
module classes inside them), delete those files or their Hilt module class
definitions, and then update imports/usages across the project (search for
references to NetworkModule, ApiModule, RepositoryModule or @Module/@InstallIn
annotations) to ensure nothing imports the removed symbols; leave the existing
Koin modules (networkModule, apiModule, repositoryModule, appModules) intact and
run a build to fix any remaining unresolved references.
| @Binds | ||
| @Singleton | ||
| abstract fun bindDataStoreRepository(dataStoreRepositoryImpl: DataStoreRepositoryImpl): DataStoreRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindEldersInfoRepository(eldersInfoRepositoryImpl: EldersInfoRepositoryImpl): EldersInfoRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindVerificationRepository(verificationRepositoryImpl: VerificationRepositoryImpl): VerificationRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindMemberRegisterRepository(memberRegisterRepositoryImpl: MemberRegisterRepositoryImpl): MemberRegisterRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindNoticeRepository(noticeRepositoryImpl: NoticeRepositoryImpl): NoticeRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindSetCallRepository(setCallRepositoryImpl: SetCallRepositoryImpl): SetCallRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindSubscribeRepository(subscribeRepositoryImpl: SubscribeRepositoryImpl): SubscribeRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindEldersHealthInfoRepository(eldersHealthInfoRepositoryImpl: EldersHealthInfoRepositoryImpl): EldersHealthInfoRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindUserRepository(userRepositoryImpl: UserRepositoryImpl): UserRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindUpdateElderInfoRepository(updateElderInfoRepositoryImpl: UpdateElderInfoRepositoryImpl): UpdateElderInfoRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindNaverPayRepository(naverPayRepositoryImpl: NaverPayRepositoryImpl): NaverPayRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindElderRegisterRepository(elderRegisterRepositoryImpl: ElderRegisterRepositoryImpl): ElderRegisterRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindElderIdRepository(elderIdRepositoryImpl: ElderIdRepositoryImpl): ElderIdRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindHomeRepository(homeRepositoryImpl: HomeRepositoryImpl): HomeRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindGlucoseRepository(glucoseRepositoryImpl: GlucoseRepositoryImpl): GlucoseRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindMealRepository(mealRepositoryImpl: MealRepositoryImpl): MealRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindMedicineRepository(medicineRepositoryImpl: MedicineRepositoryImpl): MedicineRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindSleepRepository(sleepRepositoryImpl: SleepRepositoryImpl): SleepRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindHealthRepository(healthRepositoryImpl: HealthRepositoryImpl): HealthRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindMentalRepository(mentalRepositoryImpl: MentalRepositoryImpl): MentalRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindStatisticsRepository(statisticsRepositoryImpl: StatisticsRepositoryImpl): StatisticsRepository | ||
|
|
||
| @Binds | ||
| @Singleton | ||
| abstract fun bindFcmRepository(fcmRepositoryImpl: FcmRepositoryImpl): FcmRepository | ||
| } |
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.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Find all RepositoryImpl classes and check for @Inject constructor
echo "=== Checking @Inject constructors in RepositoryImpl classes ==="
# First, find the actual RepositoryImpl files in the repo
fd -e kt "RepositoryImpl" --type f | head -30Repository: Medicare-Call/Medicare-Call-Android
Length of output: 2085
🏁 Script executed:
#!/bin/bash
# Check each RepositoryImpl file for @Inject constructor
echo "=== Checking @Inject constructors ==="
files=(
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/DataStoreRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderIdRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderRegisterRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/EldersHealthInfoRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/EldersInfoRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/FcmRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/GlucoseRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HealthRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HomeRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MealRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MedicineRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MemberRegisterRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MentalRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NaverPayRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NoticeRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SetCallRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SleepRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/StatisticsRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SubscribeRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/UpdateElderInfoRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/UserRepositoryImpl.kt"
"app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/VerificationRepositoryImpl.kt"
)
missing_inject=0
for file in "${files[@]}"; do
filename=$(basename "$file")
if grep -q "@Inject" "$file"; then
echo "✓ $filename has @Inject"
else
echo "✗ $filename MISSING @Inject"
missing_inject=$((missing_inject + 1))
fi
done
echo ""
echo "Summary: $missing_inject files missing @Inject"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 1094
🏁 Script executed:
#!/bin/bash
# Check a few files that are reported missing @Inject to see their constructor situation
echo "=== Checking ElderIdRepositoryImpl ==="
head -50 "app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderIdRepositoryImpl.kt"
echo ""
echo "=== Checking EldersInfoRepositoryImpl ==="
head -50 "app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/EldersInfoRepositoryImpl.kt"
echo ""
echo "=== Checking HomeRepositoryImpl ==="
head -50 "app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HomeRepositoryImpl.kt"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 4807
14개의 RepositoryImpl 클래스에서 @Inject 어노테이션이 누락되었습니다. 즉시 수정이 필요합니다.
@BINDS 바인딩이 작동하려면 모든 구현체에 @Inject 어노테이션이 필수입니다. 현재 14개 파일이 이 어노테이션을 빠뜨리고 있어서 런타임에 의존성 주입이 실패할 것입니다:
- 누락된 파일들: ElderIdRepositoryImpl, EldersHealthInfoRepositoryImpl, EldersInfoRepositoryImpl, GlucoseRepositoryImpl, HealthRepositoryImpl, HomeRepositoryImpl, MealRepositoryImpl, MedicineRepositoryImpl, MentalRepositoryImpl, NoticeRepositoryImpl, SleepRepositoryImpl, StatisticsRepositoryImpl, SubscribeRepositoryImpl, UpdateElderInfoRepositoryImpl
각 구현 클래스의 constructor에 @Inject 어노테이션을 추가해주세요.
🤖 Prompt for AI Agents
In @app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt around
lines 57 - 144, Several repository implementation classes referenced by the
@Binds methods in RepositoryModule (e.g., ElderIdRepositoryImpl,
EldersHealthInfoRepositoryImpl, EldersInfoRepositoryImpl, GlucoseRepositoryImpl,
HealthRepositoryImpl, HomeRepositoryImpl, MealRepositoryImpl,
MedicineRepositoryImpl, MentalRepositoryImpl, NoticeRepositoryImpl,
SleepRepositoryImpl, StatisticsRepositoryImpl, SubscribeRepositoryImpl,
UpdateElderInfoRepositoryImpl) are missing the required @Inject on their
constructors; add @Inject to each implementation's primary constructor so Hilt
can provide them for the abstract bind methods (ensure the annotated constructor
is the primary/only constructor and that the class is concrete and public so the
binding in bindElderIdRepository, bindEldersHealthInfoRepository,
bindEldersInfoRepository, bindGlucoseRepository, bindHealthRepository,
bindHomeRepository, bindMealRepository, bindMedicineRepository,
bindMentalRepository, bindNoticeRepository, bindSleepRepository,
bindStatisticsRepository, bindSubscribeRepository, and
bindUpdateElderInfoRepository succeeds).
| class NaverPayRepositoryImpl @Inject constructor( | ||
| private val naverPayService: NaverPayService, | ||
| ) : NaverPayRepository { |
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.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Find all Kotlin module files
echo "=== 프로젝트 구조 확인 ==="
find . -name "*Module.kt" -type f | head -20
echo -e "\n=== Koin에서의 NaverPayRepository 선언 ==="
rg -n "NaverPayRepository" --type=kt -g "*Module.kt"
echo -e "\n=== Hilt RepositoryModule 확인 ==="
rg -nB 2 -A 2 "@Binds|@Provides|NaverPayRepositoryImpl" --type=kt -g "*RepositoryModule.kt"
echo -e "\n=== 전체 NaverPayRepository 참조 확인 ==="
rg -n "NaverPayRepository" --type=ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 927
🏁 Script executed:
#!/bin/bash
echo "=== RepositoryModule.kt 내용 확인 ==="
cat -n ./app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt
echo -e "\n=== Koin 설정 파일 확인 (KoinModule) ==="
cat -n ./app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.kt
echo -e "\n=== 전체 NaverPayRepository 참조 ==="
rg -n "NaverPayRepository" .
echo -e "\n=== NaverPayRepositoryImpl 참조 확인 ==="
rg -n "NaverPayRepositoryImpl" .Repository: Medicare-Call/Medicare-Call-Android
Length of output: 16234
Hilt와 Koin이 동시에 NaverPayRepository를 관리하고 있어서 주입 충돌이 발생할 수 있습니다
NaverPayRepositoryImpl은 @Inject 어노테이션으로 Hilt 방식 주입을 사용하면서 동시에 KoinModule.kt의 repositoryModule에도 정의되어 있습니다(line 117). 이 repository는 두 프레임워크에서 모두 바인딩되고 있으므로, 앱 실행 시 어느 것을 사용할지 모호해집니다.
프로젝트를 Hilt로 완전히 전환하려면 KoinModule.kt에서 NaverPayRepository 바인딩을 제거해야 합니다.
🤖 Prompt for AI Agents
In
@app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NaverPayRepositoryImpl.kt
around lines 10 - 12, NaverPayRepositoryImpl is annotated with @Inject for Hilt
but is also bound in the Koin repositoryModule, causing duplicate injection
bindings; remove the NaverPayRepository binding from the Koin repositoryModule
(where the NaverPayRepository is provided/created) so only Hilt-managed
NaverPayRepositoryImpl (and its dependency NaverPayService) remains, and verify
no other Koin bindings reference NaverPayRepository to avoid further conflicts.
| import dagger.hilt.android.AndroidEntryPoint | ||
|
|
||
| @AndroidEntryPoint |
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.
MainActivity에서 Hilt와 Koin을 동시에 사용하고 있습니다.
@AndroidEntryPoint 어노테이션은 이 액티비티를 Hilt 컴포넌트로 만드는데, 83-84번 줄에서는 koinViewModel()을 사용하여 Koin으로 ViewModel을 가져오고 있습니다.
이렇게 하나의 컴포넌트에서 두 DI 프레임워크를 혼용하면:
- ViewModel이 Hilt 의존성을 필요로 할 경우 주입 실패
- 런타임에 예상치 못한 의존성 해결 오류 발생 가능
- 코드 가독성 및 유지보수성 저하
Hilt를 사용한다면 hiltViewModel()로, Koin을 사용한다면 @AndroidEntryPoint 제거 후 Koin으로 통일해야 합니다.
🤖 Prompt for AI Agents
In @app/src/main/java/com/konkuk/medicarecall/MainActivity.kt around lines 41 -
43, MainActivity is annotated with @AndroidEntryPoint but still calls
koinViewModel(), mixing Hilt and Koin; pick one DI framework and make code
consistent: if you choose Hilt, remove koinViewModel() usages in MainActivity
and replace them with hiltViewModel() (and keep @AndroidEntryPoint); if you
choose Koin, remove the @AndroidEntryPoint annotation from MainActivity and
switch any Hilt-specific setup to Koin modules and keep koinViewModel(); update
imports and ViewModel retrieval in MainActivity accordingly so only one DI
system is used.
| import android.util.Log | ||
| import androidx.compose.runtime.Composable | ||
| import androidx.compose.runtime.remember | ||
| import androidx.hilt.navigation.compose.hiltViewModel |
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.
Hilt와 Koin 혼용으로 인한 ViewModel 해결 실패 우려
이 파일에서 hiltViewModel()로 변경했지만, HomeDetailModule.kt와 StatisticsModule.kt에서는 여전히 Koin으로 ViewModel을 등록하고 있습니다.
결과:
- GlucoseViewModel, MealViewModel, MedicineViewModel 등은 Koin에만 등록되어 있어서
hiltViewModel()로 가져올 수 없습니다 - 해당 화면 진입 시 "Cannot create ViewModel" 타입의 런타임 예외가 발생할 가능성이 높습니다
ViewModel 제공 방식을 통일해야 합니다. Hilt를 사용한다면 모든 ViewModel에 @HiltViewModel 어노테이션과 @Inject constructor를 적용하고, Koin 모듈 대신 Hilt가 자동으로 제공하도록 해야 합니다.
Also applies to: 17-17, 28-28, 30-30
| val parentEntry = remember(backStackEntry) { | ||
| navController.getBackStackEntry(MainTabRoute.Home) | ||
| } | ||
| val homeViewModel: HomeViewModel = hiltViewModel(parentEntry) | ||
|
|
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.
🧩 Analysis chain
🏁 Script executed:
find . -type f -name "HomeViewModel.kt" -o -name "HomeViewModel.java"Repository: Medicare-Call/Medicare-Call-Android
Length of output: 165
🏁 Script executed:
rg -l "class HomeViewModel" --type=ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 105
🏁 Script executed:
rg -A 10 "@HiltViewModel|class HomeViewModel" --type=kt | head -50Repository: Medicare-Call/Medicare-Call-Android
Length of output: 105
🏁 Script executed:
cat -n ./app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.ktRepository: Medicare-Call/Medicare-Call-Android
Length of output: 16056
HomeViewModel에 필수 Hilt 어노테이션이 누락되어 있습니다
NavGraph.kt에서 hiltViewModel(parentEntry)로 HomeViewModel을 가져오려면, HomeViewModel이 @HiltViewModel 어노테이션으로 표시되어야 하는데 현재 해당 어노테이션이 없습니다. 또한 constructor의 의존성 주입도 @Inject로 표시되어야 합니다.
다음을 수정해주세요:
HomeViewModel클래스에@HiltViewModel어노테이션 추가- constructor에
@Inject추가 (예:@Inject constructor(...)) - 필요한 import 추가:
dagger.hilt.android.lifecycle.HiltViewModel,javax.inject.Inject
🤖 Prompt for AI Agents
In @app/src/main/java/com/konkuk/medicarecall/ui/navigation/NavGraph.kt around
lines 178 - 182, HomeViewModel is missing Hilt annotations so
hiltViewModel(parentEntry) cannot provide it; add @HiltViewModel to the
HomeViewModel class declaration and annotate its primary constructor with
@Inject (e.g., @Inject constructor(...)) so Hilt can inject dependencies, and
add the imports dagger.hilt.android.lifecycle.HiltViewModel and
javax.inject.Inject; keep the class name HomeViewModel and ensure any
constructor parameters are provided by Hilt modules or other @Injectable types.
| hilt = "2.52" | ||
| hiltNavigationCompose = "1.2.0" | ||
| hiltManager = "1.0.0" |
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.
🧩 Analysis chain
🌐 Web query:
Dagger Hilt latest stable version 2026
💡 Result:
As of January 8, 2026 the latest stable Dagger Hilt release is 2.57.2. [1][2]
Sources:
- javadoc.io listing for com.google.dagger artifacts (shows hilt-android 2.57.2). [1]
- MVNRepository Hilt listing (shows 2.57 / newer 2.57.2). [2]
🌐 Web query:
androidx.hilt:hilt-compiler latest version 2025 2026
💡 Result:
The latest stable version of androidx.hilt:hilt-compiler is 1.3.0 (stable release published Sep 10, 2025). [1][2]
Sources:
[1] Android Developers — Hilt release notes (Jetpack).
[2] Maven / mvnrepository entry for androidx.hilt:hilt-compiler (1.3.0).
🌐 Web query:
Hilt navigation compose latest version 2026
💡 Result:
Latest stable version (artifact: androidx.hilt:hilt-navigation-compose) is 1.3.0 (released Sep 10, 2025). [1][2]
Coordinates: implementation("androidx.hilt:hilt-navigation-compose:1.3.0"). [2]
Sources:
[1] Android Developers — Hilt release notes (shows 1.3.0, Sep 10, 2025).
[2] Maven / MVNRepository listing for androidx.hilt:hilt-navigation-compose 1.3.0.
Hilt 의존성 버전 업데이트 필요
Hilt 관련 의존성들이 모두 구버전으로 설정되어 있습니다. 다음과 같이 업데이트하세요:
hilt = "2.52"→2.57.2로 업데이트hiltNavigationCompose = "1.2.0"→1.3.0으로 업데이트hiltManager = "1.0.0"(androidx.hilt:hilt-compiler) →1.3.0으로 업데이트
이 버전들은 2025년 9월부터 안정 버전으로 제공되고 있으니, 최신 버전으로 맞춰두는 게 좋습니다.
🤖 Prompt for AI Agents
In @gradle/libs.versions.toml around lines 21 - 23, Update the Hilt dependency
versions in libs.versions.toml: change the hilt entry (hilt) from "2.52" to
"2.57.2", change hiltNavigationCompose from "1.2.0" to "1.3.0", and change
hiltManager (androidx.hilt:hilt-compiler) from "1.0.0" to "1.3.0"; update the
three values where the keys hilt, hiltNavigationCompose, and hiltManager are
defined so the build uses the new stable versions.
Reverts #215
Summary by CodeRabbit
릴리스 노트
✏️ Tip: You can customize this high-level summary in your review settings.