게층형 아키텍처 단점에 대한 대안
하나의 컴포넌트는 오로지 한 가지 일만 해야 하고, 그것을 올바르게 수행해야 한다. 라는 해석보다는
에 더 가깝다.
책임 ⇒ 변경할 이유
소프트웨어를 변경하더라도 이 컴포넌트에 대해서는 전혀 신경쓸 필요가 없어도 된다고 기대한다.
하지만 변경할 이유는 컴포넌트간의 의존성(직접/전이)을 통해서 쉽게 전파된다.
A →(의존) B,C,D,E
⇒ A는 B,C,D,E가 변경됨에 따라 같이 바뀌어야 한다.
저자가 잘못 구조화된 소프트웨어를 변경하는 데 더 많은 비용을 지불한 경험
상위 계층은 하위 계층을 의존하기 때문에 변경할 여지가 더 많다.
실제로 영속성 계층이 변경된다고 해서 핵심 로직을 가지고 있는 도메인 계층도 변경해야 할까? 도메인 코드는 애플리케이션에서 가장 중요한 코드이다. 어떻게 이 의존성을 줄일 수 있을까?
(의존성의 양쪽 코드를 모두 제어할 수 있을 때만)
서비스 [도메인 계층]
↙ ↘
엔티티 ➡ **레포지토리 인터페이스**
⬆ [영속성 계층]
엔티티 ⬅ 레포지토리 구현체
비즈니스 규칙은 프레임워크, 데이터베이스, UI 기술, 그 밖의 외부 애플리케이션이나 인터페이스로부터 독립적일 수 있다.
= 도메인 코드가 바깥으로 향하는 어떤 의존성도 없어야 한다.
(그림 출처: Credit: 도서출판 인사이트)
모든 의존성이 안쪽으로 향한다.
엔티티(코어) ⬅ 유스케이스 ⬅ 컨트롤러, 게이트웨이, 프레젠터 ⬅ 웹, 장치, 데이터베이스, UI, 외부 인터페이스
각 계층에서 엔티티 클래스를 가지고 유지보수해야한다. ⇒ 좋은 현상!
= 도메인 코드와 프레임워크간의 결합이 제거된 상태
클린 아키텍처보다 구체적인 원칙들
포트와 어댑터 아키텍처
(그림 출처: VROONG 테크블로그)
모든 의존성은 애플리케이션 코어(유스케이스, 도메인 계층)를 향한다.
헥사고날 아키텍처 또한 계층으로 구성되어 있다.
기존의 도메인 계층과 영속성/UI 계층간의 의존성을 역전시킨다.
도메인 계층(애플리케이션의 주요 코드)은 다른 컴포넌트를 의존하지 않게 된다.
SRP 원칙에 의해 도메인 계층은 변경할 이유가 적어진다.
각 계층은 더 자유롭게 모델링될 수 있고, 유지보수성이 좋아진다.
SRP
일단 위의 질문들 모두 예시를 봐야할 것 같다.