- Depencency Inversion Principle
- 의존성 역전 원칙에서 말하는 ‘유연성이 극대화된 시스템’이란 코드의 추상(abstration)에 의존하고 구현체(concretion)는 의존하지 않는 시스템을 의미함
- 자바와 같은 정적 언어에서
use
, import
, include
를 사용한 참조 대상이 오직 인터페이스나 추상 클래스라는 의미 - 운영체제나 플랫폼 같이 안정성이 보장된 환경애 대해서는 무시
- 예를 들면 자바에서
java.lang.*
, java.util.*
등에 포함된 구현체 참조
안정된 추상화
- 추상 인터페이스에 변경이 생기면 구현체는 수정행함
- 그러나 대부분의 구현체 수정은 추상 인터페이스 수정을 야기하기 않음
- 뛰어난 개발자는 인터페이스의 변동성을 낮추기 위해 애씀
- 인터페이스 수정없이 구현체 수정 방법을 찾기 위해 노력함
- 이는 소프트웨어 설계의 기본
- 안정적인 소프트웨어 아키텍처란 변동성이 큰 구현체에 의존하는 일은 지양하고, 안정된 추상 인터페이스를 선호하는 아키텍처
- 다음과 같은 구체적인 코딩 실천법으로 요약 가능
- 변동성이 큰 구체 클래스를 참조하지말고 추상 인터페이스를 참조
- 변동성이 큰 구체 클래스로부터 파생(상속)하지 말라
- 구체 함수를 오버라이드 하지 말라
- 구체적이며 변동성이 크다면 절대로 그 이름을 언급하지 말라
팩토리
- 위 규칙들을 준수하려면 변동성이 큰 구체적인 객체는 주의해서 생성하는 것
- 자바 같은 대다수 객체지향언어에서는 추상 팩토리을 사용
- 위 그림은 추상 팩토리 패턴을 나타낸것
Application
은 Service
를 사용 Application
은 구현체인 ConcreteImpl
를 생성하기 위해 추상체인 ServiceFactory
를 사용 ServiceFactory
는 ConcreteImpl
을 Service
타입으로 반환
- 위 그림의 곡선은 아키텍처 경계를 뜻함
구체 컴포넌트
- 위 그림에는
ServiceFactoryImpl
가 ConcreteImpl
을 의존 - 즉 구체에 대한 의존성이 존재
- 이는 일반적인 일, DIP 위배를 모두 없앨 수는 없음
- 하지만 최소화 할 수는 있음
결론
- 이 책에서 고수준 아키텍처 원칙을 다루게 되면서 DIP는 몇 번이고 등장할것임
- DIP는 아키텍처 다이어그램에서 가장 눈에 드러나는 원칙이 될 것임
- 의존성은 추상적인 엔티티가 있는 쪽으로만 향함