A가 B를 의존한다 ⇒ B가 변하면, A에 영향을 미친다.
B의 변경에 A가 변경하게 된다는 것은 유지보수 등 아주 불편하고 유지하기 힘들다.
여기 바리스타가 아메리카노를 만드는 코드가 있다.
큰 문제가 없어보이지만, 만약 여기서 카페라떼를 추가한다면? 카페라떼 뿐만아니라 앞으로 계속 다른 메뉴를 추가한다면?
매번 메뉴가 추가될 때 마다 코드를 수정해야하는 불편함이 있을 것이다. 아래의 코드 뿐만아니라 이 코드에 의존하는 다른 코드도 수정해야할 것이다.
class Barista {
final AmericanoRecipe recipe;
Barista(this.recipe);
void makeCoffee() {
print(recipe.info);
}
}
이를 어떻게 해결할 수 있을까?
// 구현체 (concrete)
class Barista {
final CoffeeRecipe recipe;
Barista(this.recipe);
void makeCoffee() {
print(recipe.info);
}
}
// 추상화 클래스
abstract class CoffeeRecipe {
String get info;
}
class AmericanoRecipe implements CoffeeRecipe {
@override
String get info => '2 espresso shot + water';
}
class CafeLatteRecipe implements CoffeeRecipe {
@override
String get info => '2 espresso shot + milk + water';
}
이렇게 커피를 어떻게 만드는 가에 대한 레시피는 코드에서 정하고 있다.
그런데 만약이 커피 제조법을 외부에서 정한다면? 예를 들어, 어떤 손님은 시럽을 추가하거나 우유, 토핑 등을 더 넣고 싶다고 한다.
이 때 의존성 주입을 사용하는 것이다.