🛠 프로그래밍 일반/설계 방법론

의존성 역전 (Dependency inversion principle)

또디기 2025. 4. 19. 13:24

객체지향의 5대 원칙인 SOLID 원칙 중 D에 해당한다. 또한 "수정은 어렵게, 확장은 쉽게" 설계해야 한다는 개방-폐쇄 원칙을 가장 쉽게 구현할 수 있는 방법이기도 하다.

 

 

개발자스럽게 표현하면 "고수준(High-level) 모듈이 저수준(Low-level) 모듈에 직접 의존하지 않게 한다"고 말한다.
고수준, 저수준 모듈은 일반적으로 말하는 그 하이-레벨, 로우-레벨의 의미가 맞다. 로우-레벨은 어플리케이션의 밑단에서 구체적인 기능과 로직을 구현하는 것이고, 하이-레벨은 보다 추상화되고 사용자에게 노출될 가능성이 큰 것이다.

 

더 쉽게 말하면 다른 모듈을 참조할 때 직접 참조하지 말고 인터페이스같은 추상화 레이어를 하나 끼고서 참조하라는 것이다. 이로 인한 장점을 나열해보자면 다음과 같다.

  • 만약 인터페이스를 통해 추상화하지 않는다면, 저수준 모듈이 변했을 때 그걸 사용하던 고수준 모듈의 로직도 변해야 할 수 있다.
    반면 인터페이스를 통해 추상화하고 인터페이스의 명세가 약속한 대로 저수준 모듈이 기능을 제공해주기만 한다면, 고수준 모듈은 저수준 모듈이 어떻게 변하던 신경을 쓸 필요가 없다. 인터페이스를 통해 기능 단위로 잘 분리된 함수들만 제공받을 수 있으면 된다.
  • 여러 종류의 저수준 모듈이 있어도 같은 인터페이스를 상속하기만 하면 고수준 모듈에선 쉽게 교체하여 사용할 수 있다. 이는 런타임에도 가능하므로 아주 강력한 장점이 된다.
  • 테스트나 디버깅을 할 땐 테스트용 Mock 객체를 끼워서 사용해보면 된다. 이런 유연한 구조로 시간, 비용이 절약된다.