a. High-level modules should not depend on low-level modules. Both should depend on abstractions (e.g. interfaces). b. Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.
DIP 의 핵심은 추상화에 의존하라는 것이다.
일반적으로 의존성을 가지는 대상이 변경되면 의존하는 주체도 함께 변경된다.
추상화가 아닌 자주 바뀌는 구현 클래스(저수준)에 의존하게 된다면 코드 변경이 잦을 것이며 버그와 사이드이펙트의 확률 또한 높아진다. 일반적으로 잘 변하지 않는 특성을 가진 인터페이스나 추상클래스(고수준)에 의존한다면 상대적으로 안정적인 코드를 작성할 수 있게 된다.
결론적으로 Dependency Inversion Principle(의존성 역전 원칙)은 의존성을 항상 고수준으로 향하게 하여 예측할 수 없는 의존성의 변화를 줄이자는 원칙이다.
DI is about how one object acquires a dependency
DI 의존성 주입은 DIP 의존관계 역전법칙을 구현하는 방법 중 하나이다. DI 는 필요로 하는 객체를 스스로 생성하는 것이 아닌 외부로 부터 주입받는 기법을 의미한다.
코드의 재사용성, 유연성이 높아진다.
객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다.
유지보수가 쉬우며 테스트가 용이해진다.
확장성을 가진다.
책임이 분리되어 있기 때문에 클래스 개수를 늘림으로써 복잡성이 증가한다.
주입된 객체들에 관한 코드 추적이 어렵다.
초기 개발 노력이 필요하다.
의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높인다.