의존성이란 ?
class BurgerChef {
private HamBurgerRecipe hamBurgerRecipe;
public BurgerChef() {
hamBurgerRecipe = new HamBurgerRecipe();
}
}
위와 같이 BurgerChef class를 실행할 때, HamBurgerRecipe class가 필요한 경우를
BurgerChef class가 HamBurgerRecipe에 의존성을 가지고 있다.(의존하고 있다.) 라고 합니다.
강한 의존성을 가질 경우,
class BurgerChef {
private BurgerRecipe burgerRecipe;
public BurgerChef() {
burgerRecipe = new HamBurgerRecipe();
//burgerRecipe = new CheeseBurgerRecipe();
//burgerRecipe = new ChickenBurgerRecipe();
}
}
interface BugerRecipe {
newBurger();
}
class HamBurgerRecipe implements BurgerRecipe {
public Burger newBurger() {
return new HamBerger();
}
// ...
}
의존 관계를 interface로 추상화 할 경우, HamBurgerRecipe
, CheesBurgerRecipe
, ChickenBurgerRecipe
등 다양한 의존 관계를 맺을 수 있고, 실제 구현 클래스와의 결합도가 낮아진다.
// 제3자(Boss)가 BurgerChef에게 CheeseBurgerRecipe(Dependency)를 Injection함
public class Boss {
private final BurgerChef chef = new BurgerChef(new CheeseBurgerRecipe);
}
제3자(다른 class)가 BurgerChef에게 어떤 BurgerRecipe를 사용할 것인지 정하는 것이다.
아래 3가지 조건을 충족하면 Dependency Injection이라 말한다.
@Service
public class BurgerChef {
private BurgerRecipe recipe;
@Autowired
public Service(BurgerRecipe recipe) {
this.recipe = recipe;
}
}
// DI
public class Boss {
private final BurgerChef chef = new BurgerChef(new CheeseBurgerRecipe);
}
사용하지 말것!
의존성이 줄어든다.
재사용성 높은 코드가 된다
테스트 하기 좋음
가독성이 좋아진다.