계층형 아키텍처의 단점을 보완할 수 있는 방법으로 "의존성 역전하기"를 사용
단일 책임 원칙(SRP)
SRP : 컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다.
- 컴포넌트의 의존성 각각은 컴포넌트를 변경하는 이유가 됨
- A컴포넌트가 B컴포넌트에 의존하고 있다면, B컴포넌트가 변경될 때 A컴포넌트도 변경되어야 함을 의미
의존성 역전 원칙(DIP)
DIP : 코드 상의 어떤 의존성이든 그 방향을 바꿀 수(역전시킬 수) 있다.
계층형 아키텍처에서 상위 컴포넌트는 하위 컴포넌트에 의존성을 가진다.
- 즉, 상위 컴포넌트일수록 책임이 많아짐을 의미
도메인 계층은 영속성 계층에 의존하므로, 영속성 계층이 변경될 때마다 도메인 계층도 변경해야 함
- 하지만 도메인 코드는 애플리케이션에서 가장 중요한 코드이므로, 영속성 코드가 바뀌더라도 도메인 코드를 바꾸고 싶지 않음
이러한 의존성을 제거하기 위해 “의존성 역전 원칙”을 활용
- 엔티티를 도메인 계층으로 올림
- 영속성 계층의 리포지토리가 도메인 계층의 엔티티에 의존하기 때문에 순환 의존성이 발생
- 이때 도메인 계층에 리포지토리에 대한 인터페이스를 만들고, 영속성 계층에서 이에 대한 구현체를 생성

클린 아키텍처에서는 도메인 코드가 바깥으로 향하는 어떤 의존성도 없어야 함을 의미
- 의존성 역전 원칙을 사용해 모든 의존성이 도메인 코드로 향하도록 해야 함

클린 아키텍처의 단점은 애플리케이션의 엔티티에 대한 모델을 각 계층에서 유지보수 해야 함
- 위의 예시에서도 영속성 계층에서 별도의 ORM기반 엔티티를 생성
- 웹 계층에서도 별도의 모델을 생성해 유지보수 해야 함
헥사고날 아키텍처
로버트 C. 마틴의 클린 아키텍처의 내용을 구체적인 아키텍처로 만든 것

- 육각형 내부가 도메인 계층
- 도메인 계층의 entity를 중심으로 Use case Interface가 존재
- Use case는 각 요구사항에 대한 인터페이스로 Input Port에서는 이를 구현해서 외부에서 들어오는 요청을 처리
- 일반적인 Service 계층은 Use Case의 구현체
- InputPort는 웹 계층 및 외부에서 도메인 엔티티에 접근하기 위한 입구
- UseCase의 구현체
- OutputPort는 UseCase에서 호출하는 Adapter를 의미
- 영속성 계층은 OutputPort를 구현한 구현체 중 하나
'Architecture(아키텍처)' 카테고리의 다른 글
| [만들면서 배우는 클린 아키텍처] 06. 영속성 어댑터 구현하기 (0) | 2024.07.20 |
|---|---|
| [만들면서 배우는 클린 아키텍처] 05. 웹 어댑터 구현하기 (0) | 2024.07.20 |
| [만들면서 배우는 클린 아키텍처] 04. 유스케이스 구현하기 (0) | 2024.07.20 |
| [만들면서 배우는 클린 아키텍처] 03. 코드 구성하기 (0) | 2024.07.20 |
| [만들면서 배우는 클린 아키텍처] 01. 계층형 아키텍처의 문제는 무엇일까? (1) | 2024.07.20 |