반응형
🧐 DI란❓
Dependency Injection의 줄임말이고, 한국어로는 의존성 주입이다. 그럼 의존성, 의존관계는 무엇일까?
🧐 의존성이란 ❓
B 객체가 변하면 A의 영향을 미치면, A가 B를 의존하고 있다고 말할 수 있다. B의 기능이 추가되거나 변경되거나 형식이 바뀐다면, 그 영향이 A로 전달된다는 의미이다.
public class AnimalHospital{
private AnimalType animal;
public AnimalHospital(){
this.animal = new Bird();
}
}
위 예를 보면, AnimalHospital 객체가 AnimalType 객체에 의존성을 가진다.
AnimalHospital 객체는 AnimalType을 생성자에서 직접 제어한다. 그렇기 때문에 두 객체간의 tight coupling(강한 결합)이 생긴다. 이 강한 결합은 OCP 객체 지향 원칙을 위반한다.
예를 들어, 병원이 Bird객체만 고치는 것이 아닌, Dog객체도 고치고 싶다면, 생성자에서 animalType을 Dog instance로 바꿔줘야 되기 때문이다. 이 처럼, 기능을 확장하려면 AnimalHospital 객체의 내부까지 고쳐야되기 때문에, 변화에 닫혀있지 않다.
🧐 그럼 의존성 주입은 ❓
위 예제에서는 AnimalHospital에서 어떤 AnimalType을 가질지 직접 정하고, 할당했다.
의존성 주입은 내부에서 의존관계를 결정하는 것이 아닌, 외부에서 의존관계를 결정하고 주입해주는 것이다.
이러면, 기능이 확장이 되더라도, 외부에서 객체를 주입해주기 때문에, AnimalHospital의 내부에서의 변화는 없어, OCP 객체 지향 원칙을 위반하지 않는다.
ex) 생성자 이용
public class AnimalHospital{
private AnimalType animal;
public AnimalHospital(AnimalType animalType){
this.animal = animalType;
}
}
class Doctor{
private AnimalHospital doctor = new AnimalHospital(new Bird());
public void changeAnimalType() {
doctor = new AnimalHospital(new Dog());
}
}
ex) 메소드 이용
public class AnimalHospital{
private AnimalType animal = new Bird();
public void setAnimalType(AnimalType animalType){
this.animal = animalType;
}
}
class Doctor{
private AnimalHospital doctor = new AnimalHospital();
public void changeAnimalType() {
doctor.setAnimalType(new Dog());
}
}
🧐 DI 장점은 ❓
- 의존성이 줄어든다.
- 의존한다는 것의 의미는 의존대상의 변화에 대응하기 어렵다. 대상이 변화한다면, 이에 맞게 수정을 해야한다. 의존성 주입을 받으면, 대상이 변하여도, 구현 자체를 수정할 일이 없거나 줄어들게된다!!
- OCP 객체 지향 원칙을 위반하지 않는다!!
- 재사용성이 높은 코드가 된다.
- AnimalHospital 내부에서만 사용된 AnimalType을 별도로 구분하여 구현하여, 다른 클래스에서도 재사용이 가능하다!!
- 테스트하기 좋은 코드가 된다.
- AnimalHospital과 AnimalType을 분리하여, 테스트를 진행할 수 있다. Unit Test가 가능해진다!!
Reference
반응형
'✍🏻study > 🚘oodp' 카테고리의 다른 글
이터레이터 패턴이란❓ (2) | 2022.09.13 |
---|---|
브릿지 패턴이란❓ (0) | 2022.08.29 |
Builder패턴, 그리고 Builder annotation는 뭘까🧐 (2) | 2022.03.15 |