title: **"**DIP : The Dependency Inversion Principle**"**
description: "DIP : The Dependency Inversion Principle"
cleanUrl: /sw-engineer/dip
ogImage: "<https://anyflower.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F13714c73-ad23-40cf-a405-47163f6e61f5%2FUntitled.png?table=block&id=e9ac456b-48c0-46c6-af33-3587aa678e4f&spaceId=7570d2fc-66b1-4e23-bb3c-ff7b56842b0d&width=1000&userId=&cache=v2>"
floatFirstTOC: right
Definition
- 상위 수준의 모듈이 하위 수준의 모듈에 의존하지 말도록, 이들 두 모듈 모두 추상화에 의존하도록
- 추상화는 구체적이 사항에 의존하지 않도록
- inversion이란 어휘는 구조적 분석 설계 등의 전통적 방법에서 정책이 구체적인 것에 의존하는 경향이 있어, 이들 의존 관계를 역전(inversion) 시킨다는 뜻
- 상위수준 모듈이란 : 의미론 상 타 모듈의 action에 정책을 제공하는 모듈로서, 해당 프로그램의 핵심을 이루는 모듈. 일반적으로 하위 수준 모듈에 비해 변화 정도가 적음.
DIP violated sample
- Utility -> Mechanism -> Policy 방향으로 수준이 높아짐에도 불구하고, 하위 수준의 모듈 방향으로 dependency가 걸리고 있음.
- 게다가 의존성은 이행성(transitivity)를 띄므로, policy 계층은 mechanism 뿐 아니라 utility 계층에도 의존성을 가짐.
DIP complied sample
- 상위 수준 모듈은 자신이 필요한 하위 수준 서비스에 대한 정의(추상물)을 그 자신의 계층에 정의하고, 해당 정의를 참조(의존성의 제거)
- 하위 수준 모듈은 상위 수준 계층에 정의된 서비스를 상속을 통해 구현물을 제공(상위 수준의 추상물에 대한 상속을 통한 의존성의 역전)
Conclusion
- Framework design에서 본 원칙의 적절한 응용이 필수 : DI(Dependency Injection; 의존성이 해당 클래스가 인스턴스화된 이후에야 걸림)
- TDD를 이루기에 매우 용이. Ex. Policy layer는 타 layer의 도움 없이도 인스턴스화가 가능.