출처 : 디자인 패턴에 뛰어들기 - 알렉산더 슈베츠 도서
D (Dependency Inversion Principle, 의존성 역전 원칙)
상위 계층 클래스들은 하위 계층 클래스들에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다.
추상화는 세부 정보에 의존해서는 안 되며, 세부 정보는 추상화에 의존해야 한다.
소프트웨어 디자인 시 일반적인 클래스 분류
- 하위 계층 클래스: 기본 작업(디스크 작업, 네트워크 통신, 데이터베이스 연결 등)을 구현한다.
- 상위 계층 클래스: 복잡한 비즈니스 로직을 처리하며, 하위 계층 클래스들을 활용하여 동작한다.
문제 상황 및 제안
종종 하위 계층 클래스들을 먼저 디자인하고, 이후 상위 계층 클래스들을 디자인하기 시작한다.
이는 시스템의 프로토타입을 개발할 때 흔한 상황이다.
그러나 이런 접근 방식은 비즈니스 로직 클래스들이 하위 계층의 원시 클래스에 직접 의존하게 된다.
의존성 역전 원칙 적용 단계
- 상위 계층 클래스는 하위 계층 작업의 인터페이스를 사용한다.
- 이 때, 비즈니스 용어로 표현된 인터페이스를 활용하여야 한다.
- 구상 하위 계층 클래스 대신 인터페이스에 의존하는 상위 계층 클래스를 설계한다.
- 이로써 의존 관계의 방향이 역전된다.
- 의존성 역전 원칙은 개방/폐쇄 원칙과 함께 적용된다.
- 이를 통해 하위 계층 클래스를 수정하지 않고도 새로운 비즈니스 로직 클래스들을 활용할 수 있다.
- 이를 통해 하위 계층 클래스를 수정하지 않고도 새로운 비즈니스 로직 클래스들을 활용할 수 있다.
예시
상위 계층의 예산 보고 클래스는 자신의 데이터를 읽고 유지하기 위해 하위 계층의 데이터베이스 클래스를 사용한다.
이는 데이터베이스 서버의 새로운 버전 출시와 같은 하위 계층 클래스의 변경이 상위 계층 클래스에 영향을 미치지 않아야 한다는 것을 의미한다.
수정 전: 상위 계층 클래스가 하위 계층 클래스에 의존한다.
읽기/쓰기 작업을 설명하는 상위 계층 인터페이스를 생성한다.
예산 보고 클래스는 이 상위 계층 인터페이스를 사용하여 하위 계층 클래스 대신에 작업을 수행한다.
그런 다음, 원래의 하위 계층 클래스를 변경하거나 확장하여 비즈니스 로직에 의해 선언된 새로운 읽기/쓰기 인터페이스를 구현한다.
수정 후:상위 계층 클래스가 하위 계층 클래스 대신 상위 계층 추상화에 의존한다.
결과적으로, 의존 관계의 방향이 역전된다.
이제 하위 계층의 클래스가 상위 계층의 추상화에 의존하게 된다.
결론
고수준 모듈이 저수준 모듈에 의존하도록 설계되지 않도록 하는 것이다.
대신에 추상화된 인터페이스에 의존하도록 설계하여, 구체적인 구현이 아닌 인터페이스에 의존하게 한다.
이렇게 함으로써 시스템의 유연성과 확장성을 향상시키고, 모듈 간의 결합도를 낮추어 변경에 대한 영향을 최소화한다.
'Self-Dev > Design Patterns R&D' 카테고리의 다른 글
[14] 디자인 패턴 목록 - 생성 디자인 패턴 - 추상 팩토리 메서드(Abstract Factory) (0) | 2024.06.19 |
---|---|
[13] 디자인 패턴 목록 - 생성 디자인 패턴 - 팩토리 메서드 (2) | 2024.06.07 |
[11] 소프트웨어 디자인 원칙들 - SOLID 원칙들 - (I) (2) | 2024.06.02 |
[10] 소프트웨어 디자인 원칙들 - SOLID 원칙들 - (L) (0) | 2024.06.02 |
[9] 소프트웨어 디자인 원칙들 - SOLID 원칙들 - (O) (0) | 2024.06.01 |