DI = Dependency Injection
DIP = Dependency Inversion Principle
IOC = Inversion Of Control
메인 모듈이 직접 다른 하위 모듈에 대한 의존성을 주기보다는, 중간에 의존성 주입자(dependency injector)가 이 부분을 가로채, 메인 모듈이 '간접적'으로 의존성을 주입하는 방식
class Factory
상위 클래스인 Factory 클래스가 직접 Product와 Toy에 의존
변경과 확장이 어려우며, 새로운 제품이나 장난감 추가가 어려움
class Product {
public void manufacture() {
System.out.println("제품을 생산합니다.");
}
}
class Toy {
public void assemble() {
System.out.println("장난감을 조립합니다.");
}
}
class Factory {
private final Product product;
private final Toy toy;
public Factory(Product product, Toy toy) {
this.product = product;
this.toy = toy;
}
public void produce() {
product.manufacture();
toy.assemble();
}
}
위의 Factory class 예시에 DI를 적용 ( = DIP 원칙을 적용)
인터페이스인 Manufacturable 을 도입하여 의존성 주입을 적용
Factory 클래스는 Manufacturable 인터페이스에 의존, 제품 및 장난감 클래스는 Manufacturable 인터페이스를 구현
이로써 의존 관계가 역전, 새로운 제품이나 장난감을 쉽게 추가하거나 교체 가능, 의존적인 화살표가 역전됨 (DI를 하게 되면 의존관계역전원칙이 적용된다)
interface Manufacturable {
void manufacture();
}
class Product implements Manufacturable {
@Override
public void manufacture() {
System.out.println("제품을 생산합니다.");
}
}
class Toy implements Manufacturable {
@Override
public void manufacture() {
System.out.println("장난감을 조립합니다.");
}
}
class Factory {
private final List<Manufacturable> products;
public Factory(List<Manufacturable> products) {
this.products = products;
}
public void produce() {
products.forEach(Manufacturable::manufacture);
}
}