DIP Dependency Inversion Principle 의존성 역전 원칙

2023. 5. 29. 20:57Software Architecture/Software design

    목차
반응형

"의존성 역전"에 대해 검색하게 되면 concrete가 아닌 추상(interface 등)에 의존하게 하는 것이 의존성 역전이다 라고 말합니다. 맞는 말 입니다. 그러나 구체적으로 왜 이것이 역전인지를 설명하는 글이 없어서 직접 적어봅니다. 

 

위 diagram에서 Master는 Dog에 의존합니다. 

Dog는 concrete한 animal 즉, concrete 한 class 입니다. 

 

Master가 다른 동물에 의존할 필요가 있다면 다음과 같이 의존 관계가 바뀌게 됩니다.

 

이는 Master에게 있어 Dog와 interaction하는 코드가 Cat과 interaction 하는 코드로 변경됨을 의미합니다. 

아래와 같이 추상화된 Animal이라는 interface class로 Master가 의존하게 합니다. 

 

이렇게 되면 

  • 코드 수준에서는 Master가 Animal에 의존을
  • 실제 control flow 상에서는 Master가 Dog나 Cat의 의존하게 됩니다. 
  • *제어 흐름과 코드의 의존성이 역전 됩니다.
    • 소스코드의 의존성이 제어흐름의 방향과 일치되지 않도록 하는 것이 바로 OO의 지향점 입니다.

 

즉, 실제 control 상의 의존이 역전 되게 되기에 이를 "dependency inversion"이라고 합니다.

 

 

의존성 역전은 package간의 의존 관계(즉, control 관계 역전)를 바꾸고 싶을때도 사용합니다. 

위 그림에서 A는 B에게 interface를 노출합니다. A class에는 IListener를 등록/해제하는 interface를 노출하고 있으며, IListener class도 노출합니다. 

B는 이렇게 노출된 interface에 의존(코드 상의 의존)하여 MyListener라는 concrete class를 구현하고 이를 A가 제공하는 등록 method를 호출하여 등록합니다. 

이후 control flow는 코드상의 의존관계인 B->A가 아닌 A->B로 나타나게 됩니다. 

 

의존성 역전은 이와 같이 package 간의 의존 관계를 바꾸는데도 사용됩니다.

 

반응형

'Software Architecture > Software design' 카테고리의 다른 글

Test double (테스트 더블)  (0) 2023.11.25
entity vs. object  (0) 2023.11.01
UML  (0) 2022.05.06
Memento pattern  (0) 2022.02.28
Mediator pattern  (0) 2022.02.28