[Java] 의존관계 주입(Dependency Injection)

조태산·2023년 8월 24일
0

DI란??

dependency Injection의 약자, 의존 관계 주입

"A가 B를 의존한다."
-> 의존대상 B가 변하면, 그것이 A에 영향을 미친다.

햄버거 가게 예시

class BurgerChef {
    private HamBurgerRecipe hamBurgerRecipe;

    public BurgerChef() {
        hamBurgerRecipe = new HamBurgerRecipe();        
    }
}

위의 코드에서 "요리사는 레시피에 의존한다" 라고 할 수 있다.


의존관계를 인터페이스로 추상화

위의 예시에서는 HamBugerRecipe만을 의존할 수 있는 구조로 돼있다. 다양하게 의존관계를 형성하려면 인터페이스 추상화가 필요
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();
    }
    // ...
}

의존관계를 인터페이스로 추상화하게 되면, 구현 클래스간 관계가 느슨해지고, 결합도가 낮아짐 (유연해진다.)


DI 구현방법

  • 생성자를 이용
class BurgerChef {
    private BurgerRecipe burgerRecipe;

    public BurgerChef(BurgerRecipe burgerRecipe) {
        this.burgerRecipe = burgerRecipe;
    }
}

class BurgerRestaurantOwner {
    private BurgerChef burgerChef = new BurgerChef(new HamburgerRecipe());

    public void changeMenu() {
        burgerChef = new BurgerChef(new CheeseBurgerRecipe());
    }
}
  • 메서드를 이용(대표적으로 Setter)
class BurgerChef {
    private BurgerRecipe burgerRecipe = new HamburgerRecipe();

    public void setBurgerRecipe(BurgerRecipe burgerRecipe) {
        this.burgerRecipe = burgerRecipe;
    }
}

class BurgerRestaurantOwner {
    private BurgerChef burgerChef = new BurgerChef();

    public void changeMenu() {
        burgerChef.setBurgerRecipe(new CheeseBurgerRecipe());
    }
}

출처 :
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

profile
만년개발초보

0개의 댓글