Android

[Android] Koin을 활용하여 DI 적용해보기

mygomii 2025. 3. 13. 09:00
반응형
  • Koin은 Kotlin으로 작성된 경량 의존성 주입(Dependency Injection, DI) 프레임워크
  • Koin은 컴파일 타임 코드 생성 없이 순수 Kotlin DSL을 사용하여 DI 설정을 구성
  • 런타임에 필요한 의존성을 주입

Module

  • 모듈을 의존성(객체, 서비스 등)을 정의하는 단위
  • 모듈 안에 single ,factory , scoped 등의 DSL 함수를 사용하여 객체의 생명주기를 지정
    • single : 애플리케이션 전체에서 하나의 인스턴스를 공유
    • factory : 의존성을 요청될 때마다 새로운 인스턴스를 생성
    • scoped : 특정 범위 내에서만 인스턴스 공유

Scope

  • 스코프는 특정 라이프사이클과 연관된 의존성을 관리
  • 안드로이드에서는 Activtiy, Fragment 의 생명주기에 맞춰 스코프를 설정할 수 있어 메모리 누수를 방지, 리소스를 효율적으로 관리할 수 있음
  • 의존성 주입
    • Koin은 생성자 주입을 기본으로 하고, 필요한 경우 property injection도 지원
    • 주입받을 객체는 get() , inject() 함수를 사용

안드로이드에 적용해보자

  • gradle version 관리
// libs.versions.toml 

[versions]
koin = "3.5.3"

[libraries]
koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin" }
koin-core = { module = "io.insert-koin:koin-core" }
koin-android = { module = "io.insert-koin:koin-android"}
koin-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" }

  • gradle 설정
// build.gradle.kts
dependencies {
...
    implementation(platform(libs.koin.bom))
    implementation(libs.koin.android)
    implementation(libs.koin.core)
    implementation(libs.koin.compose)
    
}

모듈 정의

  • datasourceModule , serviceModule , domainModule , networkModule , repositoryModule
  • 아래 코드 처럼 모듈별로 설정해주었음
// RepositoryModule.kt
val repositoryModule = module {
    single<NoticeRepository> { NoticeRepositoryImpl(noticeDataSource = get()) }
}
  • Application 시작 점에서 Koin 시작
  • 아래 코드처럼 startKoin 안의 modules 안에 주입할 module을 설정해줌
fun appModule() = listOf(
    networkModule,
    serviceModule,
    dataSourceModule,
    repositoryModule,
    domainModule,
    viewModelModule
)
class KoinApp : Application() {
    override fun onCreate() {
        super.onCreate()

        startKoin {
            androidContext(this@KoinApp)
            androidLogger()
            modules(
                appModule()
            )
        }
    }
}

위처럼 작성하면 끝!


  • compose에서 viewModel을 주입하는 방법
  • 아래처럼  koinViewModel 키워드를 사용해도 되고 아니면 여러가지 방법이 있으니, 상황에 맞게 찾아서 쓰자
@Composable
fun NoticeList(viewModel: MainViewModel = koinViewModel()) {

}

https://github.com/mygomii/koin-clean-architecture-sample.git

 

GitHub - mygomii/koin-clean-architecture-sample

Contribute to mygomii/koin-clean-architecture-sample development by creating an account on GitHub.

github.com

 

https://insert-koin.io/docs/reference/koin-android/get-instances

 

Injecting in Android | Koin

Once you have declared some modules, and you have started Koin, how can you retrieve your instances in your

insert-koin.io

 

반응형