-"의존성"이란 어떤 대상이 참조하는 객체 또는 메서드를 의미한다.
class Engine
class Car {
val engine = Engine()
}
-"의존성 주입"이란 대상 객체에 의존성을 제공하는 기술을 의미한다.
class Engine
class Car {
val engine = Engine()
}
-위 코드에서 의존성을 없애는 방법
class Car (val engine : Engine) {
}
-의존성 주입이 가져다주는 장점
fun main(args:Array<String>) {
val gasolineCar = Car(GasolineEngine())
val dieselCar = Car(DieselEngine())
}
class Car(
val engine : Engine,
val wheels : Wheels,
val wiper : Wiper,
val battery : Battery
) {
// 위에어 의존성을 주입받아서 일일히 객체를 만들어 줄 필요 X
// 따라서 더 적은 소스 코드 사용이 가능하다.
}
class CarTest {
@Test
fun CarTest() {
val car = Car(SuccessEngine())
}
@Test
fun CarTest() {
val car = Car(FailEngine())
}
}
-Injector란 의존성을 클라이언트에게 제공하는 역할을 의미한다.
-보통 Injector를 통해서 의존성을 제공한다.
fun mian(args:Array<String>) {
val engine = Engine()
val car = Car(engine)
}
class Injector{
fun getEngine(){
return Engine()
}
}
fun mian(args:Array<String>) {
val engine1 = Injector().getEngine()
val engine2 = Injector().getEngine()
val car1 = Car(engine1)
val car2 = Car(engine2)
}
위 코드는 유사 Injector를 사용한 코드인데 , getEngine()을 호출해서 Engine 객체를 메인함수에서 사용 할 수 있게 도와준다.
그러나 Injector().getEngine()을 호출 할 때마다 반환되는 Engine()은 서로 다른 객체이다. 이렇게 생성하면 관리하기가 너무 불편하다.
class Injector{
val engine = Engine()
}
fun mian(args:Array<String>) {
val injector = Injector()
val engine1 = Injector().engine()
val engine2 = Injector().engine()
val car1 = Car(engine1)
val car2 = Car(engine2)
}
-Container
-Assembler
-Provider
-Factory
1.클래스간의 결합도가 낮아진다.(디커플링)
2.재사용성이 높아진다.
3.보일러플레이트가 감소한다.
4.테스트가 용이하다.
5.자원의 공유와 동시에 의존성 관리가 용이하다.