의존성: 어떤 대상이 참조하는 객체(또는 함수)
의존성 주입: 대상 객체(Client)에 의존성을 제공하는 기술
class Car {
val engine = Engine()
}
class Car(val engine: Engine) {
...
}
fun main() {
val gasolineCar = Car(GasolineEngine())
val electricCar = Car(ElectricEngine())
}
→ 의존성 주입을 통해 Car 클래스의 소스 코드를 변경하지 않고도 각각 다른 Car 클래스 객체들(가솔린차, 디젤차, 전기차 등..)을 만들 수 있다.
→ Car와 Engine 클래스 간 결합도를 느슨하게 만들어 준다.
의존성을 클라이언트에게 제공하는 역할
// 인젝터에서 하나의 엔진 인스턴스를 생성해 놓는다.
class Injector {
val engine = Engine()
}
// 인젝터에서 생성한 엔진의 의존성을 주입받아 사용하면
// 동일한 Engine 인스턴스를 참조해 자원 공유가 가능하다.
fun main() {
val injector = Injector()
val engineA = injector.engine
val engineB = injector.engine
val carA = Car(engineA)
val carB = car(engineB)
}
class Car(
// 각각의 객체의 역할 분리를 통한 단일 책임 원칙 준수
val engine: Engine,
val wheels: Wheels,
val wiper: Wiper,
) {
// 의존성 주입을 통한 소스 코드 감소
}
class CarTest {
@Text
fun `성공 케이스`() {
val goodCar = Car(FakeGoodEngine())
...
}
@Text
fun `실패 케이스`() {
val badCar = Car(FakeBadEngine())
...
}
}