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()); // "연결된 키보드= 한국산 키보드"
}
}