Dependency Injection

의존관계란? (Dependency)

A가 B를 의존한다 ⇒ B가 변하면, A에 영향을 미친다.

B의 변경에 A가 변경하게 된다는 것은 유지보수 등 아주 불편하고 유지하기 힘들다.

여기 바리스타가 아메리카노를 만드는 코드가 있다.

큰 문제가 없어보이지만, 만약 여기서 카페라떼를 추가한다면? 카페라떼 뿐만아니라 앞으로 계속 다른 메뉴를 추가한다면?

매번 메뉴가 추가될 때 마다 코드를 수정해야하는 불편함이 있을 것이다. 아래의 코드 뿐만아니라 이 코드에 의존하는 다른 코드도 수정해야할 것이다.

class Barista {
  final AmericanoRecipe recipe;

  Barista(this.recipe);

  void makeCoffee() {
    print(recipe.info);
  }
}

이를 어떻게 해결할 수 있을까?

추상화 클래스 (Abstract class)

// 구현체 (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';
}

그래서 의존성 주입은 어떻게 한다고?

이렇게 커피를 어떻게 만드는 가에 대한 레시피는 코드에서 정하고 있다.

그런데 만약이 커피 제조법을 외부에서 정한다면? 예를 들어, 어떤 손님은 시럽을 추가하거나 우유, 토핑 등을 더 넣고 싶다고 한다.

이 때 의존성 주입을 사용하는 것이다.

그래서 왜 필요한거야?