Skip to content

Conversation

@alswlekk
Copy link
Collaborator

@alswlekk alswlekk commented Jan 8, 2026

Reverts #215

Summary by CodeRabbit

릴리스 노트

  • Refactor
    • 앱의 의존성 관리 시스템을 현대화하여 안정성과 신뢰성을 개선했습니다. 이를 통해 향후 유지보수와 기능 개선이 더욱 용이해졌으며, 사용자에게는 직접적인 변화 없이 더욱 견고한 앱 기반을 제공합니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 8, 2026

Walkthrough

종속성 주입(DI) 프레임워크를 Koin에서 Dagger/Hilt로 전환하는 대규모 마이그레이션입니다. 여러 DI 모듈이 추가되고, 리포지토리 및 ViewModel 어노테이션이 업데이트되며, 빌드 설정이 Hilt를 지원하도록 조정되었습니다.

Changes

Cohort / File(s) 변경 요약
Gradle 빌드 설정
app/build.gradle.kts, gradle/libs.versions.toml
Koin 의존성 유지하면서 Hilt 관련 의존성 추가(hilt-android, hilt-compiler, hilt-navigation-compose); KOIN_DEFAULT_MODULE KSP 인자 제거
App 초기화
app/src/main/java/com/konkuk/medicarecall/App.kt
기존 defaultModule과 새로운 DI 모듈들(settingsModules, calendarModule, homeModule 등)을 통합하여 Koin 초기화
Activity & Service DI 설정
app/src/main/java/com/konkuk/medicarecall/MainActivity.kt, app/src/main/java/com/konkuk/medicarecall/data/api/fcm/FcmService.kt
@AndroidEntryPoint 어노테이션 추가로 Hilt DI 활성화
Hilt 모듈 (API & 네트워크)
app/src/main/java/com/konkuk/medicarecall/data/di/ApiModule.kt, app/src/main/java/com/konkuk/medicarecall/data/di/NetworkModule.kt
Koin @Single에서 Hilt @Provides/@singleton으로 전환; 메서드명을 provideXService 규칙으로 변경; @Named 한정자 추가
Hilt 리포지토리 모듈
app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt
@Binds를 사용하여 리포지토리 인터페이스를 구현체에 바인딩; SingletonComponent에 설치
Koin 모듈 (신규 & 기능별)
app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.kt, app/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.kt, app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt, app/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.kt, app/src/main/java/com/konkuk/medicarecall/data/di/SettingsModule.kt, app/src/main/java/com/konkuk/medicarecall/data/di/StatisticsModule.kt
각 기능별 Koin 모듈 추가; networkModule, apiModule, repositoryModule 정의
리포지토리 구현체 (DI 어노테이션 변경)
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/DataStoreRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderRegisterRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/FcmRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MemberRegisterRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NaverPayRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SetCallRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/UserRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/VerificationRepositoryImpl.kt
@Single@Inject constructor + @Singleton 또는 제거로 전환; @ApplicationContext 한정자 추가
리포지토리 구현체 (어노테이션 제거)
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/ElderIdRepositoryImpl.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/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/MentalRepositoryImpl.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/NoticeRepositoryImpl.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
@Single 어노테이션 및 Koin import 제거
ViewModel (Koin 어노테이션 제거)
app/src/main/java/com/konkuk/medicarecall/ui/feature/calendar/viewmodel/CalendarViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/meal/viewmodel/MealViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/medicine/viewmodel/MedicineViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.kt, app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/..., app/src/main/java/com/konkuk/medicarecall/ui/feature/statistics/viewmodel/StatisticsViewModel.kt
@KoinViewModel 어노테이션 및 관련 import 제거
네비게이션 & UI
app/src/main/java/com/konkuk/medicarecall/ui/common/extension/NavBackStackEntryExt.kt, app/src/main/java/com/konkuk/medicarecall/ui/navigation/NavGraph.kt
koinViewModel() → hiltViewModel() 전환; NavGraph에서 shared HomeViewModel 추가

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

refactor

Suggested reviewers

  • ikseong00
  • librawish808
  • ProtossManse

Poem

🎯 프레임워크를 갈아입고,
Koin에서 Hilt로 도약하는 마이그레이션,
의존성의 웹을 재짠다,
모듈 모듈 하나하나 정렬하며,
더 튼튼한 기초 위에 서다. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 변경 내용의 주요 의도를 명확히 반영하고 있습니다. 'Revert'는 이전 PR을 되돌리는 작업이며, 이는 광범위한 DI 프레임워크 마이그레이션(Koin→Hilt) 변경 사항과 정확히 일치합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a 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 설정 중복 제거를 추천합니다

provideAuthRetrofitprovideRetrofit에서 동일한 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

📥 Commits

Reviewing files that changed from the base of the PR and between 9315935 and dbb2197.

📒 Files selected for processing (54)
  • app/build.gradle.kts
  • app/src/main/java/com/konkuk/medicarecall/App.kt
  • app/src/main/java/com/konkuk/medicarecall/MainActivity.kt
  • app/src/main/java/com/konkuk/medicarecall/data/api/fcm/FcmService.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/ApiModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/KoinModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/NetworkModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/SettingsModule.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/StatisticsModule.kt
  • 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
  • app/src/main/java/com/konkuk/medicarecall/ui/common/extension/NavBackStackEntryExt.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/calendar/viewmodel/CalendarViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/meal/viewmodel/MealViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/medicine/viewmodel/MedicineViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/DetailElderInfoViewModel.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/DetailMyDataViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/EldersHealthViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/MyDataViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/NoticeViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/settings/viewmodel/SubscribeViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/statistics/viewmodel/StatisticsViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/navigation/NavGraph.kt
  • gradle/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.Inject import가 정확하게 추가되었습니다.


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들이 정확하게 추가되었습니다. @ApplicationContext qualifier와 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 의존성 제공 구조는 올바르게 설정됨

@Inject constructor를 사용한 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)에서 중복 제공되고 있습니다.

실제 문제점:

  1. Retrofit은 NetworkModule에서 Hilt로 제공되지만, StatisticsModule에서 get<Retrofit>()로 Koin에 요청함 - Retrofit이 Koin 컨테이너에 등록되지 않았다면 런타임 실패 가능
  2. StatisticsService가 두 프레임워크에서 모두 제공되어 충돌 가능성
  3. 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
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

잘못된 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.

Suggested change
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)을 삭제하세요.

Comment on lines +1 to +12
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()
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 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 2

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 7496


🏁 Script executed:

# Verify Koin module usage patterns
rg "koin|module\s*{" --type kotlin -l

Repository: 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()).

Comment on lines +12 to +49
val homeDetailModule = module {

viewModel {
GlucoseViewModel(
get(),
)
}

viewModel {
MealViewModel(
get(),
)
}

viewModel {
MedicineViewModel(
get(),
)
}

viewModel {
SleepViewModel(
get(),
)
}

viewModel {
HealthViewModel(
get(),
)
}

viewModel {
MentalViewModel(
get(),
)
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 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=kt

Repository: 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 f

Repository: 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 -30

Repository: 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.kt

Repository: 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 -50

Repository: 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.kt

Repository: 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.kt

Repository: 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)로 통일하세요.

Comment on lines +1 to +121
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)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 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 -20

Repository: 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 -l

Repository: 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/null

Repository: 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/null

Repository: 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.kt

Repository: 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 2

Repository: 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.

Comment on lines +57 to +144
@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
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 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 -30

Repository: 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).

Comment on lines +10 to 12
class NaverPayRepositoryImpl @Inject constructor(
private val naverPayService: NaverPayService,
) : NaverPayRepository {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 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=kt

Repository: 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.

Comment on lines +41 to +43
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

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
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

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

Comment on lines +178 to +182
val parentEntry = remember(backStackEntry) {
navController.getBackStackEntry(MainTabRoute.Home)
}
val homeViewModel: HomeViewModel = hiltViewModel(parentEntry)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 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=kt

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 105


🏁 Script executed:

rg -A 10 "@HiltViewModel|class HomeViewModel" --type=kt | head -50

Repository: 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.kt

Repository: 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.

Comment on lines +21 to +23
hilt = "2.52"
hiltNavigationCompose = "1.2.0"
hiltManager = "1.0.0"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 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.

@alswlekk alswlekk closed this Jan 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants