본문 바로가기
Web/Spring Boot

[Spring] DI (Dependency Injection)

by foreverever 2019. 6. 24.
반응형

DI(Dependency Injection)

1. 객체 의존성

  • A객체가 B객체를 참조하고 있다면, A객체는 B객체에 의존하고 있다 (의존성을 가진다).

다음 코드의 문제점은?

public class Customer {
    private Food food;

    public Customer() {
        this.food = new Pizza("치즈 피자");
    }

    public void eat() {
        System.out.println("냠냠");
        food.showRemainder();
    }
}

Customer 객체는 Food 객체(Pizza)에 의존한다. (new Pizza("치즈 피자"))
이럴 경우, Food 객체를 변경할 경우 의존한 Customer 객체도 변경해야한다.
즉, 하나의 클래스가 바뀌면 의존한 다른 클래스까지 변경해야 하는 불편함이 발생.
이는, Unit Test의 작성도 어려워짐.

2. 의존성 주입(DI)

  • 디자인 패턴
  • 의존성을 제거하기 위해 사용

위의 코드를 DI를 이용해서 다시 작성해보자.

public class Customer {
    private Food food;

    public Customer(Food food) {
        this.food = food;
    }

    public Food getFood() {
        return food;
    }

    public void setFood(Food food) {
        this.food = food;
    }

    public void eat() {
        System.out.println("냠냠");
        food.showRemainder();
    }
}
public class Main {
    public static void main(String[] args) {
        Food pizza = new Pizza("치즈 피자");
        Customer lime = new Customer(pizza);    //생성자를 이용한 DI
        lime.eat();

        Food hamburger = new Hamburger("불고기 햄버거");
        lime.setFood(hamburger);    //setter를 이용한 DI
        lime.eat();
    }
}

3. DI 장점

1. 코드가 단순해진다.
2. 컴포넌트(객체) 간의 결합도가 낮아진다.
3. 유지보수가 용이

4. DI의 유형

1. Setter Injection : Setter 메서드를 이용한 의존성 주입
2. Construction Injection : 생성자를 이용한 의존성 주입
3. Method Injection : 일반 메서드를 이용한 의존성 주입
반응형

'Web > Spring Boot' 카테고리의 다른 글

@EventListener & @PostConstruct  (0) 2022.06.09
[Spring] @RestControllerAdvice  (0) 2019.07.16
[Spring] AOP  (0) 2019.06.26
[Spring] Logback 사용법(gradle)  (0) 2019.06.18
[Spring] IoC/DI  (1) 2019.04.21