객체 인스턴스의 생성을 직접하지 않고 (다른 곳에서 만들어져서) 필요한 곳에 전달되도록 코드를 조직화하는 기법
의존성을 클라이언트에게 제공하는 역할
예를 들어, 만약 아래와 같이 의존성을 클라이언트 안에서 직접 생성하는 경우라면
class Repository{
private val dataSource: DataSource = DataSourceA()
}
나중에 DataSourceA DataSourceB나 DataSourceC로 변경하고 싶을 때 클라이언트 Repository의 코드도 수정을 해줘야 한다.
하지만, 아래와 같이 의존성을 밖에서 주입받도록 변경한다면
class Repository(private val dataSource: DataSource){
}
DataSourceA가 변경되거나 삭제되어도 클라이언트 Repository 코드는 수정할 필요가 없어진다.
더욱 추상화, 멀티모듈에서 모듈별 의존성을 떼어내는데 유용
객체의 생성 방법을 설정에 따라 다르게 할 수 있다.
(프로덕션을 위한 구현을 테스트용으로 간단하게 전환 가능)
val container = Container(context)
container
.bind(Foo1::class, FooImpl1())
.bind(Foo2::class, FooImpl2())
.bind(Foo3::class, FooImpl3())
// in client
val foo = container.get(Foo1::class)
// in another place
val childContainer = Container(context.parent = container)
childContainer.bind(Bar::class, BarImpl())
val foo2 = childContainer.get(Foo2::class)
val bar = childContainer.get(Bar::class)
JSR-300 표준 프레임워크
안드로이드 전용은 아니므로 미지원 기능은 직접 구현해줘야할 필요가 있음(액티비티나 뷰모델 구성 등)
대거 안드로이드라는 라이브러리가 있긴 함
안드로이드를 위한 기능들이 다 갖춰져 있음
Hilt와 유사함