OOP / / 2024. 3. 11. 15:30

의존성 역전 원칙(Dependency Inversion Principle, DIP)

설명

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다는 원칙입니다.
  • 한마디로 추상화된 개념을 의존하고 구현체를 의존하지 말라는 의미입니다.
  • 고수준의 모듈이 저수준을 직접 의존하게된다면 요구사항의 변경이나 새로운 기능이 확장될 때, 반드시 수정이 일어나게 됩니다.
  • 따라서 유지보수와 기능 확장에 어려움을 겪을 수 있습니다.

 

Bad Case

public class Sample {
    private FileUploader uploader = new LocalFileUploader();

    public void doSomething() {
        uploader.doSomething();
    }
}

 

Good Case

public class Sample {
    private FileUploader uploader;

    public Sample(FileUploader uploader) {
        this.uploader = uploader;
    }

    public void doSomething() {
        uploader.doSomething();
    }
}

 

Why?

Sample 클래스는 FileUploader라는 인터페이스에 의존하고 있습니다. 이는 고수준 모듈이 저수준 모듈의 구현에 직접적으로 의존하지 않고, 대신 추상화를 통해 의존성을 관리하고 있다는 것을 보여줍니다.

 

Bad Case에서는 Sample 클래스 내부에서 직접 LocalFileUploader 인스턴스를 생성하고 있어, 만약 파일 업로드 방식이 변경되거나 다른 업로더를 사용해야 할 경우, Sample 클래스 자체를 수정해야 하는 문제가 있습니다. 이는 시스템의 유연성과 확장성을 제한합니다.

 

반면, Good Case에서는 생성자를 통해 FileUploader 인터페이스의 구현체를 주입받고 있습니다. 이는 Sample 클래스가 특정 FileUploader 구현에 대해 알 필요가 없으며, 다양한 업로드 방식을 지원하는 구현체를 쉽게 교체할 수 있게 해줍니다.

 

이로 인해, 새로운 파일 업로더 구현이 필요하게 되더라도, Sample 클래스는 변경할 필요가 없게 됩니다. 오직 구현체를 주입하는 외부 코드만 변경하면 되므로, 시스템의 다른 부분들이 이 변경으로부터 영향을 받지 않게 됩니다. 이는 의존성 역전 원칙이 시스템의 유지보수성을 어떻게 향상시키는지를 잘 보여주는 예시입니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유