DIP: 의존성 역전 원칙

  • Depencency Inversion Principle
  • 의존성 역전 원칙에서 말하는 ‘유연성이 극대화된 시스템’이란 코드의 추상(abstration)에 의존하고 구현체(concretion)는 의존하지 않는 시스템을 의미함
    • 자바와 같은 정적 언어에서 use, import, include를 사용한 참조 대상이 오직 인터페이스나 추상 클래스라는 의미
    • 운영체제나 플랫폼 같이 안정성이 보장된 환경애 대해서는 무시
      • 예를 들면 자바에서 java.lang.*, java.util.* 등에 포함된 구현체 참조

안정된 추상화

  • 추상 인터페이스에 변경이 생기면 구현체는 수정행함
    • 그러나 대부분의 구현체 수정은 추상 인터페이스 수정을 야기하기 않음
  • 뛰어난 개발자는 인터페이스의 변동성을 낮추기 위해 애씀
    • 인터페이스 수정없이 구현체 수정 방법을 찾기 위해 노력함
    • 이는 소프트웨어 설계의 기본
  • 안정적인 소프트웨어 아키텍처란 변동성이 큰 구현체에 의존하는 일은 지양하고, 안정된 추상 인터페이스를 선호하는 아키텍처
  • 다음과 같은 구체적인 코딩 실천법으로 요약 가능
    • 변동성이 큰 구체 클래스를 참조하지말고 추상 인터페이스를 참조
    • 변동성이 큰 구체 클래스로부터 파생(상속)하지 말라
      • 상속은 가장 강력한 의존 관계중 한가지 방법
    • 구체 함수를 오버라이드 하지 말라
    • 구체적이며 변동성이 크다면 절대로 그 이름을 언급하지 말라

팩토리

  • 위 규칙들을 준수하려면 변동성이 큰 구체적인 객체는 주의해서 생성하는 것
  • 자바 같은 대다수 객체지향언어에서는 추상 팩토리을 사용

  • 위 그림은 추상 팩토리 패턴을 나타낸것
    • ApplicationService를 사용
    • Application은 구현체인 ConcreteImpl를 생성하기 위해 추상체인 ServiceFactory를 사용
    • ServiceFactoryConcreteImplService 타입으로 반환
  • 위 그림의 곡선은 아키텍처 경계를 뜻함
    • 구체적인 것과 추장적인 것들을 분리함

구체 컴포넌트

  • 위 그림에는 ServiceFactoryImplConcreteImpl을 의존
    • 즉 구체에 대한 의존성이 존재
    • 이는 일반적인 일, DIP 위배를 모두 없앨 수는 없음
    • 하지만 최소화 할 수는 있음

결론

  • 이 책에서 고수준 아키텍처 원칙을 다루게 되면서 DIP는 몇 번이고 등장할것임
  • DIP는 아키텍처 다이어그램에서 가장 눈에 드러나는 원칙이 될 것임
  • 의존성은 추상적인 엔티티가 있는 쪽으로만 향함