(Android/Hilt) Hilt vs Koin vs Dagger2 비교


1. 세 라이브러리 개요

  Dagger2 Hilt Koin
제작 Google (Square 기반) Google Kotlin 커뮤니티
방식 어노테이션 + 코드 생성 Dagger 위의 추상화 DSL + 런타임 해석
검증 시점 컴파일 타임 컴파일 타임 런타임
언어 Java/Kotlin Java/Kotlin (Android 전용) Kotlin 전용
멀티플랫폼(KMP) 불가 불가 가능

2. Dagger2 — 강력하지만 복잡

Component, Subcomponent, Module을 모두 직접 정의해야 합니다.

@Component(modules = [AppModule::class])
interface AppComponent {
    fun inject(activity: MainActivity)

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance context: Context): AppComponent
    }
}

// Application에서 직접 Component 생성/보관
class MyApp : Application() {
    val appComponent: AppComponent by lazy {
        DaggerAppComponent.factory().create(this)
    }
}

// Activity에서 직접 주입 호출
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        (application as MyApp).appComponent.inject(this)
        super.onCreate(savedInstanceState)
    }
}

3. Hilt — Dagger를 Android에 맞게 단순화

Android 생명주기별 Component를 미리 정의해두어 설정이 대폭 줄었습니다.

@HiltAndroidApp class MyApp : Application()

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var analytics: AnalyticsTracker
}

@HiltViewModel
class MainViewModel @Inject constructor(private val repo: UserRepository) : ViewModel()

4. Koin — 코드 생성 없는 Kotlin DSL

어노테이션 프로세서 없이 Kotlin 코드로 의존성을 선언합니다.

val appModule = module {
    single { Retrofit.Builder().baseUrl("...").build() }
    single<UserApi> { get<Retrofit>().create(UserApi::class.java) }
    single<UserRepository> { UserRepositoryImpl(get()) }
    viewModel { MainViewModel(get()) }
}

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidContext(this@MyApp)
            modules(appModule)
        }
    }
}

class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModel()  // 주입
}

Koin의 런타임 검증 대책: koinApplication { checkModules() } 테스트로 그래프 완전성을 검증해 위험을 줄일 수 있습니다.


5. 핵심 차이: 컴파일 타임 vs 런타임

Hilt/Dagger:  의존성 누락 → 빌드 실패 (배포 전에 발견)
Koin:         의존성 누락 → 앱 실행 중 크래시 (해당 화면 진입 시 발견)

대신 Koin은 빌드가 빠르고 코드가 단순합니다. 둘은 안전성 vs 단순성의 트레이드오프입니다.


6. 비교 요약

항목 Dagger2 Hilt Koin
학습 곡선 높음 중간 낮음
보일러플레이트 많음 적음 매우 적음
빌드 속도 느림 느림 빠름
안전성(컴파일 검증) O O X (런타임)
런타임 성능 최상 최상 양호
Jetpack 통합 수동 공식 지원 확장 라이브러리
KMP 지원 X X O

7. 선택 기준


8. 정리



Related Posts