피드로 돌아가기
뱅크샐러드 기술블로그Mobile
원문 읽기
뱅크샐러드 안드로이드 앱에서 Koin 걷어내고 Hilt로 마이그레이션하기
뱅크샐러드 안드로이드팀이 Koin을 Hilt로 마이그레이션해 컴파일 타임 의존성 검증으로 1500곳 이상의 런타임 크래시 제거
AI 요약
Context
뱅크샐러드 안드로이드 앱은 Koin을 사용했지만, koin.get() 함수로 인한 무분별한 의존성 주입으로 런타임 검증이 불가능했다. 실험 종료 후 코드 클린업 시 사용되지 않는 컴포넌트를 컴파일 타임에 감지할 수 없어 QA 범위를 벗어난 크래시가 빈번하게 발생했다. 수백 개를 넘는 화면으로 인해 메뉴얼 테스팅으로는 한계가 있었다.
Technical Solution
- Koin의 Service Locator 패턴에서 Hilt의 컴파일 타임 검증 방식으로 전환: KAPT(Kotlin Annotation Processing Tool)를 통해 빌드 시점에 의존성을 검증하고 DI Container를 생성
- 모듈 간 의존성 명시화: 각 컴포넌트에 @HiltAndroidApp, @Module, @Provides, @Bind 어노테이션을 적용해 주입 Entry Point를 코드에 반영
- 단계적 마이그레이션 전략 수행: 초기 PoC 수행 후 Base Code 작성, Dependency 그래프 도출, 모듈별 마이그레이션 순서 결정
- 109개 PR을 통해 30,000라인 이상의 코드 변경: 약 200개 클래스의 Hilt 의존성 코드를 수정해 올바른 Dependency Graph 구현
- 팀 전체를 마이그레이션에 참여: 작업 시트로 클래스·패키지 항목을 관리해 모든 안드로이드 멤버가 병렬로 문제 해결
Impact
1500곳 이상의 의존성 컨플릭트를 해결해 런타임 크래시 제거. 2개월 내 전체 마이그레이션 완료.
Key Takeaway
멀티모듈 환경에서 Service Locator 패턴을 사용하면 의존성 추적이 불가능해져 런타임 에러가 누적되므로, 프로젝트 초기 단계에서 컴파일 타임 검증이 가능한 DI 도구(Hilt, Dagger)를 도입하는 것이 기술 부채를 줄인다. 다만 동적 주입이 많은 환경에서는 도입 전 신중한 검토가 필요하다.
실천 포인트
Kotlin 멀티모듈 프로젝트에서 Service Locator 패턴의 DI 도구를 사용 중이라면, Hilt 마이그레이션 시 초기 PoC를 통해 런타임 주입 부분의 변경 가능성을 먼저 검증하고, 전체 모듈의 Dependency 그래프를 그려 마이그레이션 순서를 명확히 한 후 팀 전체가 병렬로 작업해야 기한 내 완료할 수 있다.