1 minute read

  • 공식 문서 링크

  • Koin : DI를 위한 라이브러리 (Dagger대체 가능)

  • 프로젝트에 추가하기

//  Project level
allprojects {
    repositories {
        jcenter()
    }
}
//  app level
dependencies {
    // Koin for Kotlin
    implementation "org.koin:koin-core:$koin_version"
    // Koin extended & experimental features
    implementation "org.koin:koin-core-ext:$koin_version"
    // Koin for Unit tests
    testImplementation "org.koin:koin-test:$koin_version"
    // Koin for Java developers
    implementation "org.koin:koin-java:$koin_version"

    // Koin for Android
    implementation "org.koin:koin-android:$koin_version"
    // Koin Android Scope features
    implementation "org.koin:koin-android-scope:$koin_version"
    // Koin Android ViewModel features
    implementation "org.koin:koin-android-viewmodel:$koin_version"
    // Koin Android Experimental features
    implementation "org.koin:koin-android-ext:$koin_version"

    // Koin AndroidX Scope features
    implementation "org.koin:koin-androidx-scope:$koin_version"
    // Koin AndroidX ViewModel features
    implementation "org.koin:koin-androidx-viewmodel:$koin_version"
    // Koin AndroidX Experimental features
    implementation "org.koin:koin-androidx-ext:$koin_version"
}
  • DSL을 이용해 모듈 생성하기
// Given some classes 
class Controller(val service : BusinessService) 
class BusinessService() 

// just declare it
val myModule = module { 
  single { Controller(get()) } 
  single { BusinessService() } 
} 
  • Koin의 DSL
    1. applicationContext : Koin모듈 생성
    2. factory : inject()할 때 마다 인스턴스를 생성함.
    3. single : 싱글톤 인스턴스를 생성함.
    4. bind : 종속시킬 class나 interface를 주입
    5. get : 서로서로 필요한 인스턴스들 끼리 주입해 줌
  1. Koin 시작하기
class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        startKoin {
            // (Opt)use AndroidLogger as Koin Logger - default Level.INFO
            androidLogger()

            // use the Android context given there
            androidContext(this@MainApplication)

            // (Opt)load properties from assets/koin.properties file
            androidFileProperties()

            // module list
            modules(offlineWeatherApp)
        }
    }
}
  1. 주입받기
class MyActivity : AppCompatActivity(){

    // Inject Controller
    val controller : Controller by inject()

    override fun onCreate() {
        super.onCreate()

        // or directly retrieve instance
        val controller : Controller = get()
    }
}
  • Scope API 적용 : scope를 이용해 Activity나 Fragment의 라이프 사이클을 스코프로 사용할 수 있다.
    1. 스코프 적용
module {
    // declare a scope for DetailActivity
    scope(named<DetailActivity>)> {
        scoped<DetailContract.Presenter> { DetailPresenter(get(), get()) }
    }
}
  1. 스코프 적용된 컴포넌트 주입받기
class DetailActivity : AppCompatActivity(), DetailContract.View {

    // inject from current activity scope instance
    override val presenter: DetailContract.Presenter by currentScope.inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //...
    }
}
  • AAC의 ViewModel 사용하기 : Koin은 ViewModel을 위한 DSL을 제공한다. by viewModel/getViewModel()을 사용하여 inject한다. 여러 Fragment에서 공유하기 위한 by sharedViewModel/getSharedViewModel()도 있다.

Categories:

Updated: