본문 바로가기

안드로이드/코틀린

AAC koin 적용하기

반응형

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를 사용하면 선언된 타입으로 자동 참조 됩니다.

 

이렇게 코인을 사용하면 조금 더 유연하게(?) 코딩할 수 있습니다.

다소 부족한 예제는 실적용 후 추가하도록 하겠습니다.

 

 

 

 

반응형