의존성 역전 원칙(DIP)

박시시·2022년 10월 26일
0

SOLID

목록 보기
5/5

로버트 마틴은 DIP에 대해 이렇게 말했다.
1. 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다, 둘 모두 추상화에 의존해야한다
2. 추상화는 구체적인 사항에 의존해서는 안된다, 구체적인 사항은 추상화에 의존해야한다

DIP는 결국 클래스 간의 커플링을 감소시키는 것에 대한 이야기이다. 이러한 커플링을 낮추기 위한 방법은 상위-하위 레이어 간에 추상화를 끼워 넣는 것이다. 이를 통해 상위-하위 레벨의 클래스는 서로의 구체적인 내용을 몰라도 추상화에 의존함으로써 동작되게 된다.

현실 예제를 통한 이해

1. 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다, 둘 모두 추상화에 의존해야한다

우편 서비스가 없던 시절의 물건 발송 서비스를 생각해보자. 발신자는 수신자에게 물건이 안전하게 도달하게 하기 위해 모든 걸 챙겨야만 했다. 어떤 운송수단을 이용해야 할지, 패키징을 어떻게 해야 할지 등등 발신자가 모든 구체적인 사항들을 챙겨야 했다.
발신자의 목적을 달성하기 위해 수많은 것들이 고려되어야 하며, 상황에 따라 발신자의 프로세스도 변경해야 된다.
현재의 우편 서비스를 이용하게 되면 위의 골치아픈 문제들은 해결된다.
이제 발신자는 우편서비스에서 제공하는 인터페이스를 통해 나의 물건을 어디로 배송해 달라는 메시지만 전달하면 된다. 어떻게 포장 되는지나 어떻게 운송되는지 등의 구체적인 사항은 신경쓸 필요가 없다. 마찬가지로 포장을 하는 사람이나 운송하는 사람 역시 누가 이 물건을 보내는지 알 필요 없다. 인터페이스를 통해 내려온 메시지에 따라 행위가 달라진다.
즉, 상위 레벨의 모듈(발신자)는 하위 레벨 모듈(패키징, 운송수단)을 모르고 하위 레벨 모듈 역시 상위 레벨 모듈을 몰라도 작동할 수 있다.

2. 추상화는 구체적인 사항에 의존해서는 안된다, 구체적인 사항은 추상화에 의존해야한다

어떻게 포장되고 어떻게 운송되는지 등은 구체적인 사항이다. 발신자는 일일이 따질 필요 없이, 예를 들면, Express 서비스 혹은 Economy 서비스 욥션 둘 중에 하나를 선택하면 된다.
Express 서비스를 선택했다면 포장은 최대한 작은 단위로 포장되어 비행기에 실려 운송될 수 있다. Economy 옵션은 컨테이너에 몰아넣고 배나 차량으로 운송될 것이다.
즉, 발송에 관한 구체적인 사항은 추상화된 인터페이스에 의해 결정된다는 의미이다.

코드 예제

처음에도 말했듯이 DIP를 적용하기 위해서는 인터페이스를 통한 협력이 필요하다.


(출처: https://blog.hexabrain.net/395)

이러한 구조는 사실 이미 전의 포스트에서 본 적이 있을 것이다. 바로 개방폐쇄원칙리스코프치환원칙에서 본 코드예제가 바로 이러한 구조를 따르고 있다.
다시 말하자면, 개방 폐쇄 원칙과 리스코프 치환 원칙을 준수하여 코드를 짠다면 자연스레 의존성 역전 원칙을 지키게 된다는 뜻이다.

복습 차원에서 전에 봤던 예제를 다시 봐보자.

public class BankingAppWithdrawalService {
  private Account account;

  public BankingAppWithdrawalService(Account account) {
      this.account = account;
  }

  public void withdraw(BigDecimal amount) {
      account.withdraw(amount);
  }
}

상위 레벨인 BankingAppWithdrawalService는 위 코드와 같이 Account라는 인터페이스, 즉 추상화에 의존하고 있다. 하위 레벨인 Account의 구현체들 역시 Account에 의존하므로 DIP의 1번 원칙을 지키게 된다.

또한 BankingAppWithdrawalService에서 사용될 Account의 구체적인 사항은 주입되는 의존성에 따라 런타임에 결정되게 된다. 또한 구현체를 변경한다고 인터페이스가 변경되지 않는다. 이는 DIP의 2번 원칙을 지키게 된다.

마무리

결국 DIP는 다른 SOLID 원칙에 종속적이다. 다른 원칙들을 지키다보면 자연스레 DIP도 지켜지게 된다.

참조

https://medium.com/@iamprabal/dependency-inversion-principle-3fcd6070dff1
https://stackify.com/dependency-inversion-principle/
https://blog.hexabrain.net/395

0개의 댓글