라이브러리는 도서관 아닌가요

DI 1 - 의존성 발생 지점은 new 본문

Java/DI

DI 1 - 의존성 발생 지점은 new

veryhi 2021. 12. 6. 15:29

 

 

가정: 노트북(클래스)에 키보드(클래스)를 연결한다고 하자.

 

의존성을 중심으로 나머지 코드는 무시하고 색이 칠해진 부분만 유심히 보면 된다.

 

* 에디터를 사용하지 않아서 코드에 오타가 있을 수 있습니다.

interface Keyboard{
     String getKeyboardBrand();
}
public class KoreaKeyboard implements Keyboard{
     public String getKeyboardBrand(){
         return = "한국산 키보드";
     }
}
public class AmericaKeyboard implements Keyboard{
     public String getKeyboardBrand(){
         return = "미국산 키보드";
     }
}
public class Laptop{
     Keyboard keyboard;

     public Laptop(){
         keyboard = new KoreaKeyboard(); // 클래스 내부에 직접 속성 주입
     }

     public String showInputBrand(){
         return "연결된 키보드= " + keyboard.getKeyboardBrand();
     }
}

해당 클래스가 클래스 로더에 의해 로드되고,

위의 new 부분에 의존성이 생긴다.

 

 


1. 순수 자바로 의존성 주입 - 생성자 사용

: 생성자의 파라미터로 받는다.

 

interface Keyboard{
     String getKeyboardBrand();
}
public class KoreaKeyboard implements Keyboard{
     public String getKeyboardBrand(){
         return = "한국산 키보드";
     }
}
public class AmericaKeyboard implements Keyboard{
     public String getKeyboardBrand(){
         return = "미국산 키보드";
     }
}
public class Laptop{
     Keyboard keyboard;

     public Laptop(Keyboard keyboard){
         this.keyboard = keyboard; // 생성자 인자로 받아 객체 주입
     }

     public String showInputBrand(){
         return "연결된 키보드= " + keyboard.getKeyboardBrand();
     }
}
public class Main{
     public static void main(String[] args){
          Keyboard aKeyboard = new KoreaKeyboard(); // 의존성 발생시키는 부분이 Laptop에서 Main으로 이동
          // Keyboard aKeyboard = new AmericaKeyboard();
          Laptop aLaptop = new Laptop(aKeyboard); // 주입

          System.out.println(aLaptop.showInputBrand()); // "연결된 키보드= 한국산 키보드"
     }
}

 

 

 


2. 순수 자바로 의존성 주입 - 설정자 메서드 setter 사용

: 속성 설정자 메서드를 사용한다. (setter)

 

interface Keyboard(){
     String getKeyboardBrand();
}
public class KoreaKeyboard implements Keyboard{
     public String getKeyboardBrand(){
         return = "한국산 키보드";
     }
}
public class AmericaKeyboard implements Keyboard{
     public String getKeyboardBrand(){
         return = "미국산 키보드";
     }
}
public class Laptop{
     Keyboard keyboard;

     public Keyboard getKeyboard(){
          return keyboard;
     }

     public void setKeyboard(Keyboard keyboard){
          this.keyboard = keyboard;
     }

     public String showInputBrand(){
         return "연결된 키보드= " + keyboard.getKeyboardBrand();
     }
}

→ 생성자가 사라지고, keyboard 속성에 대한 접근자 및 설정자 메서드가 생겼다. 보다 자바스러운 코드.

 

public class Main{
     public static void main(String[] args){
          Keyboard aKeyboard = new KoreaKeyboard();
          // Keyboard aKeyboard = new AmericaKeyboard();

          Laptop aLaptop = new Laptop(); 
          aLaptop.setKeyboard(aKeyboard); // 주입

          System.out.println(aLaptop.showInputBrand()); // "연결된 키보드= 한국산 키보드"
     }
}

 

 

Comments