OOP의 핵심 개념 중 하나인 SOLID 중 D에 해당하는 원칙이다.
DIP (The Dependency Inversion Principle)
High level modules should not depend on low level modules. Both should depend on abstractions.
Abstractions should not depend on details. Details should depend on abstractions.
DIP란 위의 내용에 기반을 둔 내용이다. 즉, 상위 레벨의 모듈은 하위 레벨의 모듈에 의존해서는 안되며 그 abstractions에 의존해야한다. 또한, Abstractions은 detail한 내용에 의존해서는 안되며 Detail 또한 Abstractions 에 의존해야한다.
보통의 의존성이 위의 그림과 같다고 하면,
DIP를 적용한 IoC는 아래 그림과 같이 Abstractions에 의존해야하는 것이다.
코드 상에서는 Interface와 Abstract class가 high-level resources로 이용되며
Concrete class가 low level resources로 분류되는 것.
이 DIP는 단순히 의존성을 역전시키는 것 뿐 아니라, Ownership 도 역전시킨다.
전통적인 구조에서는 서비스가 server에 의해 소유되거나 선언됐다면,
Client가 Server에 원하는 것을 특정시켜 실행하는 것으로, Client가 interface에 대한 ownership을 가지는 것이다.
예를 들어 전통적으로는 첫 번째 그림처럼 high-level 모듈이 low-level 모듈을 호출하는 방법이고,
layer측면에서 보면 upper-level layer(상위 레이어)가 lower-level layer(하위 레이어)에 의존하는 것이다.
두 번쨰 그림을 보면 Dependency Inversion이 이루어진 모양이다.
첫 번째 그림과 반대로 lower-level layer가 upper-level layer에 의존성을 가지게 된다.
Client라고 할 수 있는 upper level layer가 interface를 가져서 lower-level layer는 interface를 갖고 있지 않게 된다.
따라서 high-level 모듈이 low-level 모듈에 의존성을 갖지 않게 되며,
오히려 반대로 low-level 모듈이 high-level 모듈에 의존성을 갖게 되는 것이다.
코드로 예를 들면 아래와 같다.
public class button {
Lamp lamp = new Lamp();
public void toggle(on) {
if (on) {
lamp.lightOn():
} else {
lamp.lightOff();
}
}
}
public class Lamp {
public void lightOn() {
// light on...
}
public void lightOff() {
// light on...
}
}
Implementation인 Lamp에 의존하는 button이다.
public class button {
ButtotnInterface buttotnInterface = new Lamp();
public void toggle(on) {
if (on) {
buttotnInterface.on():
} else {
buttotnInterface.off();
}
}
}
public interface ButtotnInterface {
public void on();
public void off();
}
public class Lamp : buttonInterface {
public void on() {
// light on...
}
public void off() {
// light off...
}
}
이것을 button이 추상화 된 ButtonInterface에 의존하게 되었고
Lamp가 ButtonInterface를 상속하므로 ButtonInterface에 의존성을 가지게 되어
하위 모듈이 상위 모듈에 의존하는 DIP를 지키는 코드가 되었다.
'Architecture (아키텍쳐) > OOP' 카테고리의 다른 글
GRASP (0) | 2021.04.27 |
---|---|
SOLID Principle (0) | 2021.04.25 |