DDD (Domain-Driven Design) 란?
도메인 주도 설계의 약자로써, 각각의 도메인은 서로 철저히 분리하고, 높은 응집력과 낮은 결합도의 구조를 통해 변경과 확장에 용이하도록 설계 하는 것을 의미한다.

DDD 를 구현할때는 위와 같이 크게 3가지 Layer로 구분하는 것이 핵심이다.
1. Application Layer : 주로 도메인과 Repository를 바탕으로 실제 API를 제공하는 계층
2. Domain Model Layer : Entity를 활용해 도메인 로직(비즈니스 로직)이 수행되는 계층
3. Infrastructure Layer : 외부와 통신(RDBMS, Redis, HttpClient, ...)을 담당하는 계층
헥사고날 아키텍처

사전적 의미로는 ”육각형 건축물”을 의미하며, 소프트웨어 설계에 사용되는 아키텍처 패턴중 하나로 여러 소프트웨어 환경에 쉽게 연결할 수 있도록, 느슨하게 결합된 애플리케이션 구성요소를 만드는 것을 목표로 하는 아키텍처이다.
도메인의 비즈니스 로직을 외부 라이브러리 및 툴로부터 분리 할 때 포트와 어댑터라고 부르는 인터페이스를 사용하기 때문에 포트&어댑터 아키텍처라고도 부른다.
특징은 다음과 같다.
- 핵심 비즈니스 로직은 중앙의 도메인 영역에 위치하며, 입출력을 처리하는 포트와 어댑터를 통해 외부와 소통한다.
- 도메인 로직과 인프라 스트럭처 계층을 명확히 분리함으로써 변경 사항이 도메인 로직에 미치는 영향을 줄일 수 있다.
- 해당 구조는 유지보수를 용이하게하여 시스템의 다양한 부분을 독립적으로 개발하고 테스트할 수 있는 환경을 제공한다.
- 헥사고날 아키텍처는 도메인 중심 설계와 밀접하게 연관되어있어 비즈니스 로직의 중심성을 강조한다.
즉,
도메인 비즈니스 로직이 외부요소에 의존하지 않게 만들고, 프레젠테이션 계층(controller)과 데이터 소스 계층(persistence) 같은 외부 요소들이 도메인 계층에 의존하도록 한다.
→ 외부와의 접촉을 인터페이스로 추상화하여 비즈니스 로직 안에 외부 코드나 로직의 주입을 막는 것, 외부 라이브러리 및 툴로부터 분리시키는 것이 아키텍처의 핵심이다.
Port 와 Adapter
헥사고날 아키텍처를 사용하여 개발을 시작하려 한다면, 포트와 어댑터의 역할, 두 어댑터간의 차이점을 제대로 인지해야 한다.




DDD 와 헥사고날 아키텍처간의 연관관계
위에서 DDD 와 헥사고날 아키텍처를 같이 언급한 이유는, 서로 상호 보완적인 관계에 있는 설계 방법론과 설계 패턴이기 때문이다.
헥사고날 아키텍처와 DDD는 서로 보완적인 관계에 있다. DDD는 도메인 모델 중심으로 시스템을 설계하고, 헥사고날 아키텍처는 이러한 도메인 모델을 효과적으로 구현할 수 있는 구조를 제공하기 때문이다.

헥사고날 아키텍처 패키지 구조 ( + DDD)
// GPT가 제안하는 플러터 헥사고날 아키텍처 + DDD + MVVM 구조
lib/
│
├── core/ # 공통 코드 (에러, 유틸, 상수 등)
│
├── domain/ # 도메인 계층 (DDD 중심)
│ └── A_service/ # 도메인 단위 (ex. appointment, patient 등)
│ ├── entities/ # Entity, Value Object 등
│ ├── port/
│ │ ├── in/ # UseCase 추상 정의 (입력 포트)
│ │ └── out/ # Repository 인터페이스 (출력 포트)
│ └── usecases/ # UseCase 구현체 (도메인 로직 실행 주체)
│
├── application/ # Application 계층 (선택적 분리)
│ └── A_service/
│ └── usecases/ # 유스케이스 조합, 흐름, 트랜잭션 관리
│
├── infrastructure/ # 인프라 계층 (DB, API, 외부 연동)
│ └── A_service/
│ ├── adapters/
│ │ └── out/ # RepositoryImpl 등 외부 포트 구현체
│ └── datasources/ # API, DB, Redis 등 외부 소스 연동
│
├── presentation/ # UI 계층 (MVVM 적용)
│ └── A_service/
│ ├── screens/ # Flutter 화면 위젯 (View)
│ ├── viewmodels/ # 상태 관리 + UI 로직 (ViewModel)
│ └── widgets/ # 공용/모듈 위젯
'CS' 카테고리의 다른 글
| Webhook 이란 (0) | 2025.05.12 |
|---|---|
| CS 연습문제 (3) (0) | 2025.02.24 |
| CS 연습문제 (2) (0) | 2025.02.20 |
| CS 연습문제 (1) (0) | 2025.02.17 |
| CS 연습문제 (0) (0) | 2025.02.17 |