Skip to content

Conversation

@librawish808
Copy link
Collaborator

@librawish808 librawish808 commented Jan 2, 2026

🔗 관련 이슈

📙 작업 설명

  • Home, HomeDetail, Calendar 의 뷰모델 DI를 Hilt->Koin 으로 전환
  • Home, HomeDetail, Calendar 전용 Koin Module 정의
  • 각 화면의 hilt 호출을 제거하고 koin으로 수정
  • Hilt, Inject 어노테이션 제거

📸 스크린샷 또는 시연 영상 (선택)

💬 추가 설명 or 리뷰 포인트 (선택)

Summary by CodeRabbit

  • Refactor

    • 앱의 의존성 주입이 Hilt에서 Koin으로 전환되어 앱 초기화와 ViewModel 제공 방식이 Koin 기반으로 변경되었습니다.
    • 여러 화면(홈, 상세, 캘린더 등)의 기본 ViewModel 획득이 Koin으로 통일되어 인스턴스 제공 방식이 일관화되었습니다.
  • Chores

    • 빌드·정적분석 설정에서 Hilt 관련 항목이 제거되고 Koin 의존성 및 모듈 등록이 추가되었습니다.

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

@coderabbitai
Copy link

coderabbitai bot commented Jan 2, 2026

Caution

Review failed

The pull request is closed.

Walkthrough

Hilt 의존성 및 주입 어노테이션을 제거하고 Koin으로 전면 마이그레이션했습니다. 빌드스크립트에서 Hilt 플러그인/의존성/KSP 훅을 제거하고 Koin 의존성을 추가했으며, App에서 Koin을 초기화하고 여러 ViewModel/Repository의 Hilt 어노테이션을 제거, Compose 화면의 기본 ViewModel 공급을 hiltViewModel()koinViewModel()로 변경했습니다.

Changes

Cohort / File(s) Summary
빌드 설정
app/build.gradle.kts, build.gradle.kts
Hilt 플러그인 alias 및 Hilt 관련 의존성/KSP 훅 제거; Koin(Core/Android/AndroidX Compose) 의존성 추가.
앱 초기화
app/src/main/java/com/konkuk/medicarecall/App.kt
AppKoinComponent 채택 및 startKoin { androidContext(...); modules(...) } 호출로 Koin 초기화. FcmRepository 주입을 by inject()로 변경.
DI 모듈 추가
app/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.kt, .../HomeModule.kt, .../HomeDetailModule.kt
신규 Koin 모듈 정의: calendarModule, homeModule(SavedStateHandle 지원), homeDetailModule(여러 ViewModel 바인딩).
ViewModel/Repository 어노테이션 제거
app/src/main/java/com/konkuk/medicarecall/ui/feature/.../viewmodel/*ViewModel.kt, app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/*RepositoryImpl.kt
클래스 상단의 @HiltViewModel 및 생성자 @Inject 제거(생성자 파라미터 유지). 관련 javax.inject/Hilt import 제거.
Composable ViewModel 제공 교체
여러 .../screen/*Screen.kt
Composable 기본 ViewModel 공급을 hiltViewModel()koinViewModel()로 변경 및 import 교체(파라미터 기본값 변경).
다수 화면 파일
예: .../home/..., .../homedetail/..., .../calendar/...
ViewModel 주입 방식 변경으로 인한 파라미터 기본값/임포트 수정(로직은 동일).

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant App as App(Application)
    participant Koin as Koin(Container)
    participant Screen as Composable Screen
    participant VM as ViewModel
    participant Repo as Repository

    rect rgba(200,230,255,0.35)
    App->>Koin: startKoin(androidContext, modules...)
    note right of Koin: modules 등록\n(calendarModule, homeModule, homeDetailModule)
    end

    rect rgba(220,255,220,0.28)
    Screen->>Koin: koinViewModel<VM>() 요청
    Koin-->>VM: ViewModel 인스턴스 생성/제공
    VM->>Repo: Repository 의존성 주입(get()/module에서 제공)
    Repo-->>VM: Repository 인스턴스 반환
    VM-->>Screen: ViewModel 반환(화면 바인딩)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

refactor

Suggested reviewers

  • ikseong00
  • alswlekk

Poem

🧩 Koin이 와서 모듈을 펼치네,
App은 불을 켜고 뷰모델은 자리하네,
Hilt는 추억으로 살짝 남기고,
가볍게 주입되어 화면이 웃네,
새 DI, 새 리듬, 고고씽 🎉

Pre-merge checks and finishing touches

❌ 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%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 주요 변경사항을 명확하게 요약하고 있습니다. Hilt에서 Koin으로의 마이그레이션과 관련된 주요 기능(Home, HomeDetail, Calendar) 전환을 직접적으로 언급하고 있습니다.
Linked Issues check ✅ Passed PR은 링크된 이슈 #210의 Home/HomeDetail/Calendar 부분 요구사항을 완벽하게 충족합니다. Koin 모듈 생성, ViewModel 마이그레이션, Hilt 의존성 제거 등 모든 주요 코딩 요구사항이 구현되었습니다.
Out of Scope Changes check ✅ Passed PR의 모든 변경사항은 Home/HomeDetail/Calendar 영역의 Hilt-to-Koin 마이그레이션 범위 내에 있습니다. 빌드 설정, ViewModel, Repository 그리고 모듈 정의가 일관되게 변경되었습니다.

📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8c7d07c and 6d5d44d.

📒 Files selected for processing (1)
  • app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt

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.

@librawish808 librawish808 self-assigned this Jan 2, 2026
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: 7

🧹 Nitpick comments (3)
app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.kt (1)

18-21: 선택적 정리: @Inject 어노테이션 제거 고려

@HiltViewModel 제거는 잘 처리되었습니다. 다만 @Inject 어노테이션은 Koin에서 필요하지 않습니다. Koin은 HomeDetailModule.ktviewModel { GlucoseViewModel(get()) } 정의를 통해 의존성을 해결합니다.

동작에는 문제가 없지만, Koin으로 완전히 전환하려면 @Inject 어노테이션을 제거하는 것을 고려해보세요.

🔎 제안하는 정리 방법
-import javax.inject.Inject
-
-class GlucoseViewModel @Inject constructor(
+class GlucoseViewModel constructor(
     private val glucoseRepository: GlucoseRepository,
 ) : ViewModel() {
app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.kt (1)

15-18: 선택적 정리: @Inject 어노테이션 제거 고려

Hilt 어노테이션 제거는 잘되었습니다. 마찬가지로 @Inject 어노테이션도 Koin에서는 필요하지 않으므로 제거를 고려해보세요.

🔎 제안하는 정리 방법
-import javax.inject.Inject
-
-class SleepViewModel @Inject constructor(
+class SleepViewModel constructor(
     private val sleepRepository: SleepRepository,
 ) : ViewModel() {
app/src/main/java/com/konkuk/medicarecall/App.kt (1)

32-38: [선택사항] Koin 초기화에 로깅 추가를 고려해보세요.

Koin 설정 시 디버그 로깅을 추가하면 DI 관련 이슈를 추적하기 쉬워요. 특히 마이그레이션 과정에서 유용할 수 있어요.

🔎 로깅 추가 예시
 startKoin {
     androidContext(this@App)
+    if (BuildConfig.DEBUG) {
+        logger(org.koin.android.logger.AndroidLogger())
+    }
     modules(
         homeModule,
         homeDetailModule
     )
 }
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 50931f0 and be77005.

📒 Files selected for processing (20)
  • app/build.gradle.kts
  • app/src/main/java/com/konkuk/medicarecall/App.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/ui/feature/calendar/viewmodel/CalendarViewModel.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/home/screen/HomeScreen.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/screen/GlucoseDetailScreen.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/screen/MealDetailScreen.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/screen/MedicineDetailScreen.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/screen/SleepDetailScreen.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/screen/StateHealthDetailScreen.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/screen/StateMentalDetailScreen.kt
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.kt
  • build.gradle.kts
💤 Files with no reviewable changes (2)
  • build.gradle.kts
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt
🔇 Additional comments (12)
app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/screen/StateMentalDetailScreen.kt (1)

33-33: Koin import 전환이 올바르게 적용되었습니다.

Hilt의 hiltViewModel에서 Koin의 koinViewModel로 import가 정확하게 변경되었습니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/meal/viewmodel/MealViewModel.kt (1)

15-18: Hilt 어노테이션 제거 잘 되었습니다!

@HiltViewModel 어노테이션 제거가 깔끔하게 처리되었고, @Inject 생성자는 Koin의 생성자 주입과도 잘 작동합니다. AI 요약에 따르면 MealViewModel은 HomeDetailModule에 등록되어 있다고 하니 문제없을 것 같네요.

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/medicine/viewmodel/MedicineViewModel.kt (1)

16-19: Koin 마이그레이션 잘 적용되었습니다.

@HiltViewModel 제거가 정확하고, 생성자 주입 패턴도 Koin과 잘 호환됩니다. HomeDetailModule에 포함되어 있을 것으로 보이니 괜찮습니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.kt (1)

14-17: 마이그레이션이 일관되게 적용되었네요.

다른 ViewModel들과 동일한 패턴으로 @HiltViewModel이 제거되었고, HomeDetailModule에 등록되어 있을 것으로 보입니다. 변경 사항 승인합니다!

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/meal/screen/MealDetailScreen.kt (2)

33-33: import 변경 정확합니다.

Hilt에서 Koin으로의 import 변경이 올바르게 적용되었습니다.


41-42: koinViewModel() 전환 확인이 필요합니다.

hiltViewModel()에서 koinViewModel()로의 전환은 잘 되었는데, CalendarViewModel이 Koin 모듈에 제대로 등록되어 있는지 확인이 필요합니다.

MealViewModel은 HomeDetailModule에 포함되어 있어서 문제없을 것 같지만, CalendarViewModel은 calendar 패키지의 공유 컴포넌트라서 어느 모듈에 속하는지 명확하지 않습니다. CalendarViewModel.kt 파일에 남긴 검증 스크립트를 실행해서 확인해보시면 좋을 것 같아요.

등록되지 않았다면 이 화면 진입 시 런타임에 크래시가 발생할 수 있습니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.kt (1)

15-18: Hilt → Koin 마이그레이션 잘 적용되었습니다.

@HiltViewModel 어노테이션을 제거하고 @Inject 생성자는 유지하는 것이 올바른 접근입니다. @Inject는 JSR-330 표준 어노테이션으로 Koin에서도 지원됩니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/medicine/screen/MedicineDetailScreen.kt (1)

36-36: ViewModel 주입 방식이 Koin으로 깔끔하게 전환되었습니다.

Import와 default parameter가 모두 koinViewModel()로 일관되게 변경되어 있습니다.

Also applies to: 44-45

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/screen/StateHealthDetailScreen.kt (1)

34-34: Koin 전환이 올바르게 적용되었습니다.

Import와 ViewModel 주입 방식이 모두 일관되게 변경되었습니다.

Also applies to: 41-42

app/src/main/java/com/konkuk/medicarecall/ui/feature/home/screen/HomeScreen.kt (1)

70-70: Home 화면의 Koin 전환이 완료되었습니다.

Import와 ViewModel 주입이 깔끔하게 koinViewModel()로 변경되었습니다.

Also applies to: 75-75

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/screen/SleepDetailScreen.kt (1)

32-32: LGTM! Koin 마이그레이션 잘 적용되었습니다

hiltViewModel()에서 koinViewModel()로의 전환이 올바르게 처리되었습니다. import 구문도 적절히 추가되었고, 두 ViewModel 모두 Koin을 통해 주입되도록 설정되었습니다.

Also applies to: 40-41

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/screen/GlucoseDetailScreen.kt (1)

50-50: LGTM! Koin 마이그레이션이 올바르게 적용되었습니다

hiltViewModel()에서 koinViewModel()로의 전환이 정확하게 처리되었습니다. import 구문도 적절히 추가되었고, GlucoseViewModel이 Koin을 통해 주입되도록 설정되었습니다.

Also applies to: 59-59

Comment on lines +109 to +112
// 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")
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

🌐 Web query:

latest Koin version 2025 Android Compose

💡 Result:

Latest stable Koin for Android Compose (artifact io.insert-koin:koin-androidx-compose) is 4.1.1. The next pre-release is 4.2.0-beta2 (pre-release). [1][2]

Sources:

  • GitHub releases (4.2.0-beta2 pre-release). [1]
  • Maven / Koin docs showing koin-androidx-compose / koin-bom 4.1.1 (stable). [2]

Koin 버전을 4.1.1로 업데이트하면 좋겠습니다

현재 사용 중인 Koin 3.5.3은 최신 안정 버전(4.1.1)에서 꽤 뒤떨어져 있습니다. 한번 업데이트해 보는 건 어떨까요?

🤖 Prompt for AI Agents
In app/build.gradle.kts around lines 109 to 112, the Koin dependencies are
pinned to 3.5.3; update all io.insert-koin artifacts (koin-core, koin-android,
koin-androidx-compose) to version 4.1.1 to align with the newer stable release,
then run Gradle sync/build and address any API changes or deprecation fixes
(adjust imports and module setup where necessary) so the project compiles and
tests pass.


class App : Application(), KoinComponent {

private val fcmRepository: FcmRepository by inject()
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
# Search for FcmRepository Koin module definition
echo "=== Searching for FcmRepository Koin module definition ==="
rg -n "FcmRepository" --type=kt -g '*/di/*.kt' -C 3

echo -e "\n=== Broader search for FcmRepository in Koin context ==="
rg -n "FcmRepository" --type=kt -C 2 | head -100

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 266


🏁 Script executed:

#!/bin/bash
# Find all kotlin files with FcmRepository
echo "=== Searching for FcmRepository in Kotlin files ==="
rg -n "FcmRepository" --include="*.kt" -C 2

echo -e "\n=== Searching for Koin module definitions ==="
rg -n "module\s*{|single.*|factory.*" --include="*.kt" | grep -i fcm

echo -e "\n=== Checking App.kt startKoin configuration ==="
find . -name "App.kt" -type f | xargs cat -n | grep -A 20 "startKoin"

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 2355


🏁 Script executed:

#!/bin/bash
# Search for FcmRepository in all files
echo "=== Searching for FcmRepository everywhere ==="
find . -type f -name "*.kt" | xargs grep -l "FcmRepository" 2>/dev/null

echo -e "\n=== Searching for Koin modules ==="
find . -type f -name "*.kt" | xargs grep -l "homeModule\|homeDetailModule" 2>/dev/null

echo -e "\n=== Looking for di/module directories ==="
find . -type d -name "di" -o -type d -name "module" 2>/dev/null | head -20

echo -e "\n=== Checking for any FcmRepository related code ==="
find . -type f -name "*.kt" | xargs grep "Fcm" 2>/dev/null | head -30

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 4830


🏁 Script executed:

#!/bin/bash
# Check RepositoryModule content
echo "=== RepositoryModule.kt content ==="
cat ./app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt

echo -e "\n=== HomeModule.kt content (for comparison) ==="
cat ./app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt | head -30

echo -e "\n=== HomeDetailModule.kt content (for comparison) ==="
cat ./app/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.kt | head -30

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 8149


RepositoryModule을 Koin으로 변환 후 startKoin에 등록해야 합니다.

FcmRepository가 정의된 RepositoryModule이 Hilt/Dagger 방식(@module, @Installin, @BINDS)으로 작성되어 있는데, App.kt가 Koin(by inject(), startKoin)으로 마이그레이션되면서 두 DI 프레임워크가 충돌하고 있어요. 런타임에 FcmRepository를 찾을 수 없어 앱이 크래시될 거예요.

RepositoryModule을 Koin 문법으로 변환하고 startKoin의 modules에 추가해야 합니다:

변환 예시
val repositoryModule = module {
    single<FcmRepository> { FcmRepositoryImpl(...) }
    // 다른 repository들도 동일하게...
}

그 다음 App.kt의 startKoin 호출에 추가:

modules(
    homeModule,
    homeDetailModule,
    repositoryModule  // 추가
)
🤖 Prompt for AI Agents
In app/src/main/java/com/konkuk/medicarecall/App.kt around line 25, App.kt still
expects FcmRepository via Koin injection (private val fcmRepository:
FcmRepository by inject()) but the RepositoryModule was left as Hilt/Dagger
bindings, so Koin cannot resolve FcmRepository at runtime; convert the existing
RepositoryModule to Koin syntax (create a Koin module that provides
single<FcmRepository> { FcmRepositoryImpl(...) } and any other repository
bindings), then add that new repositoryModule to the startKoin modules(...) list
in App.kt so Koin can supply FcmRepository via inject().

Comment on lines 32 to 38
startKoin {
androidContext(this@App)
modules(
homeModule,
homeDetailModule
)
}
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

⚠️ 현재 등록된 Koin 모듈이 불완전해서 다른 화면에서 런타임 크래시가 발생할 수 있어요.

현재 homeModulehomeDetailModule 두 개만 등록되어 있는데, AI 요약과 PR 설명을 보면 앱에는 다음과 같은 기능들이 더 있어요:

  • Calendar, Glucose, Meal, Medicine, Sleep, Health, Mental 등

이 기능들의 ViewModel도 Koin으로 마이그레이션되었다면 (AI 요약에서 언급됨), 해당 모듈들도 여기에 등록해야 해요. 그렇지 않으면 해당 화면 진입 시 NoBeanDefFoundException이 발생할 거예요.

만약 이 PR이 Home/HomeDetail만 마이그레이션하는 단계적 전환이라면, 아직 마이그레이션되지 않은 화면들은 여전히 Hilt를 사용하도록 해야 하는데, 현재 설정으로는 Hilt와 Koin을 동시에 사용하기 어려울 수 있어요.

다음 스크립트로 마이그레이션 현황을 확인해볼게요:

#!/bin/bash
# 모든 Koin 모듈 파일 찾기
echo "=== All Koin modules in the project ==="
fd -e kt . app/src/main/java/com/konkuk/medicarecall/data/di/ --exec echo {}

echo -e "\n=== Koin module definitions (val xxxModule) ==="
rg -n "^val \w+Module.*=.*module" --type=kt app/src/main/java/com/konkuk/medicarecall/data/di/ -C 1

echo -e "\n=== ViewModels still using @HiltViewModel ==="
rg -n "@HiltViewModel" --type=kt app/src/main/java/com/konkuk/medicarecall/

echo -e "\n=== Screens using koinViewModel() ==="
rg -n "koinViewModel\(\)" --type=kt app/src/main/java/com/konkuk/medicarecall/ui/
🤖 Prompt for AI Agents
In app/src/main/java/com/konkuk/medicarecall/App.kt around lines 32 to 38, only
homeModule and homeDetailModule are being registered with Koin which will cause
NoBeanDefFoundException at runtime for other migrated features (Calendar,
Glucose, Meal, Medicine, Sleep, Health, Mental) whose ViewModels/providers are
expected in Koin; update the startKoin modules(...) call to include all Koin
modules that define those feature ViewModels (or revert those screens to Hilt if
this PR is intentionally partial), by adding the missing module variables to the
modules list so every migrated ViewModel/service has a corresponding Koin module
registered at app startup.

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:

# First, let's understand the structure and find relevant files
find app/src/main/java/com/konkuk/medicarecall/data/di -type f -name "*.kt" 2>/dev/null | head -20

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 412


🏁 Script executed:

# Search for repository registration patterns in Koin modules
rg -n "single|factory|bind" app/src/main/java/com/konkuk/medicarecall/data/di/ --type=kt -A 2

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 105


🏁 Script executed:

# Check the ViewModel implementations to see their actual dependencies
rg -n "class.*ViewModel" app/src/main/java/com/konkuk/medicarecall/ --type=kt -A 5 | grep -E "class.*ViewModel|Repository"

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 105


🏁 Script executed:

# Look for repository registrations specifically
rg -n "Repository" app/src/main/java/com/konkuk/medicarecall/data/di/ --type=kt

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 105


🏁 Script executed:

# Read the RepositoryModule.kt to see what repositories are registered
cat app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 6443


🏁 Script executed:

# Read HomeDetailModule.kt to see the full context
cat app/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.kt

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 1217


🏁 Script executed:

# Search for repository registration patterns without type flag
rg -n "single.*Repository|factory.*Repository" app/src/main/java/com/konkuk/medicarecall/data/di/

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 61


🏁 Script executed:

# Find ViewModel class definitions and their constructors
rg -n "class.*ViewModel" app/src/main/java/com/konkuk/medicarecall --context=3 | head -100

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 11256


🏁 Script executed:

# Read one of the ViewModel files completely to check for @HiltViewModel
cat app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.kt

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 3132


🏁 Script executed:

# Check HealthViewModel
cat app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.kt

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 1739


🏁 Script executed:

# Check another one
cat app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.kt

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 4231


🏁 Script executed:

# Check if there are any Koin configurations elsewhere
rg -n "startKoin|KoinApplication" app/src/main/java --context=3

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 1186


Koin과 Hilt 의존성 주입 프레임워크 혼용 문제 수정 필요

리포지토리들(GlucoseRepository, MealRepository, MedicineRepository, SleepRepository, HealthRepository, MentalRepository)은 RepositoryModule.kt에서 Hilt(@module, @BINDS)로 올바르게 등록되었습니다.

하지만 homeDetailModule의 ViewModel들은 Koin DSL로 등록되어 있으면서 동시에 @Inject 생성자를 사용하고 있습니다. 이는 두 개의 DI 프레임워크(Hilt와 Koin)를 섞어서 사용하는 것으로, Koin의 get() 호출이 Hilt에서 관리하는 리포지토리를 찾을 수 없어 런타임 오류를 발생시킬 수 있습니다.

프로젝트에서 단일 DI 프레임워크(Hilt 또는 Koin)로 통일하거나, 혼용할 경우 명시적인 구성이 필요합니다.

🤖 Prompt for AI Agents
In app/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.kt around
lines 12 to 49, the ViewModels are registered with Koin while their repositories
are provided by Hilt, causing mixed-DI runtime failures; to fix, remove this
Koin module and migrate these ViewModels to Hilt by annotating each ViewModel
with @HiltViewModel and using @Inject constructors (or alternatively provide
them from a Hilt @Module), ensuring all DI for repositories and ViewModels is
handled solely by Hilt so no Koin get() calls try to resolve Hilt-managed
bindings.

Comment on lines 9 to 21
val homeModule = module {

viewModel { (savedStateHandle: SavedStateHandle) ->
HomeViewModel(
eldersInfoRepository = get(),
homeRepository = get(),
eldersHealthInfoRepository = get(),
savedStateHandle = savedStateHandle
// 화면 재생성 및 프로세스 복구를 위해 elderId를 SavedStateHandle로 관리
// SavedStateHandle은 Android 전용으로 KMP 공용 대상이 아님
)
}
}
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

echo "=== 1. Repository 모듈들이 Koin에 등록되어 있는지 확인 ==="
find . -type f -name "*.kt" | xargs grep -l "di\|Module" | head -10
echo ""

echo "=== 2. DI 폴더에서 모든 모듈 파일 찾기 ==="
fd -e kt "Module" --path "*/di/*"
echo ""

echo "=== 3. HomeModule.kt의 전체 내용 ==="
cat -n app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt 2>/dev/null || echo "파일을 찾을 수 없습니다"
echo ""

echo "=== 4. Repository 관련 DI 모듈 검색 ==="
find . -path "*/di/*" -name "*.kt" -exec grep -l "Repository" {} \;

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 2287


🏁 Script executed:

#!/bin/bash

echo "=== 1. RepositoryModule.kt 내용 확인 ==="
cat -n app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt

echo -e "\n=== 2. HomeScreen.kt 파일 찾기 ==="
find . -name "HomeScreen.kt" -type f

echo -e "\n=== 3. HomeViewModel.kt 파일 찾기 ==="
find . -name "HomeViewModel.kt" -type f

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 7723


🏁 Script executed:

#!/bin/bash

echo "=== 1. HomeScreen.kt에서 viewModel 사용 확인 ==="
cat app/src/main/java/com/konkuk/medicarecall/ui/feature/home/screen/HomeScreen.kt

echo -e "\n=== 2. HomeViewModel.kt 생성자 확인 ==="
head -50 app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt

echo -e "\n=== 3. 앱의 DI 초기화 확인 (MainActivity 또는 Application) ==="
rg -n "koin|hilt|Hilt|Koin" app/src/main/java/com/konkuk/medicarecall/MainActivity.kt -A 3

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 24803


DI 프레임워크 혼용으로 인한 의존성 주입 충돌 발생 위험

현재 코드에서 Hilt와 Koin이 혼용되어 있어 런타임 크래시가 발생할 수 있습니다:

  • HomeModule은 Koin 컨테이너에서 get()으로 repository 찾으려 함
  • 하지만 3개 repository(EldersInfoRepository, HomeRepository, EldersHealthInfoRepository)는 모두 Hilt 컨테이너에만 등록됨 (RepositoryModule.kt @BINDS)
  • HomeViewModel은 @Inject 생성자로 Hilt 의존성 주입을 기대함
  • HomeScreen에서는 **koinViewModel()**로 Koin에서 주입받으려 함

이는 앱 실행 시 NoSuchElementException 또는 BeanDefinitionException을 발생시킵니다.

해결책: 다음 중 하나 선택

  1. Hilt로 통일 (권장): HomeModule 제거, RepositoryModule처럼 @Module/@BINDS로 HomeViewModel 등록, HomeScreen에서 hiltViewModel() 사용
  2. Koin으로 통일: Hilt 제거, RepositoryModule을 Koin 모듈로 마이그레이션, 모든 DI를 Koin으로 관리
🤖 Prompt for AI Agents
In app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt around lines
9-21, the Koin-based HomeModule is creating HomeViewModel with get() calls while
the three repositories and the ViewModel are registered with Hilt, causing DI
container mismatch and runtime crashes; fix by unifying DI: recommended — remove
this Koin HomeModule, add a Hilt @Module that provides/binds HomeViewModel (use
@HiltViewModel and @Inject constructor or @Binds if appropriate) and update
HomeScreen to use hiltViewModel(), or alternatively migrate the repository
bindings from Hilt into a Koin module and keep this Koin HomeModule so all
dependencies are provided by Koin.

Comment on lines 12 to 13

class CalendarViewModel @Inject constructor() : ViewModel() {
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

echo "=== 1. Searching for CalendarViewModel in Module files ==="
find . -name "*Module.kt" -type f | head -20

echo -e "\n=== 2. Searching for CalendarViewModel registration in all Kotlin files ==="
rg -n "CalendarViewModel" --type=kt -C 3 | head -100

echo -e "\n=== 3. Specifically searching for viewModel registration patterns ==="
rg -n "viewModel.*\{" --type=kt -A 2 | grep -A 2 "Calendar\|viewModel" | head -80

echo -e "\n=== 4. Checking for koinViewModel usage ==="
rg -n "koinViewModel" --type=kt -C 2 | head -100

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 772


🏁 Script executed:

#!/bin/bash

echo "=== 1. Search for CalendarViewModel in all files ==="
rg -n "CalendarViewModel" -C 3 | head -150

echo -e "\n=== 2. Search for koinViewModel usage ==="
rg -n "koinViewModel" -C 2 | head -100

echo -e "\n=== 3. Check HomeDetailModule.kt content ==="
cat -n app/src/main/java/com/konkuk/medicarecall/data/di/HomeDetailModule.kt 2>/dev/null || echo "File not found"

echo -e "\n=== 4. Check HomeModule.kt content ==="
cat -n app/src/main/java/com/konkuk/medicarecall/data/di/HomeModule.kt 2>/dev/null || echo "File not found"

echo -e "\n=== 5. Search for viewModel { pattern ==="
rg -n "viewModel\s*\{" -C 3 | head -100

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 29199


🏁 Script executed:

#!/bin/bash

echo "=== Searching for any other module files ==="
find . -name "*Module.kt" -type f | grep -v build

echo -e "\n=== Checking if CalendarViewModel is registered anywhere ==="
rg -n "CalendarViewModel" --type-list

echo -e "\n=== Looking for viewModel { " without specific type ==="
rg -n "viewModel\s*\{" -B 1 -A 3 | grep -C 3 "Calendar\|function\|=>"

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 1006


🏁 Script executed:

#!/bin/bash

echo "=== Checking ApiModule.kt ==="
cat app/src/main/java/com/konkuk/medicarecall/data/di/ApiModule.kt

echo -e "\n=== Checking NetworkModule.kt ==="
cat app/src/main/java/com/konkuk/medicarecall/data/di/NetworkModule.kt

echo -e "\n=== Checking RepositoryModule.kt ==="
head -50 app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt

echo -e "\n=== Final verification: grep for CalendarViewModel across all di files ==="
grep -r "CalendarViewModel" app/src/main/java/com/konkuk/medicarecall/data/di/ 2>/dev/null || echo "Not found in di folder"

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 11623


CalendarViewModel을 Koin 모듈에 등록해야 합니다.

CalendarViewModel이 HomeDetailModule이나 HomeModule에 등록되어 있지 않은데, MealDetailScreen, SleepDetailScreen, MedicineDetailScreen, StateHealthDetailScreen, StateMentalDetailScreen 등 여러 detail 화면에서 koinViewModel<CalendarViewModel>()로 주입받고 있습니다.

현재 상태로는 이 화면들이 열릴 때 런타임에 FactoryNotFoundException이 발생할 거예요. HomeDetailModule에 CalendarViewModel을 등록해 주면 됩니다.

🤖 Prompt for AI Agents
In
app/src/main/java/com/konkuk/medicarecall/ui/feature/calendar/viewmodel/CalendarViewModel.kt
around lines 12-13, CalendarViewModel is not registered with Koin but many
detail screens call koinViewModel<CalendarViewModel>(), which will cause
FactoryNotFoundException at runtime; fix by adding a view model registration for
CalendarViewModel in HomeDetailModule (or HomeModule) so Koin can provide it
(and ensure the module is loaded at app start).

@librawish808 librawish808 changed the title [Refactor] Home / HomeDetail Koin 전환 및 Hilt 의존 제거 #210 [Refactor] Home / HomeDetail / Calendar Koin 전환 및 Hilt 의존 제거 #210 Jan 2, 2026
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: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt (1)

23-27: 파이프라인 린트 오류 수정이 필요해요.

다른 ViewModel들과 마찬가지로 미사용 javax.inject.Inject import와 클래스 선언부 괄호 앞 공백 이슈가 있어요.

🔧 수정 제안
 import retrofit2.HttpException
-import javax.inject.Inject

 data class ElderInfo(val id: Int, val name: String, val phone: String?)

-class HomeViewModel (
+class HomeViewModel(
     private val eldersInfoRepository: EldersInfoRepository,
♻️ Duplicate comments (1)
app/src/main/java/com/konkuk/medicarecall/App.kt (1)

25-25: FcmRepository Koin 등록이 필요해요.

이전 리뷰에서 지적된 것처럼, FcmRepositoryby inject()로 주입되지만 RepositoryModule이 아직 Hilt 방식으로 되어 있어요. 런타임에 NoBeanDefFoundException이 발생할 거예요.

RepositoryModule을 Koin으로 전환하고 startKoin의 modules에 추가하거나, 이 PR 범위 외라면 FcmRepository 주입을 임시로 다른 방식으로 처리해야 해요.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cdb708e and 8ae01c2.

📒 Files selected for processing (10)
  • app/src/main/java/com/konkuk/medicarecall/App.kt
  • app/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.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
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/medicine/viewmodel/MedicineViewModel.kt
🧰 Additional context used
🪛 GitHub Actions: Android CI
app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.kt

[error] 14-14: SpacingAroundParens: Unexpected spacing before '('


[error] 12-12: NoUnusedImports: Unused import

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.kt

[error] 14-14: SpacingAroundParens: Unexpected spacing before '('

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.kt

[error] 16-16: NoUnusedImports: Unused import


[error] 18-18: SpacingAroundParens: Unexpected spacing before '('

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.kt

[error] 15-15: SpacingAroundParens: Unexpected spacing before '('


[error] 13-13: NoUnusedImports: Unused import

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/meal/viewmodel/MealViewModel.kt

[error] 13-13: NoUnusedImports: Unused import


[error] 15-15: SpacingAroundParens: Unexpected spacing before '('

app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt

[error] 27-27: SpacingAroundParens: Unexpected spacing before '('


[error] 23-23: NoUnusedImports: Unused import

🔇 Additional comments (5)
app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statemental/viewmodel/MentalViewModel.kt (1)

14-16: Hilt → Koin 마이그레이션 깔끔하게 완료!

Hilt 어노테이션 제거하고 일반 생성자로 전환한 것 잘 되었습니다. Koin 모듈에서 DI 처리가 이루어질 거예요.

app/src/main/java/com/konkuk/medicarecall/ui/feature/calendar/viewmodel/CalendarViewModel.kt (1)

11-11: LGTM!

Hilt 어노테이션 제거가 깔끔하게 되었고, CalendarModule.kt에서 Koin 모듈로 잘 등록되어 있어요. 이전 리뷰에서 지적된 이슈가 해결되었네요. 👍

app/src/main/java/com/konkuk/medicarecall/data/di/CalendarModule.kt (1)

1-12: LGTM!

CalendarViewModel을 위한 Koin 모듈이 잘 추가되었어요. 이전 리뷰에서 언급된 FactoryNotFoundException 문제가 해결됩니다. 👍

app/src/main/java/com/konkuk/medicarecall/App.kt (1)

32-39: calendarModule 추가 확인! 👍

이전 리뷰에서 누락되었던 calendarModule이 잘 추가되었어요. CalendarViewModel 관련 런타임 크래시 이슈가 해결됩니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt (1)

27-32: Hilt → Koin 전환 잘 되었어요!

eldersHealthInfoRepository 의존성 추가 및 Hilt 어노테이션 제거가 깔끔하게 되었고, HomeModule.kt에서 올바르게 주입되고 있네요.

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: 0

🧹 Nitpick comments (1)
app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt (1)

44-44: 중복된 로딩 상태를 정리하면 좋을 것 같아요.

Line 44의 isLoading 프로퍼티가 _homeUiStateisLoading 필드와 중복되는 것 같습니다. 코드 전반에서 _homeUiState.copy(isLoading = ...) 형태로 사용하고 있는데, Line 44의 별도 프로퍼티는 사용되지 않는 것으로 보입니다. 혹시 이전 리팩토링에서 남은 코드라면 제거하는 것이 코드 가독성에 도움이 될 것 같습니다.

🔎 제안하는 수정
-    var isLoading by mutableStateOf(true)
-
     fun callImmediate(
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8ae01c2 and 07e97c0.

📒 Files selected for processing (7)
  • 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
🚧 Files skipped from review as they are similar to previous changes (4)
  • app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/statehealth/viewmodel/HealthViewModel.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/statemental/viewmodel/MentalViewModel.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 (3)
app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/sleep/viewmodel/SleepViewModel.kt (1)

14-16: 깔끔하게 마이그레이션 완료했네요! 👍

Hilt 어노테이션이 완벽하게 제거되었고, 이전 리뷰에서 지적된 문제들도 모두 해결됐어요. Koin 모듈에 SleepViewModel이 제대로 등록되어 있고 (HomeDetailModule.kt), SleepDetailScreen에서도 koinViewModel()으로 잘 주입받고 있어요. 멋져요!

app/src/main/java/com/konkuk/medicarecall/ui/feature/home/viewmodel/HomeViewModel.kt (1)

26-31: SavedStateHandle의 Koin 설정이 이미 올바르게 구현되어 있습니다. 마이그레이션이 깔끔하게 완료됐네요.

HomeModule.kt에서 viewModel { (savedStateHandle: SavedStateHandle) -> 패턴으로 올바르게 처리되고 있으며, 모든 의존성이 적절하게 주입되고 있습니다. 특별한 추가 설정은 필요 없습니다.

app/src/main/java/com/konkuk/medicarecall/ui/feature/homedetail/glucoselevel/viewmodel/GlucoseViewModel.kt (1)

17-19: Hilt에서 Koin으로의 마이그레이션이 깔끔하게 완료되었습니다.

클래스 선언이 올바르게 정리되었고, 이전에 지적된 이슈들(미사용 import, 공백 문제)도 모두 해결되었습니다. HomeDetailModule에서 viewModel { GlucoseViewModel(get(),) }로 등록되고, GlucoseDetailScreen에서 koinViewModel()로 주입되는 부분까지 일관성 있게 연동되어 있습니다.

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: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HomeRepositoryImpl.kt (1)

20-23: 문자열 보간 오류 수정 필요

Line 22에서 $Int로 작성되어 있는데, 이는 $elderId의 오타로 보입니다. 현재는 "Int"라는 문자열이 로그에 출력됩니다.

🔎 수정 제안
             Log.d(
                 "httplog",
-                "전화 걸림, 어르신: $Int, 시간: $careCallOption",
+                "전화 걸림, 어르신: $elderId, 시간: $careCallOption",
             )
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HealthRepositoryImpl.kt (1)

11-19: Null 안전성 개선 필요

Line 17에서 symptomList!!로 강제 언래핑을 사용하고 있는데, Line 15에서는 orEmpty()로 null 처리를 하고 있습니다. symptomList가 null일 경우 NPE가 발생할 수 있습니다.

🔎 안전한 null 처리 제안
         runCatching {
             val response = healthService.getDailyHealth(elderId, date.toString())
             HealthUiState(
                 symptoms = response.symptomList.orEmpty(),
                 symptomAnalysis = response.analysisComment.orEmpty(),
-                isRecorded = response.symptomList!!.isNotEmpty() || !response.analysisComment.isNullOrBlank(),
+                isRecorded = !response.symptomList.isNullOrEmpty() || !response.analysisComment.isNullOrBlank(),
             )
         }
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 07e97c0 and 8c7d07c.

📒 Files selected for processing (7)
  • 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/SleepRepositoryImpl.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 (6)
app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MentalRepositoryImpl.kt (1)

11-13: Koin 마이그레이션 반영 완료

생성자에서 @Inject 어노테이션이 제거되었습니다. Koin 기반 DI로의 전환이 올바르게 적용되었습니다.

app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/MedicineRepositoryImpl.kt (1)

11-14: Koin 마이그레이션 반영 완료

생성자에서 @Inject 어노테이션이 제거되었으며, 두 개의 의존성이 Koin을 통해 주입될 준비가 되었습니다.

app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HomeRepositoryImpl.kt (1)

10-12: Koin 마이그레이션 반영 완료

생성자에서 @Inject 어노테이션이 제거되었습니다.

app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/SleepRepositoryImpl.kt (1)

15-17: Koin 마이그레이션 반영 완료

생성자에서 @Inject 어노테이션이 제거되었으며, Koin 기반 DI로 전환이 완료되었습니다.

app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/HealthRepositoryImpl.kt (1)

8-10: Koin 마이그레이션 반영 완료

생성자에서 @Inject 어노테이션이 제거되었습니다.

app/src/main/java/com/konkuk/medicarecall/data/repositoryimpl/GlucoseRepositoryImpl.kt (1)

8-10: GlucoseRepositoryImpl 생성자는 Hilt 프로젝트에서 올바르게 작성됨

@Inject 어노테이션 제거는 정상입니다. 이 프로젝트는 Hilt를 사용 중이며, RepositoryModule.kt에서 @Binds로 GlucoseRepositoryImpl이 이미 바인딩되어 있으므로 생성자 인젝션이 제대로 작동합니다.

Comment on lines +8 to 10
class MealRepositoryImpl(
private val mealService: MealService,
) : MealRepository {
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
# Search for Koin module definitions and MealRepositoryImpl/MealRepository registration

echo "=== Searching for Koin modules with MealRepositoryImpl/MealRepository ==="
rg -n 'MealRepositoryImpl|MealRepository' --type=kt -g '*Module.kt' -A3 -B3

echo ""
echo "=== Searching for all Koin module files ==="
fd -e 'kt' -p '.*Module\.kt$'

echo ""
echo "=== Searching for Koin 'module' function or Di setup ==="
rg -n 'fun.*module|val.*module' --type=kt -l | head -20

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 728


🏁 Script executed:

#!/bin/bash
# Check RepositoryModule.kt for MealRepository registration

echo "=== Contents of RepositoryModule.kt ==="
cat -n app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt

echo ""
echo "=== Searching for MealRepository in all files (broader search) ==="
rg 'MealRepository' -i --type=kotlin

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 8933


🏁 Script executed:

#!/bin/bash
# Double-check what DI framework is being used - look for Koin vs Hilt in imports and dependencies

echo "=== Check RepositoryModule.kt imports ==="
head -n 51 app/src/main/java/com/konkuk/medicarecall/data/di/RepositoryModule.kt | grep -E '(import|dagger|koin)'

echo ""
echo "=== Check if any Koin modules exist ==="
rg 'org\.koin' --type kotlin -l

Repository: Medicare-Call/Medicare-Call-Android

Length of output: 4359


RepositoryModule이 아직도 Hilt를 사용 중입니다. 마이그레이션이 미완료 상태입니다.

@Inject 제거는 Koin으로 전환하려는 의도로 보이지만, RepositoryModule.kt에서는 여전히 Hilt의 @Module, @InstallIn, @Binds 등의 어노테이션을 사용하고 있습니다(lines 47-51, 117-119). 이 경우:

  • Option A: RepositoryModule.kt를 Koin으로 마이그레이션하면서 MealRepositoryImpl의 변경사항 유지
  • Option B: Hilt를 계속 사용하려면 MealRepositoryImpl@Inject 어노테이션 복원 필요

현재 상태는 두 프레임워크가 섞여있어 일관성이 없습니다.

Comment on lines 16 to 17
// 화면 재생성 및 프로세스 복구를 위해 elderId를 SavedStateHandle로 관리
// SavedStateHandle은 Android 전용으로 KMP 공용 대상이 아님
Copy link
Contributor

Choose a reason for hiding this comment

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

이 부분 주석 제거하면 좋을 것 같습니다!

Copy link
Collaborator

@alswlekk alswlekk left a comment

Choose a reason for hiding this comment

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

LGTM

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.

[Refactor] KMP 전환을 위한 Hilt -> Koin 마이그레이션

4 participants