본문 바로가기

스프링 입문을 위한 자바 객체 지향의 원리와 이해

[스프링 입문을 위한 자바 객체 지향의 원리와 이해] DIP - 의존 역전 원칙

"고차원 모듈은 저차원 모듈에 의존하면 안된다.
  이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안된다.
 구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체(Concrete) 클래스에 의존하지 마라"
- 로버트 C.마틴

 

1) 의존 역전 원칙이란?

- 자동차와 스노우타이어 사이에는 아래 그림처럼 의존 관계가 있다.

  자동차가 스노우타이어에 의존한다. 

 

-그런데 자동차는 한 번 사면 몇 년은 타야 하는데 스노우타이어는 계절이 바뀌면 

 일반 타이어로 교체해야 한다.

 이런 경우 스노우타이어를 일반타이어로 교체할 때 자동차는 그 영향에 노출돼 있음을 알 수 있다.

 바로 자동차 자신보다 더 자주 변하는 스노우타이어에 의존하기에 부서지기 쉬움이라는 

 나쁜 냄새를 풍기고 있는 것이다. 

 

- 그럼 이런 경우 나쁜 냄새가 좋은 향기가 되도록 개선해보자. 

 

-위의 그림과 같이 자동차가 구체적인 타이어들(스노우타이어, 일반타이어, 광폭타이어)이 아닌

 추상화된 타이어 인터페이스에만 의존하게 함으로써

 스노우타이어에서 일반타이어로, 또는 다른 구체적인 타이어로 변경돼도 

 자동차는 이제 그 영향을 받지 않는 형태로 구성된다. 

 

- 그런데 이 설명에서 데자뷰가 느껴질 것이다.

   바로 개방 폐쇄 원칙(OCP)를 설명할 때 나온 설명이었다. 

  이렇게 하나의 해결책을 찾으면 그 안에 여러 설계 원칙이 녹아있는 경우가 많다. 

 

- 위의 그림을 보면 자동차는 자신보다 변하기 쉬운 스노우타이어에 의존하던 관계를 

  중간에 추상화된 타이어 인터페이스를 추가해 두고 

  의존 관계를 역전시키고 있다.

 

- 이처럼 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어

  변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙이다.