Koin이란
Kotlin으로 DI를 공부하면서 가장 먼저 접하는 라이브러리는 Kotlin DSL로 만들어진 Koin이다. Kotlin DSL로 만들어졌다보니 Kotlin에 익숙한 개발자라면 사용하기 어렵지 않으며, Koin은 Dagger에 비해 구성요소가 복잡하지 않아서 Koin을 배우는 것은 러닝 커브가 낮다고 한다.
하지만 Koin은 리플렉션을 이용해 런타임에 오브젝트 그래프를 그려주다보니(=의존성 주입을 하다보니) 앱 성능이 저하된다는 단점이 있다. 따라서, 큰 규모의 프로젝트에서 Koin을 사용할 경우 Application이 시작될 때 의존성 그래프가 그려지다 보니 화면이 멈춘것처럼 될 수 있다. 따라서 큰 규모의 프로젝트에서는 컴파일 타임에 의존성 그래프를 그려주는 Dagger-Hilt을 이용해 의존성 주입을 하는 것이 좋다.
물론 annotation processor을 사용하는 Dagger-Hilt도 문제가 없는 것은 아니다. 대규모 프로젝트가 의존성이 컴파일 타임에 주입될 경우 컴파일 타임이 길어진다. 하지만, 런타임에 주입되어 사용자의 UX(User Experience)를 해치는 것보다는 컴파일 타임에 개발자가 조금 더 고생하는 것이 낫다.
Koin을 도입하기 추천하는 대상은 작은 규모의 프로젝트에 의존성 주입을 빠르게 적용시켜보고 싶은 개발자이다. 자 이제 어떻게 Koin을 사용하기 위한 환경을 세팅하는지 살펴보자.
개발 환경 설정
프로젝트 수준 gradle 파일에 koin의 version을 정의한 후, dependencies 블록에 classpath "io.insert-koin:koin-gradle-plugin:$koin_version 을 추가한다. mavenCentral로 바뀌면서 io.insert-koin 로 경로가 바뀌었다.
buildscript와 allproject 블록 repository에 mavenCentral()을 추가한다. 이전에는 jcenter()에서 가져왔는데 jcenter()이 deprecated되었다.
buildscript {
..
ext.koin_version = "3.0.2"
repositories {
..
mavenCentral()
}
dependencies {
..
classpath "io.insert-koin:koin-gradle-plugin:$koin_version"
}
}
allprojects {
repositories {
..
mavenCentral()
}
}
모듈 수준의 gradle의 dependencies 블록에 koin 라이브러리를 추가한다.
dependencies {
implementation "io.insert-koin:koin-android:$koin_version"
..
}
koin 라이브러리는 사용에 맞게 여러가지가 있다. 위의 라이브러리는 안드로이드용 koin 라이브러리다. 실습을 위해서 추가한 것이므로, 테스팅용 라이브러리는 추가하지 않았다.
테스팅용 라이브러리나 다른 플랫폼용 Koin라이브러리는 아래 글을 참고하여 dependencies에 추가한다.
https://insert-koin.io/docs/setup/v3/