🧐TIL
[DDD] DDD와 아키텍처
date
Mar 18, 2023
thumbnail
slug
ddd-architecture
author
status
Public
summary
“도메인 주도 설계 철저 입문”을 읽으며 공부한 내용을 정리합니다.
type
Post
category
🧐TIL
tags
TIL
DDD
Architecture
updatedAt
Jun 18, 2023 05:57 AM
아케텍처의 역할
아키텍처는 지식을 표현한 코드를 적재적소에 배치하는 원칙으로 도메인 주도 설계와 함께 자주 등장하는 주제이지만 도메인 주도 설계 자체가 특정 아키텍처를 전제로 하지는 않는다.
하지만 좋은 아키텍처를 사용하는 것은 도메인 규칙이 제자리를 벗어나는 것을 방지함과 동시에 한곳에 모이게 하여 소프트웨어가 끊임없는 개선을 버틸 수 있는 구조를 갖게 해준다.
도메인 주도 설계가 아키텍처에서 기대하는 것은 레이어 분리를 통해 도메인 객체가 서로 얽히지 않고 역할을 지킬 수 있도록 하는 것으로, 이것만 지켜진다면 어떤 아키텍처가 사용되어도 무방하다.
주요 아키텍처
계층형 아키텍처 (Layered Architecture)
계층형 아키텍처는 구성요소들을 공통적인 특성에 따라 여러 층의 수평적인 레이어로 나누어 나타낸 구조다. 도메인 주도 설계에서 말하는 계층형 아키텍처는 아래 4개의 계층으로 구성되는 경우가 많다.
- 프레젠테이션 계층 (사용자 인터페이스 계층)
- 사용자 인터페이스와 애플리케이션이 연결되는 계층이다. 주요 책임은 출력의 표시와 입력의 해석으로 인터페이스와 애플리케이션을 연결하기만 한다면 그것이 웹 프레임워크든 CLI든 무방하다.
- 애플리케이션 계층
- 도메인 계층의 요소를 지휘하는 요소가 모인 계층이다. 애플리케이션 서비스가 이 계층에 속하며 도메인 객체의 클라이언트가 되어 유스케이스를 구현하고 진행하는 역할을 한다. 도메인 계층이 도메인을 나타내는데 전념하려면 애플리케이션 계층의 요소가 도메인 객체를 이끌고 애플리케이션으로서 독립적으로 기능할 수 있어야 한다.
- 도메인 계층
- 가장 중요한 계층으로 문제 해결에 필요한 도메인 지식을 담는 계층이다. 이 계층에 도메인 객체를 분리해 두고 다른 계층으로 벗어나지 않게 한다.
- 인프라스트럭처 계층
- 자신 외의 계층을 지탱하는 기술적 기반에 대한 접근을 제공한다. 애플리케이션을 위한 메시지 송신, 도메인을 위한 퍼시스턴시 제공 모듈 등이 이 계층에 포함된다. 리포지토리의 인터페이스는 도메인 계층에 속하지만 리포지토리 구현체는 인프라스트럭처 계층에 속한다.
계층형 아키텍처의 원칙은 의존의 방향이 위에서 아래를 향하며 상위에 있는 계층만이 자신보다 하위에 있는 계층에 의존할 수 있다.
헥사고날 아키텍처
헥사고날 아키텍처는 육각형이 모티프인 아키텍처로 애플리케이션과 그 외 인터페이스 및 저장 매체를 자유롭게 탈착 가능하게 하는 것이 핵심 콘셉트다.
애플리케이션의 입출력이 들어오고 나가는 포트(port)와 애플리케이션의 인터페이스를 변환하는 클래스인 어댑터(adapter)의 모양만 맞으면 애플리케이션의 코어를 바꾸지 않고도 의존관계를 관리할 수 있다하여 포트앤어댑터(ports-and-adapters)라고도 부른다.
애플리케이션에 대한 입력을 받는 포트 및 어댑터를 프라이머리 포트와 프라이머리 어댑터라고 하며, 반대로 애플리케이션이 외부와 상호작용하는 포트를 세컨더리 포트라고 하고 이를 구현한 객체를 세컨더리 어댑터라고 한다.
인터페이스를 이용해 의존관계를 관리한다는 점이 가장 큰 특징이지만 계층형 아키텍처를 사용하더라도 인터페이스를 이용한 의존관계 역전을 적용한다면 큰 차이는 없다.
클린 아키텍처
클린 아키텍처는 4개의 동심원이 있는 그림으로 설명되는 아키텍처로 비즈니스 규칙을 캡슐화한 모듈을 중심에 두는 것이 중요한 콘셉트다.
사용자 인터페이스 데이터스토어 같은 세부사항은 가장자리로 밀어내고 의존관계의 방향을 안쪽을 향하게 함으로써 세부사항이 추상에 의존하는 의존관계 역전 원칙을 달성한다. 헥사고날 아키텍처의 콘셉트와 일맥상통하지만 실질적인 구현 방법을 명시한다는 점에서 차이가 있다.