DI(Dependency Injection). 의존성주입

이용만·2023년 3월 1일
0

https://mangkyu.tistory.com/150
https://esoongan.tistory.com/90

참고하자. DI에 대한 설명이 잘 이루어져있다.

Dependency 의존관계란 무엇인가?
토비의스프링에서는 다음과 같이 정리한다.

의존대상 B가 변하면, A에게 영향을 미친다.
-이일민, 토비의 스프링3.1, 에이콘(2012),p113

B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이
A에 미치는 것
이다.

간단한 예제로 알아보자

Coffee를 내리는데 필요한 열을 가하는 Heater와 압력을 가하는 Pump을 인터페이스로 구현한다.
isHot()은 Heater가 뜨거운지 체크해주는 함수이다.

public interface Heater {
   void on();
   void off();
   boolean isHot();
}
public interface Pump {
   void pump();
}

Heater와 Pump를 사용해 커피를 내려주는 Coffee Maker 클래스 구현.

public class CoffeeMaker {
   private final Heater heater;
   private final Pump pump;

   public CoffeeMaker(Heater heater, Pump pump){
       this.heater = heater;
       this.pump = pump;
  }

   public void brew(){
       heater.on();
       pump.pump();
       System.out.println(" ===== coffee... ===== ");
       heater.off();
  }
}

A히터 와 A펌프 는 인터페이스 구현체 구현

public class A_Heater implements Heater {
   boolean heating;
   public void on() {
       System.out.println("A_Heater! heating... .. . ");
       this.heating = true;
  }
   public void off() { this.heating = false; }
   public boolean isHot() { return heating; }
}
public class A_Pump implements Pump {
   private final Heater heater;
   public A_Pump(Heater heater) {
       this.heater = heater;
  }

   public void pump() {
       if (heater.isHot()) {
           System.out.println("A_Pump => pumping ~");
      }
  }
}

If DI를 사용하지 않으면

public static void main(String[] args) {
Heater heater = new A_Heater();
Pump pump = new A_Pump(heater);
CoffeeMaker coffeeMaker = new CoffeeMaker(heater,pump);
coffeeMaker.brew();
}

커피를 내리기 위해서 CoffeeMake 객체 사용자가 A히터 라는 인터페이스 구현체와 A펌프 라는 구현체를 알아야 커피를 내릴 수 있다.
커피를 마시는 사람은 어떤 heater와 pump를 쓰는지 알고 싶어하지 않다.

DI를 사용한다면

DI는 CoffeeMaker 사용자가 의존성을 모르는 상태에서도 커피를 내릴 수 있도록 해준다. DI로 CoffeeMaker 사용자 대신에 의존성을 주입해주는 Injection이라는 클랫를 생성한다.

public class Injection {
   public static Heater provideHeater(){
       return new A_Heater();
  }

   public static Pump providePump(){
       return new A_Pump(provideHeater());
  }

   public static CoffeeMaker provideCoffeeMaker(){
       return new CoffeeMaker(provideHeater(),providePump());
  }
   
}

Injection 클래슨느 DI 의존성 주입을 해주는 설정 파일이다. 설정 파일에서 Injection에서 인터페이스 구현체를 리턴해준다.

DI를 구현한 상태에서 CoffeeMaker 사용자는 어떻게 커피를 내리고 있을까?

CoffeeMaker coffeeMaker = new CoffeeMaker(Injection.provideHeater(),Injection.providePump());
coffeeMaker.brew();
Injection.provideCoffeeMake().brew();

Injection클래스에서 heater와 pump를 제공 받고 있다.
그러면 CoffeeMaker 사용자는 heater나 pump가 필요한지 모르는 상태로 커피를 내릴 수 있다.
A_Heater 말고 B_Heater를 사용해야하는 경우가 생길 때 DI가 구현된 코드에서 CoffeeMaker 관리자는 사용자에게 아무 얘기없이 Injection 설정만 B_Heater로 바꿔주면 된다.

코드스테이츠 키오스크 DI 정리

profile
성장하는 개발자가 되고자 합니다.

0개의 댓글