Dependency?

  • 변경에 초점을 맞춤

  • B가 변경될 때 A가 함께 변경되는 것

    • 클래스 명
    • 메소드 명
    • 구현
    • 이외의 어떤 것이든 변경에 의해 영향을 받을 수 있는 모든 가능성
  • 설계를 어떻게 하느냐에 따라 B의 내부 구현이 변경되더라도 A가 영향을 받지 않을 수도 있음

Class 의존성

  • 연관 관계
    class A {
      private B b;
    }
    인스턴스 생명 주기 동안 영구적으로 의존를 하는 것
  • 의존 관계
    class A {
      public B method(B b) {
          return new B();
      }
    }
    파라미터, 리턴 타입, 혹은 메소드에서 해당 타입의 인스턴스를 생성할 때 등 일시적으로 의존하는 것
  • 상속 관계
    class A extends B {
    }
    구현이 바뀌면 영향을 받을 수 있음
  • 실체화 관계
    class A implements B {
    }
    method signature가 바뀌면 영향을 받음

DIP?

  • Dependency Inversion Principle (의존성 역전 원칙)

  • 객체지향 5대 원칙인 SOLID의 D

상위 모듈은 하위 모듈의 구현에 의존해서는 안된다.
하위 모듈이 상위 모듈이 정의한 추상에 의존해야 한다.

상위 모듈: 상위 정책. 변경이 적게 일어남
하위 모듈: 상위 정책에 따른 하위 정책. 비교적 변경이 자주 일어남

왜 의존성 '역전'이지?

전통적인 흐름에서는 의존 주체 모듈(상위 모듈) 인스턴스의존 대상 모듈(하위 모듈) 인스턴스를 직접 생성하여 호출하는 구조적 디자인에 초점을 맞추기 때문에 상위 레벨에서 하위 레벨의 구체를 직접 의존한다.

이렇게 상위 레벨이 하위 레벨을 의존하는 구조에서 하위 모듈의 변경은 상위 모듈에 직접적인 영향을 미치며 상위 레벨의 변경으로 이어질 수 있다.

DIP에서 역전이란 실제 호출 및 사용관계의 역전이 아닌 절차적 흐름의 구조적 디자인에서 발생하던 하위 레벨의 변경이 상위 레벨에 미치는 변경을 끊자는 의미이다. 상위 모듈에서 하위 모듈의 구현을 직접 의존하는 것이 아닌 하위 모듈이 상위 모듈이 정의한 추상을 구현하게 되므로 역전이라고 한다.

DIP의 이점

  • 하위 레벨에서의 구현이 변경(e.g. DBMS를 MySQL에서 Oracle로 교체)되더라도 변경이 상위로 전파되지 않는다.
  • 추상과 상세를 격리시키므로 유지보수가 쉬워진다.
  • 변경에 강하다.
    • 재사용 가능하다.
    • 테스트가 쉽다.

참고

[우아한테크세미나] 190620 우아한객체지향 by 우아한형제들 개발실장 조영호님

[소프트웨어 디자인] 의존 관계 역전의 원칙- Dependency Inversion Principle for Primer