객체간의 의존성을 주입한다는 말이고,
객체 A와 B가 있을 때 한 B 객체를 다른 A 객체에서 사용하기 위해 연결을 시키겠다는 의미이다.
A 객체에서 B 객체를 사용하는 두 가지 방법이 있다.
첫 번째 방식은 A 객체 내부에서 B 객체를 직접 생성해서 사용하는 방식인데 만약 B 객체가 A 뿐만 아니라 다른 여러 곳에서도 사용이 된다면 그 때마다 해당 객체 안에서 B 객체를 생성해줘야 하는 번거러움이 있다. 또한 B 객체는 선언된 객체에 종속이 된다.
두 번째 방식은 B 객체를 외부에서 생성을 해놓고 B 객체를 사용할 곳에서 외부에서 생성된 B 객체를 바로 사용할 수 있게 하는 방식으로 의존성 주입이라고 말할 수 있다.
코드 작성시에 재사용성이 높으면 결합도가 낮으면 좋은 코드라고 할 수 있다.
결합도가 낮다는 것은 서로 간의 관련이 없다는 말로 한 쪽 코드를 수정할 때 다른 코드를 같이 수정할 필요가 없다는 말이다. 이처럼 코드 간의 의존성을 줄이기 위해 의존성 주입을 위한 여러 라이브러리들이 개발되고 있다.
코틀린에서 사용 가능한 의존성 주입을 간편하게 해주는 라이브러리이다.
사용 방법은 정말 간단하다. 공식 사이트에서 알려주는대로 한다면 문제없이 설정이 가능할 것이다.
💡 koin 세팅 방법 공식 문서입니다.
https://insert-koin.io
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"
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() }
}
}
class MyApplication : Application(){
override fun onCreate() {
super.onCreate()
// Start Koin
startKoin{
androidLogger()
androidContext(this@MyApplication)
modules(
RepositoryModule.module,
ViewModelModule.module
)
}
}
}
class MainRepository(
private val testRepository: TestRepository
) {
}
private val testRepository by inject<TestRepository>()