개요
DI 내용 정리 중 DI(Dependency Injection)와 객체지향 5원칙 DIP(Dependency Inversion Principle)의 철자가 다른것을 보고 어떤 차이점이 있는지 알아보고자 이 글을 쓴다.
목표
- DI와 DIP의 차이점을 이해한다.
DIP (Dependency Inversion Principle)
의존성 역전 원칙(Dependency Inversion Principle, DIP)은 객체 지향 설계 원칙 중 하나로, 시스템의 고수준 모듈이 저수준 모듈에 직접적으로 의존하는 것을 피하고, 대신 둘 모두가 추상화에 의존하도록 설계해야 한다는 원칙입니다. 이 원칙은 SOLID 원칙 중 하나로, 특히 대규모 소프트웨어 시스템의 유지 보수성과 확장성을 향상시키는 데 중요한 역할을 합니다.
DIP의 주요 내용은 다음과 같습니다:
- 고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 둘 다 추상화에 의존해야 합니다.
- 추상화는 세부 사항에 의존해서는 안 됩니다. 세부 사항이 추상화에 의존해야 합니다.
DIP 적용
동영상 인코딩 서비스를 만든다고 생각해보자. 아래처럼 코드를 작성할 수 있을 것이다.
public class EncodingService {
private H264Encoder h264Encoder;
public String encode() {
return h264Encoder.encode();
}
}
public class H264Encoder {
public String encode() {
return "h264로 인코딩";
}
}
코드의 문제점은?
EncodingService만 온전히 테스트 할 수없다. H264Encoder 와의 의존성 때문에 H264Encoder가 완벽하게 동작해야 EncodingService를 테스트 할 수 있다.
만약 인코더가 추가된다면 아래와 같이 서비스 코드를 변경해야 한다.
public class H265Encoder {
public String encode() {
return "h265로 인코딩";
}
}
public class EncodingService {
private H264Encoder h264Encoder;
private H265Encoder h265Encoder;
public String encode(String type) {
if (type.equals("h264"))
return h264Encoder.encode();
else
return h265Encoder.encode();
}
}
DIP 적용하기
DIP를 적용한 설계는 아래와 같다.
- 고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 둘 다 추상화에 의존해야 합니다.
→ EncodingService는 H264Encoder, H264Encoder에 의존해서는 안된다.
- 추상화는 세부 사항에 의존해서는 안 됩니다. 세부 사항이 추상화에 의존해야 합니다.
→ 세부적인 인코딩 내용은 추상화를 사용하여 이뤄져야 한다.
public class EncodingService {
private Encoder encoder;
public EncodingService(Encoder encoder) {
this.encoder = encoder;
}
public String encode() {
return encoder.encode();
}
}
외부로부터 Encoder 객체를 받아왔으므로, H264Encoder, H264Encoder에 대한 의존성이 사라진것을 확인할 수 있다.
또한, 인코딩의 세부적인 내용은 encoder 인터페이스의 encode 메서드를 implements한 객체들에 의해 구현되므로 세부 사항이 추상화에 의존하고 있다.
여기서, 굉장히 많이 본듯한 코드가 보이는데, 외부로부터 생성자 주입을 통해 Encoder 객체를 생성하고 있다. 이는 DI(Dependency Injection)과 같은 형태를 보이고 있다.
결론
DIP(Dependency Inversion Principle)를 만족하기 위해서 DI(Dependency Injection)디자인 패턴을 이용할 수 있다고 생각할 수 있다.
Reference
https://yoojin99.github.io/cs/Dependency-Inversion-Principle/
'Design Pattern' 카테고리의 다른 글
Dependency Injection Pattern (DI 패턴) 이란? (0) | 2023.06.18 |
---|