[Android] DI를 위한 Koin 라이브러리

Twaun·2022년 4월 10일
0

Android-Library

목록 보기
6/10

의존성 주입(Dependency Injection - DI)이 뭔가요?

객체간의 의존성을 주입한다는 말이고,
객체 A와 B가 있을 때 한 B 객체를 다른 A 객체에서 사용하기 위해 연결을 시키겠다는 의미이다.

A 객체에서 B 객체를 사용하는 두 가지 방법이 있다.

  1. A 객체 내부에서 B 객체를 생성하는 방식
  2. 외부에서 B 객체를 생성해서 A 객체에 넘겨주는 방식

첫 번째 방식은 A 객체 내부에서 B 객체를 직접 생성해서 사용하는 방식인데 만약 B 객체가 A 뿐만 아니라 다른 여러 곳에서도 사용이 된다면 그 때마다 해당 객체 안에서 B 객체를 생성해줘야 하는 번거러움이 있다. 또한 B 객체는 선언된 객체에 종속이 된다.

두 번째 방식은 B 객체를 외부에서 생성을 해놓고 B 객체를 사용할 곳에서 외부에서 생성된 B 객체를 바로 사용할 수 있게 하는 방식으로 의존성 주입이라고 말할 수 있다.

코드 작성시에 재사용성이 높으면 결합도가 낮으면 좋은 코드라고 할 수 있다.
결합도가 낮다는 것은 서로 간의 관련이 없다는 말로 한 쪽 코드를 수정할 때 다른 코드를 같이 수정할 필요가 없다는 말이다. 이처럼 코드 간의 의존성을 줄이기 위해 의존성 주입을 위한 여러 라이브러리들이 개발되고 있다.

Koin이란?

코틀린에서 사용 가능한 의존성 주입을 간편하게 해주는 라이브러리이다.
사용 방법은 정말 간단하다. 공식 사이트에서 알려주는대로 한다면 문제없이 설정이 가능할 것이다.

💡 koin 세팅 방법 공식 문서입니다.
https://insert-koin.io

사용방법

1. Gradle 의존성 추가.

implementation "io.insert-koin:koin-android:$koin_version"
implementation "io.insert-koin:koin-android-compat:$koin_version"
implementation "io.insert-koin:koin-androidx-workmanager:$koin_version"

2. koin에 등록할 모듈 및 클래스 module 로 등록

class

object RepositoryModule : KoinModule {
    override val module = module {
        single { TestRepository() }
        single { MainRepository(get()) }
    }
}

등록시에 파라미터에 get() 을 적어주면 koin이 알아서 필요한 의존성을 주입해준다. (참 신기하다..)

viewModel

object ViewModelModule : KoinModule{
    override val module: Module
        get() = module {
            viewModel { TestActivityViewModel() }
        }
}

3. 앱 Application 에 onCreate 에서 startKoin

class MyApplication : Application(){
    override fun onCreate() {
        super.onCreate()
        // Start Koin
        startKoin{
            androidLogger()
            androidContext(this@MyApplication)
            modules(
                RepositoryModule.module,
                ViewModelModule.module
            )
        }
    }
}

4-1. 등록해놓은 모듈이나 클래스는 파라미터를 통해 의존성 주입이 가능하다.

class MainRepository(
    private val testRepository: TestRepository
) {
}

4-2. by inject 키워드를 사용해서도 액티비티나 프래그먼트에서 의존성 주입이 가능하다.

private val testRepository by inject<TestRepository>()
profile
Android Developer

0개의 댓글