
같은 기능을 양쪽으로 짜봤더니 클린 빌드가 6분 48초 vs 4분 12초. Koin이 38% 빨랐는데, 그래도 안 갈아탔습니다.
수치만 보면 갈아타는 게 답인데, ROI 계산을 한 바퀴 돌리고 나니 답이 달라지더라고요. 지난 한 달 동안 사이드 모듈 하나를 양쪽으로 풀로 짜서 같은 화면, 같은 의존성 그래프를 깔아두고 빌드 시간·APK·콜드 스타트를 다 찍어봤거든요. 그 과정에서 정리된 판단을 6년차 안드로이드 개발자 입장에서 풀어볼게요.
Hilt 멀티모듈 18개에서 빌드 시간이 도마에 오른 자리
작년 가을부터 모듈을 쪼개기 시작해서 올해 봄에 18개를 찍었습니다. 모듈 8개 시절 3분 20초였던 클린 빌드가 7분 10초까지 늘어났어요. KSP가 모듈마다 의존성 그래프를 다시 생성하는데, 저희 프로젝트에선 캐시 효율이 모듈 수에 비례해 떨어지더라고요.
더 큰 문제는 duplicate binding 충돌이었습니다. 한 인터페이스에 모듈별 구현체가 두 개 이상 붙는 자리에서 빌드가 죽었어요. 월 4~5회 정도였는데, @Qualifier 우회는 모듈마다 네이밍이 갈려서 PR 리뷰 시간만 늘어났습니다.
여기에 도메인 레이어를 iOS와 공유하자는 논의가 사내 슬랙에서 시작됐어요. JVM에 묶인 Hilt가 KMP 로드맵에 안 맞는다는 게, 그날부터 진짜 의사결정 변수로 올라온 셈입니다.

Koin Compiler Plugin 도입 후 "런타임 크래시" 통념이 깨진 대목
옛날 Koin을 기억하는 분들이 가장 먼저 묻는 게 "런타임에 죽는 거 아니에요?"인데요, 이건 단계를 좀 나눠서 봐야 해요. 2022년 Koin Annotations가 부분 컴파일 검증을 도입했고, 풀 그래프 안전망은 2026년 4월 Koin Compiler Plugin 1.0.0-RC1에서 들어왔어요. 아직 RC 단계라 프로덕션 채택은 분기 1~2개 더 보고 결정할 자리예요. 그래도 Hilt가 들고 있던 안전망과 거의 같은 수준까지 올라온 것으로 보입니다.
다만 DSL 자유도가 양날의 검이에요. single, factory, scoped를 모듈마다 다르게 등록하면 코드 추적 비용이 Hilt보다 더 들어갑니다. 컨벤션을 따로 안 잡으면 6개월 뒤 신규 입사자가 의존성 출처를 찾느라 한참 헤매게 되더라고요.
대신 KMP에서는 진짜 강합니다. commonMain에 모듈을 한 번 선언해두면 iOS·안드로이드가 동일한 DSL을 공유하고, koinViewModel() 하나로 ViewModel 주입까지 일관되게 풀립니다.

Hilt가 여전히 유리한 IDE 통합과 구조적 천장
이걸 빼놓으면 안 되는 게, 안드로이드 스튜디오(Android Studio)의 'Find Usages'와 의존성 그래프 시각화는 정말 강한 자산이에요. 신규 입사자한테 "이 ViewModel이 어디서 주입되는지 한 번 따라가봐" 하면 5분 안에 끝납니다. Koin DSL에선 같은 작업이 텍스트 검색으로 빠지는 일이 잦더라고요.
@HiltViewModel, @AndroidEntryPoint 같은 젯팩(Jetpack) 통합도 표준의 안정감을 줍니다. 구글이 직접 미는 라인이라 문서·예제·스택오버플로 답이 두텁다는 점도 무시 못 해요.
그래도 구조적 천장은 두 군데입니다. JVM 종속이라 KMP commonMain에 못 들어가고, 모듈이 늘어날수록 KSP 비용이 비선형으로 붙는 경우가 많지요. 18개에서 30개 모듈로 가는 길에 이 둘이 같이 터질 거라고 봅니다.
Hilt vs Koin 빌드·APK·콜드 스타트 실측 수치
벤치마크는 사이드 모듈 하나(화면 4개, 의존성 약 22개)를 양쪽으로 풀로 짜서 잡았습니다. 측정 환경은 M2 Pro, JDK 17, AGP 8.x 기준이었어요. AGP 9로 아직 안 올린 프로덕션 라인이라 의도적으로 8.x에 맞췄습니다.
- 클린 빌드: Hilt 6분 48초, Koin 4분 12초 — 약 38% 차이
- 증분 빌드: 양쪽 모두 12~18초 — 사실상 동일
- APK 크기: Koin이 약 340KB 작음
- 콜드 스타트: Hilt 412ms, Koin 419ms — 오차 범위
흥미로운 건 콜드 스타트였어요. "런타임은 Hilt가 빠르다"는 통념이 강한데, 측정해보면 거의 차이가 없습니다. Now in Android의 Koin 전환 사례(Kotzilla/Arnaud Giuliani)에서도 런타임 차이가 크게 보고된 건 없는 편이에요.
테스트 편의성은 갈렸어요. 단위 테스트 모듈 갈아끼우기는 Koin이 더 가벼웠고, 통합 테스트 그래프 사전 검증은 Hilt가 강했네요. 다만 Hilt는 테스트 빌드 자체에 KSP 비용이 또 붙는다는 점이 마이너스였습니다.
개인적으로는, 빌드 시간만 보면 갈아탈 만한 수치였지만 막상 통합 테스트 안정성 한 줄 때문에 마음이 다시 돌아왔어요. 18개 모듈을 일주일에 80번 빌드한다 쳐도, 그 차이가 마이그레이션 공수를 정당화하느냐는 또 다른 계산이었습니다.

안 갈아탔습니다, KMP 들어오는 분기에 다시 보기로 한 자리
계산을 해봤어요. (단축 시간 × 빌드 횟수 × 팀원 수) > 마이그레이션 공수가 나와야 갈아탈 가치가 있는데, 저희 팀은 아직 우변이 더 컸습니다. 신규 입사자 두 명의 익숙해지는 시간, DSL 컨벤션 정리, 6개월 공존 기간의 인지 부하까지 다 합치면 빌드 30분 단축으론 회수가 안 되는 경우가 많습니다.
진짜 임계점은 KMP가 확정되는 시점이라고 봅니다. iOS 공유가 결정 나는 순간 Hilt는 구조적으로 못 따라오니까, 그땐 ROI 계산이 한 방에 뒤집힙니다. 그래서 다음 분기 KMP 도입 미팅 직후로 이 글 다시 꺼낼 일정을 캘린더에 박아뒀어요.
두 갈래에서 굳이 하나를 고른다면, 저는 "지금은 Hilt를 유지하고 KMP 확정과 함께 Koin으로 한 번에 넘긴다"는 쪽을 잡았습니다. 양쪽을 6개월씩 공존시키는 과도기가 가장 비싸다고 봤거든요. 월요일 아침에 빌드 로그를 다시 펴보면, 저희 팀이 풀어야 할 진짜 문제는 빌드 시간이 아니라 모듈별로 어긋난 멀티바인딩 컨벤션이라는 게 보입니다. DI 도구를 바꿔야 풀리는 문제인지, 컨벤션 회의 두 시간이면 끝날 문제인지부터 가르는 게 먼저였어요.

'Android 개발 > 트러블슈팅' 카테고리의 다른 글
| 로컬 초록불, CI 빨간불 — Flaky 테스트 격리로 5주 만에 18.3%→2.1% 잡은 기록 (0) | 2026.07.03 |
|---|---|
| 안드로이드 ANR 해결, Play Console '메인 5초' 리포트만 보고 범인 찾은 자리 (0) | 2026.07.02 |
| Play가 16KB 페이지 크기를 요구합니다 — 네이티브 라이브러리 안 깨지게 맞춘 자리 (0) | 2026.07.01 |
| Android 17 Beta 4 메모리 한도와 ML-DSA — 6월 stable 한 달 전 본인 앱 깨지는 자리 (0) | 2026.05.26 |
| 안드로이드 17 QPR1 베타 2 픽셀에 깔고 5일, 우리 앱이 깨진 자리 3곳 (0) | 2026.05.21 |