Spring Practice
DI란? (Dependency Injection)
박은유
2024. 4. 10. 21:16
반응형
DI란 무엇인가요?
: DI는 의존성 주입을 의미하며, 객체가 필요로 하는 의존성을 외부에서 주입받는 디자인 패턴입니다.
예시를 들어보겠습니다.
DI 사용 X
public class Coffee {...}
public class Programmer {
private Coffee coffee = new Coffee();
public startProgramming(){
this.coffee.drink()
}
}
여기서 Programmer객체는 Coffee객체가 필요해서 Coffee객체를 생성했습니다.
Programmer객체는 Coffee객체에 의존하고 있다. 라고 설명할 수 있습니다.
만약, Coffee객체가 아닌 Cappuccino, Americano객체를 사용하고 싶다면 해당 코드는 수정해야 합니다.
결합도(coupling)이 높아지게 되어 코드의 재활용성등 문제가 많아집니다.
DI 사용
public class Coffee {...}
public class Cappuccino extends Coffee {...}
public class Americano extends Coffee {...}
public class Programmer {
private Coffee coffee;
public Programmer(Coffee coffee){
this.coffee = coffee
}
public startProgramming(){
this.coffee.drink()
}
}
이 코드를 보면 Programmer객체에 Coffee라는 객체를 "주입"해주는 것을 알 수 있습니다.
이렇게 함으로서 Programmer객체가 Cappuccino를 마시는 중이라면, Cappuccino객체를 Programmer에 넘겨주어 생성하면 됩니다. Americano를 마시고 싶다면 똑같이 하면 됩니다! 코드를 계속해서 재사용할 수 있게 되는 것이죠.
Q
- DI의 장점은 무엇인가요?
- DI를 구현하기 위해 어떤 방법들이 있고, 각각의 차이점은 무엇인가요?
- DI를 사용하면 어떻게 코드의 유지보수성과 테스트 용이성을 향상시킬 수 있나요?
- DI 컨테이너(container)의 역할은 무엇이며, 어떻게 동작하나요?
- 생성자 주입(Constructor Injection), 세터 주입(Setter Injection), 필드 주입(Field Injection)의 차이점과 각각의 장단점은 무엇인가요?
- DI 주입 방식을 선택할 때 어떤 요소들을 고려해야 하나요?
- DI를 적용한 시스템에서의 유연성과 확장성에 대해 설명해주세요.
- DI와 의존성 역전(Inversion of Control, IoC)의 관계는 무엇이며, 어떻게 서로 다른 개념인가요?
- DI를 사용할 때 발생할 수 있는 주요 문제점들은 무엇이 있으며, 이러한 문제들을 해결하기 위한 전략은 무엇인가요?
- DI를 적용한 프로젝트에서 발생한 경험을 공유하고, 그로 인해 얻은 교훈은 무엇인가요?
A
- DI의 장점은 코드의 유연성과 재사용성을 향상시키며, 주입된 의존성을 변경하기 쉽게 만듭니다.
- DI를 구현하는 방법으로는 생성자 주입, 세터 주입, 필드 주입 등이 있으며, 각각의 장단점이 있습니다.
- DI를 사용하면 코드의 결합도를 낮추어 유지보수성과 테스트 용이성을 향상시킬 수 있습니다.
- DI 컨테이너는 객체의 생명주기를 관리하고 의존성을 주입하는 역할을 합니다. 대표적으로 Spring Framework의 ApplicationContext가 DI 컨테이너의 예시입니다.
- 생성자 주입은 객체 생성 시점에 의존성을 주입하며, 세터 주입은 세터 메서드를 통해 주입하고, 필드 주입은 필드에 직접 주입합니다. 생성자 주입은 불변성을 보장하고, 필드 주입은 코드 가독성을 낮출 수 있습니다.
- DI 주입 방식을 선택할 때는 의존성의 복잡성, 테스트 용이성, 코드 가독성 등을 고려해야 합니다.
- DI를 적용한 시스템에서는 객체 간의 결합도가 낮아져 쉬운 유지보수와 확장이 가능해집니다.
- DI와 IoC는 서로 밀접한 관계를 가지고 있으나, DI는 의존성 주입에 초점을 두고 있는 반면 IoC는 제어의 역전 개념을 포함하고 있습니다.
- DI를 사용할 때 주의할 점은 순환 의존성, 너무 많은 의존성 주입, 테스트용 객체와 실제 객체의 분리 등이 있으며, 이를 해결하기 위해 인터페이스 추상화와 Mocking 등의 전략을 사용합니다.
- DI를 적용한 프로젝트에서는 코드의 유연성과 테스트 용이성을 경험했으며, 인터페이스와 의존성 주입을 통한 코드의 확장성을 깨달았습니다.
반응형