Koin?
DI (= Dependency Injection) 라이브러리로 Dagger 와 같지만 학습 곡선이 낮은 편입니다.
A클래스에서 B클래스를 사용하는 경우 의존성을 갖는데 B 클래스가 변경되는 경우 B클래스를 사용하는 A 클래스에서도 코드를 수정해야 합니다. 뿐만아니라 B 클래스를 사용하는 모든 클래스에서 수정 해야하는 번거로움이 발생하는데 DI 라이브러리의 경우 코드를 직접 수정하지 않아도 적절한 의존성을 주입해 줍니다.
의존성 예제
class B{
{
...
class A{
var b = B()
}
위 예제는 클래스 A가 B에 의존성을 갖는다라고 얘기할 수 있습니다.
class B( var count : Int){
}
class A{
var b = B(5)
}
B클래스의 생성자 파라미터가 변경되면 의존성을 갖고 있는 A클래스의 코드도 그에 맞게 수정해야 해 코드의 유연성을 떨어뜨립니다.
코인 적용
버전등은 적용 당시 공식 GitHub를 참고해주세요.
gradle(project 레벨)
buildscript {
ext.koin_version = '2.1.6'
repositories {
jcenter()
}
dependencies {
classpath "org.koin:koin-gradle-plugin:$koin_version"
}
}
allprojects {
repositories {
jcenter()
}
}
apply plugin: 'koin'
gradle(app)
// Koin for Kotlin
implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-core-ext:$koin_version"
testImplementation "org.koin:koin-test:$koin_version"
// Koin AndroidX Scope features
implementation "org.koin:koin-androidx-scope:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "org.koin:koin-androidx-fragment:$koin_version"
implementation "org.koin:koin-androidx-ext:$koin_version"
// Koin for Android
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-android-scope:$koin_version"
implementation "org.koin:koin-android-viewmodel:$koin_version"
implementation "org.koin:koin-android-ext:$koin_version"
// Koin for Ktor Kotlin
implementation "org.koin:koin-ktor:$koin_version"
appModule.kt
val viewModelModule = module {
factory { AddViewModel() }
}
별도의 모듈 클래스를 만들어서 관리합니다. factory는 코인에서 제공하는 DSL 키워드중 하나입니다.
- module {} : 코인 모듈 생성
- factory {} : 항상 새로운 인스턴스 생성
- single {} : 싱클톤으로 인스턴스 생성
- get() : 필요한 컴포넌트를 주입받음
- named() : enum이나 string으로 한정자를 정의해줌
- bind : 지정된 컴포넌트 타입을 추가적으로 바인딩해줌
- getProperty() : 필요한 프로퍼티를 가져옴
application.kt
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@BaseApplication)
modules(viewModelModule)
}
}
별도의 어플리케이션 클래스에 위 코드를 작성하면 코인 사용 준비는 끝난 상태 입니다.
AddActivity.kt
private val addViewModel : AddViewModel by inject()
inject를 사용하면 선언된 타입으로 자동 참조 됩니다.
이렇게 코인을 사용하면 조금 더 유연하게(?) 코딩할 수 있습니다.
다소 부족한 예제는 실적용 후 추가하도록 하겠습니다.
'안드로이드 > 코틀린' 카테고리의 다른 글
페이스북 광고 sdk 적용 (12) | 2020.10.15 |
---|---|
[And/Kotlin] Numberpicker를 활용한 생년월일 선택 뷰 만들기 (0) | 2020.10.13 |
[Android]AlarmManager를 이용해 위젯을 업데이트 하자! (0) | 2020.08.08 |
kakao Adfit 적용 [ 인앱 배너 광고] (0) | 2020.07.17 |
[안드로이드/코틀린] 카메라와 갤러리에서 이미지 가져오기 (8) | 2020.05.02 |