의존 역전 원칙(DIP, Dependency Inversion Principle)
- 의존 관계를 맺을 때, 변화하기 어려운 것, 변화가 거의 없는 것에 의존해야 한다.
- '유연성이 극대화된 시스템'이란 소스코드 의존성이 추상(Abstraction)에 의존하며, 구체(Concretion)에는 의존하지 않는 시스템을 말한다.
- 정적 타입 언어에서는 인터페이스나 추상 클래스 같은 추상적인 선언만을 참조해야 한다.
- 동적 타입 언어에서는 소스 코드 의존 관계에서 구체 모듈은 참조해선 안된다.
- 하지만, 소프트웨어 시스템은 이러한 규칙을 적용하기는 현실적으로 어렵다.
- 따라서, 모든 구체적인 요소를 의존하지 않는 것은 어렵지만 '변동성이 큰 구체적인 요소'는 의존하지 않도록 설계를 해야한다.
안정된 추상화
- 인터페이스의 변동성을 낮추고, 인터페이스를 변경하지 않고 구현 클래스에 기능을 추가하는 방법을 찾는 것은 소프트웨어 설계의 기본이다.
- 이러한 이유로 인터페이스는 구현체에 비해 변동성이 낮다.
- 안정된 소프트웨어 아키텍처는 변동성이 큰 구현체에 의존하는 것을 지양하고, 안정된 추상 인터페이스에 의존해야 한다.
변동성이 큰 구체 클래스를 참조하지 마라
- 대신, 추상 인터페이스를 참조하라
- 이 규칙은 객체 생성 방식을 강하게 제약하며, 일반적으로 추상 팩토리(Abstract Factory)를 사용하도록 강제한다.
변동성이 큰 구체 클래스로부터 파생시키지 마라
- 상속은 소스코드에 존재하는 관계 중 가장 강력하면서도 변경의 유연성을 낮춘다.
구체 함수를 오버라이드 하지 마라
- 구체 함수는 소스 코드 의존성을 필요로하며, 함수 오버라이드는 의존성을 상속하게 된다.
- 의존성을 제거하려면, 추상 함수로 선언하고 구현체에서 각자의 용도에 맞게 구현한다.
구체적이면 변동성이 크다면 절대로 그 이름을 언급하지 마라
- 대신 추상 인터페이스를 만들고 의존성을 역전 시켜라
팩토리
- 객체를 생성하기 위해선 구체적으로 정의한 코드에 대해 소스 코드 의존성이 발생한다.
- 이러한 의존성을 제거하기 위해 '추상 팩토리(Abstract Factory)'를 사용할 수 있다.
- 위의 클래스 설계에서 Application은 Service 타입 선언해 SerivceImpl 객체를 사용하더라도 객체 생성 시에는 ServiceImpl 클래스를 의존하게 된다.
- 추상 팩토리를 두어 객체 생성의 책임을 위임하면 Application은 Servie의 구현 클래스를 의존하는 상황을 피할 수 있다.
- 위 그림에서 곡선은 경계를 뜻하며, 추상 컴포넌트와 구체 컴포넌트를 분리한다.
- 추상 컴포넌트는 애플리케이션의 모든 고수준 업무 규칙을 포함한다.
- 구체 컴포넌트는 업무 규칙을 다루기 위해 필요한 모든 세부사항을 포함한다.
- 제어흐름은 소스 코드 의존성과는 반대 방향으로 곡선을 가로지른다.
서적 : http://www.yes24.com/Product/Goods/77283734
'Architecture' 카테고리의 다른 글
[Clean Architecture 정리] 13장. 컴포넌트 응집도 (0) | 2022.07.25 |
---|---|
[Clean Architecture 정리] 12장. 컴포넌트 (0) | 2022.07.24 |
[Clean Architecture 정리] 10장. ISP (0) | 2022.07.23 |
[Clean Architecture 정리] 9장. LSP (0) | 2022.07.20 |
[Clean Architecture 정리] 8장. OCP (0) | 2022.07.19 |
댓글