본문 바로가기

Android

DI (Koin)을 이용한 의존성 주입

728x90

Koin

Koin을 이용한 의존성 주입에 대해 정리해보겠습니다.

 

Koin을 사용해 의존성 주입을 받기위해선, 모듈 선언, 모듈 등록 작업이 필요합니다.

 

1. Koin 빌드 종속 항목을 추가

App 수준의 build.gradle 파일의 dependencies 블록에 아래와 같이 추가합니다.

 

    def koin_version = "2.1.5"
    
    // Android/Kotlin 애플리케이션을 작성하고 Koin을 사용해 구성 요소를 주입하고 검색
    implementation "org.koin:koin-android:$koin_version"
	// 코인 안드로이드 스코프 기능
    implementation "org.koin:koin-android-scope:$koin_version"
    // koin을 사용하여 ViewModel 구성 요소를 주입하고 검색
    implementation "org.koin:koin-android-viewmodel:$koin_version"
    // 코인 안드로이드 실험 기능
    implementation "org.koin:koin-android-ext:$koin_version"

 

1. 모듈 선언

Kotlin 파일을 생성한 후 아래와 같이 작성하면 되는데, 아래 코드에 대해 살펴보겠습니다.

 

 - applicationContext : application 정보 가져오기(app 수준의 context) 

- factory : 요청할 때마다 인스턴스 생성

 - single : 싱글톤 생성

 - viewModel : viewModel을 생성

val appModule = module {

    /**
     * CoroutineDispatcher
     */
    single<CoroutineDispatcher>(named("main")) { Dispatchers.Main }
    single<CoroutineDispatcher>(named("io")) { Dispatchers.IO }

    /**
     * ViewModel
     */
    viewModel { HomeViewModel() }
    viewModel { MyViewModel() }
    viewModel { ReviewViewModel() }

    viewModel { (todoCategory : TodoCategory) -> TodoCategoryViewModel(todoCategory) }

    /**
     * Repository
     */
    single<TodoRepository> { TodoRepositoryImpl() }

    /**
     * Database
     */
    single<TodoDatabase> { provideDB(androidApplication()) }
    single<TodoDao> { provideTodoDao(get()) }
}

private fun provideDB(context : Context) : TodoDatabase =
    Room.databaseBuilder(context, TodoDatabase::class.java, TodoDatabase.DB_NAME).build()

private fun provideTodoDao(database: TodoDatabase) = database.todoDao()

 

2. 모듈 등록

Koin에 등록할 모듈을 선언했으니, 이제 등록해보겠습니다. 등록을 위해선 Application Class의 onCreate() LifeCycle에서 startKoin을 호출하고 선언한 모듈 변수를 넘겨주어야하며, AndroidMenifext.xml에 해당 Class를 등록해야합니다.

 

 - androidLogger() : Koin 활동(할당, 조회 등)을 기록하는 간단한 Logging Api가 있으며,                                                  AndroidLogger를 Koin logger로 사용합니다.

 

 - androidContext() : 안드로이드 Context 주입합니다.

 

 - modules() : 사용할 모듈을 등록합니다.

 

Koin을 이용해 ApplicationContext를 주입받을 수 있지만, 아래처럼 appContext을 이용해 사용하는 방법도 있습니다.

class App : Application() {

    override fun onCreate() {
        super.onCreate()
        appContext = this

        startKoin {
            androidLogger(Level.ERROR)
            androidContext(this@App)
            modules(appModule)
        }
    }

    /**
     * App 종료 시 : appContext가 null이 되도록 설정
     */
    override fun onTerminate() {
        super.onTerminate()
        appContext = null
    }

    companion object {
        var appContext : Context? = null
            private set
    }
}
 <application
        android:name=".App"	// Application Class를 추가
                      ...
        android:theme="@style/xxxx">
        <activity android:name=".xxxxxxxx">
            ...
        </activity>
    </application>