컴포넌트 사이의 관계는 어떤 원칙을 가지고 개발되어야 하는가?
ADP: 의존성 비순환 원칙
컴포넌트 의존성 그래프에 순환(Cycle)이 있어서는 안된다.
개발환경은 릴리스 가능한 컴포넌트 단위로 분리하여야 한다.
이를 통해 컴포넌트는 개별 개발자 또는 단일 개발팀이 책임질 수 있는 작업 단위가 된다.
왜 릴리즈 가능한 컴포넌트 단위로 분리하여야 하는가?
A라는 컴포넌트가 새로 릴리즈가 되었다고 생각해보자.
A 컴포넌트를 사용하고 있던 다른 컴포넌트들은 릴리즈 된 것을 그대로 사용하지 않아도 된다.
과거 버전의 릴리즈를 계속 사용해도 되고, 변경사항에 대한 준비가 완료되면 새로운 릴리즈를 사용해도 된다.
하지만, 위의 절차가 정상적으로 동작하고 실제 반영이 되기 위해서는 컴포넌트 사이의 의존성 구조를 반드시 관리해야 한다.
즉, 의존성 구조에 순환이 있어서는 안된다.
아래 예제를 살펴보자.
위의 전형적인 컴포넌트 구조에서 보면, 의존성 구조에 대한 순환이 안 보인다.
하지만 아래와 같이 순환이 발생하였을 때를 보자.
위와 같은 서클이 발생하게 되면, 서클이 발생하고 있는 컴포넌트들은 사실상 하나의 거대한 컴포넌트가 되어버린다.
따라서, 해당 컴포넌트들 중에 하나라도 의존성을 가지고 있는 컴포넌트가 있다면, 서클이 발생되고 있는 컴포넌트들 모두에게 의존성이 발생한다.
의존성 순환이 발생되고 있는 컴포넌트들은 독립성을 잃고, 사용하는 컴포넌트들은 큰 의존성 덩어리를 가지게 되므로 릴리즈에 제약이 생기고, 간단한 단위테스트도 의존성에 맞추어 복잡해질 가능성이 생기게 된다.
순환 끊기
이러한 순환을 끊기 위해서는 어떠한 방법을 써야 하는가?
1. 의존성 역전(DIP) 활용.
Entities 컴포넌트가 Autorizer 컴포넌트의 클래스중 하나에 대해 직접 의존 하던 부분을 인터페이스를 통해 상속 받아 사용하도록 한다.
2. 두 컴포넌트가 의존하는 새로운 컴포넌트를 만든다.
직접 의존하지 않고, 중간에 컴포넌트를 생성하여 두 컴포넌트가 의존할 수 있도록 한다.
컴포넌트들의 구조는 애플리케이션이 성장함에 따라 계속 변화한다.
따라서 의존성 구조에 대한 순환이 발생하는지 항상 관찰해야 하고, 순환 발생시 컴포넌트를 새로 생성하거나, 의존성 역전을 통해 끊어내야한다.
'프로그래밍 > 클린 아키텍처' 카테고리의 다른 글
[클린아키텍처] 5부. 아키텍처 (0) | 2021.04.18 |
---|---|
[클린아키텍처] 4부. 컴포넌트 응집도 (0) | 2021.03.21 |
[클린아키텍처] 4부. 컴포넌트 (0) | 2021.03.15 |
[클린아키텍처] 3부. 설계 원칙 DIP (0) | 2021.03.02 |
[클린아키텍처] 3부. 설계원칙 ISP (0) | 2021.03.02 |