https://mangkyu.tistory.com/150
https://esoongan.tistory.com/90
참고하자. DI에 대한 설명이 잘 이루어져있다.
Dependency 의존관계란 무엇인가?
토비의스프링에서는 다음과 같이 정리한다.
의존대상 B가 변하면, A에게 영향을 미친다.
-이일민, 토비의 스프링3.1, 에이콘(2012),p113
즉 B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이
A에 미치는 것이다.
Coffee를 내리는데 필요한 열을 가하는 Heater와 압력을 가하는 Pump을 인터페이스로 구현한다.
isHot()은 Heater가 뜨거운지 체크해주는 함수이다.
public interface Heater {
void on();
void off();
boolean isHot();
}
public interface Pump {
void pump();
}
Heater와 Pump를 사용해 커피를 내려주는 Coffee Maker 클래스 구현.
public class CoffeeMaker {
private final Heater heater;
private final Pump pump;
public CoffeeMaker(Heater heater, Pump pump){
this.heater = heater;
this.pump = pump;
}
public void brew(){
heater.on();
pump.pump();
System.out.println(" ===== coffee... ===== ");
heater.off();
}
}
A히터 와 A펌프 는 인터페이스 구현체 구현
public class A_Heater implements Heater {
boolean heating;
public void on() {
System.out.println("A_Heater! heating... .. . ");
this.heating = true;
}
public void off() { this.heating = false; }
public boolean isHot() { return heating; }
}
public class A_Pump implements Pump {
private final Heater heater;
public A_Pump(Heater heater) {
this.heater = heater;
}
public void pump() {
if (heater.isHot()) {
System.out.println("A_Pump => pumping ~");
}
}
}
public static void main(String[] args) {
Heater heater = new A_Heater();
Pump pump = new A_Pump(heater);
CoffeeMaker coffeeMaker = new CoffeeMaker(heater,pump);
coffeeMaker.brew();
}
커피를 내리기 위해서 CoffeeMake 객체 사용자가 A히터 라는 인터페이스 구현체와 A펌프 라는 구현체를 알아야 커피를 내릴 수 있다.
커피를 마시는 사람은 어떤 heater와 pump를 쓰는지 알고 싶어하지 않다.
DI는 CoffeeMaker 사용자가 의존성을 모르는 상태에서도 커피를 내릴 수 있도록 해준다. DI로 CoffeeMaker 사용자 대신에 의존성을 주입해주는 Injection이라는 클랫를 생성한다.
public class Injection {
public static Heater provideHeater(){
return new A_Heater();
}
public static Pump providePump(){
return new A_Pump(provideHeater());
}
public static CoffeeMaker provideCoffeeMaker(){
return new CoffeeMaker(provideHeater(),providePump());
}
}
Injection 클래슨느 DI 의존성 주입을 해주는 설정 파일이다. 설정 파일에서 Injection에서 인터페이스 구현체를 리턴해준다.
DI를 구현한 상태에서 CoffeeMaker 사용자는 어떻게 커피를 내리고 있을까?
CoffeeMaker coffeeMaker = new CoffeeMaker(Injection.provideHeater(),Injection.providePump());
coffeeMaker.brew();
Injection.provideCoffeeMake().brew();
Injection클래스에서 heater와 pump를 제공 받고 있다.
그러면 CoffeeMaker 사용자는 heater나 pump가 필요한지 모르는 상태로 커피를 내릴 수 있다.
A_Heater 말고 B_Heater를 사용해야하는 경우가 생길 때 DI가 구현된 코드에서 CoffeeMaker 관리자는 사용자에게 아무 얘기없이 Injection 설정만 B_Heater로 바꿔주면 된다.