# [[Domain-Driven Design (DDD)]]

## 📌 Brief 단기 Summary
Domain-Driven Design(DDD, 도메인 주도 설계)은 애플리케이션의 핵심 비즈니스 로직을 프레임워크나 인프라에서 분리하여 '도메인(Domain)' 계층에 고립시키는 아키텍처 설계 기법입니다 [1, 2]. 코드를 조직할 때 단일하고 응집력 있는 도메인 개념인 '제한된 컨텍스트(Bounded Context)'를 기준으로 모듈을 나누어 복잡성을 제어합니다 [3]. 대규모 워크로드와 복잡한 비즈니스 요구사항을 처리해야 하는 엔터프라이즈 시스템에서 확장성과 유지보수성을 확보하기 위해 사용됩니다 [4, 5].

## 📖 Core Content
제공된 소스에서 Domain-Driven Design (DDD)과 관련하여 파악할 수 있는 핵심 내용은 다음과 같습니다.

* **도메인 계층(Domain Layer)의 철저한 고립:** 
  헥사고날 아키텍처(Hexagonal Architecture) 등과 결합된 실전 DDD 환경에서, 시스템은 핵심 도메인 로직을 외부 시스템으로부터 완전히 고립시키는 패턴을 따릅니다 [1]. 이 도메인 계층에는 순수한 비즈니스 규칙과 엔티티(Entity)가 존재하며, 어떠한 외부 프레임워크나 라이브러리에도 의존하지 않도록 설계됩니다 [2].
* **제한된 컨텍스트(Bounded Context)로의 매핑:** 
  단일 컴포넌트나 앱(App)이 너무 많은 역할을 하는 것을 방지하기 위해, DDD의 '제한된 컨텍스트(Bounded Context)' 개념을 도입합니다 [3]. 예를 들어 Django 프로젝트에서 하나의 앱은 반드시 하나의 응집된 도메인 개념(Bounded Context)에만 매핑되어야 하며, 분명하고 단일한 책임을 가져야 합니다 [3].
* **값 객체(Value Objects)를 활용한 유효성 검사:** 
  DDD 기반의 도메인 모델 내에서는 값 객체(Value Objects)를 활용합니다 [6]. 인프라 계층의 라이브러리(예: Jakarta validation)에 의존하여 데이터를 검증하는 대신, 값 객체 자체를 통해 수신된 데이터를 검증하고 비즈니스 규칙을 보장하는 방식이 설계에서 고려됩니다 [6].
* **수동 구조 확장을 위한 패턴 도입:** 
  Express.js와 같이 특별한 구조를 강제하지 않는 비의견(Unopinionated) 프레임워크에서 대규모 워크로드를 감당하려면, 개발자가 직접 DDD나 의존성 주입(DI) 라이브러리와 같은 구조적 패턴을 수동으로 설계하고 도입해야 합니다 [5]. 반면 ABP 프레임워크 같은 플랫폼은 엔터프라이즈급 애플리케이션을 위해 DDD를 기본 구조로 함께 제공하기도 합니다 [4].

*(참고: Aggregate, Domain Event, Ubiquitous Language 등 DDD의 상세한 철학과 구현 기법에 대해서는 소스에 관련 정보가 부족합니다.)*

## ⚖️ Trade-offs & Caveats
* **검증 책임 분리의 복잡성:** 도메인 내부에 Value Object(값 객체)를 두어 순수하게 유효성을 검증하는 방식을 채택할 경우, 외부 요청 처리를 위한 인프라/애플리케이션 계층의 검증 라이브러리(예: Jakarta validation)를 사용할지, 혹은 도메인 객체 내부에서 처리할지를 두고 아키텍처적 고민과 제약이 따를 수 있습니다 [6].
* **초기 설계 부담:** 프레임워크 자체의 기본 구조를 넘어, 도메인을 프레임워크 종속성에서 100% 분리하기 위한 설계(예: 헥사고날 아키텍처 도입)가 필요합니다 [2]. 특히 Express.js처럼 구조를 강제하지 않는 프레임워크에서는 개발자가 직접 DDD 기반의 확장성 패턴을 정의하고 유지해야 하는 설계적 부담(기술적 부채의 위험)이 뒤따릅니다 [5].
* *(기타 DDD 구현의 구조적 오버헤드나 성능 트레이드오프에 대해서는 소스에 관련 정보가 부족합니다.)*

## 🔗 Knowledge Connections

### Related Concepts

#### [아키텍처/기반 기술]
- [[Bounded Context]]
  - 연결 이유: 단일하고 응집력 있는 도메인 개념을 의미하며, 애플리케이션을 모듈 및 앱 단위로 나눌 때의 기준점이 됩니다 [3].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 거대한 모놀리식 구조나 Mega-App을 피하고, 각 시스템 파트를 어떻게 독립된 기능 단위로 분리할 것인가에 대한 전략 [3].
- [[Hexagonal Architecture]]
  - 연결 이유: DDD의 도메인(비즈니스 로직과 엔티티)을 외부 인프라 및 프레임워크로부터 분리하고 보호하기 위해 가장 흔하게 결합되는 아키텍처입니다 [1, 2].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 포트(Port)와 어댑터(Adapter)를 사용해 외부 세계와 소통하면서, 어떻게 도메인 로직을 순수하게 유지할 수 있는지에 대한 실전 구현 방식 [1, 2].

#### [구현/활용 도구]
- [[Value Objects]]
  - 연결 이유: DDD 도메인 계층 내부에 존재하여, 데이터의 상태와 검증 로직을 캡슐화하는 객체입니다 [6].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 특정 기술(프레임워크 라이브러리)에 종속되지 않고 애플리케이션의 데이터 유효성 검증을 수행하는 도메인 중심의 접근법 [6].

### Deeper Research Questions
- Express.js와 같이 구조가 없는 프레임워크에서 DDD 구조를 수동으로 적용할 때, 코드 복잡도 증가와 팀 스케일링 문제를 어떻게 극복할 수 있는가? [5]
- Bounded Context에 따라 분리된 여러 모듈이나 앱(Django의 경우) 간의 데이터 참조 시 발생하는 긴밀한 결합(Tight Coupling) 문제를 어떻게 해소해야 하는가? [3]
- 헥사고날 아키텍처 환경에서 Value Object를 활용한 비즈니스 룰 검증과, 외부 입력 처리를 위한 라이브러리 기반(예: Jakarta) 유효성 검증은 어떻게 책임을 분할하는 것이 이상적인가? [6]
- 도메인(Domain) 계층을 프레임워크와 외부 라이브러리로부터 100% 완전히 고립시키는 것이 [2] 실무적으로 발생시키는 변환(Mapping) 및 성능 오버헤드는 어느 정도인가?
- 소스에 등장하지 않은 DDD의 주요 요소(Aggregates, Domain Events 등)들은 Spring Boot나 NestJS 환경에서 구체적으로 어떻게 코드로 사상되는가? *(소스에 관련 정보가 부족하여 확장 조사 필요)*

### Practical Application Contexts
- **Implementation:** Django 프로젝트 구조 설계 시, `core/` 또는 `api/`와 같이 모든 기능을 포함하는 거대한 앱(Mega-App) 생성을 피하고, 명확한 단일 Bounded Context를 가지는 앱 단위로 나누어 개발을 구현합니다 [3, 7]. 
- **System Design:** Spring Boot 기반 엔터프라이즈 시스템 설계 시 헥사고날 아키텍처와 결합하여, 중심부에 어떤 라이브러리에도 의존하지 않는 순수한 '도메인 계층'을 정의하고 외부와의 통신을 인터페이스로 분리합니다 [1, 2].
- **Operation / Maintenance:** 비즈니스 도메인을 분리함으로써 향후 데이터베이스 기술을 변경하거나 외부 API가 바뀌더라도, 도메인 내부의 핵심 로직은 수정 없이 안전하게 운영 및 유지보수 할 수 있습니다 [2]. (세부 운영 사례는 소스에 정보 부족)
- **Learning Path:** 기본적인 MVC 아키텍처(Layered Architecture)의 한계를 이해한 뒤, 이를 극복하기 위해 비즈니스 중심의 DDD 개념(Bounded Context, Value Objects 등)을 학습하고, 최종적으로 헥사고날이나 클린 아키텍처로 넘어가 도메인을 고립시키는 방법을 학습합니다 [1, 6, 8].
- **My Project Relevance:** 프레임워크(Spring Boot, Express.js 등)의 기술 스택에 종속되지 않는 안전한 핵심 비즈니스 로직을 구축해야 하거나, 규모가 커짐에 따라 코드가 엉키는 것을 방지해야 하는 대규모 실전 프로젝트의 아키텍처 수립에 필수적인 전략입니다 [2, 5].

### Adjacent Topics
- [[Clean Architecture]]
  - 확장 방향: DDD와 마찬가지로 비즈니스 로직을 외부 인프라스트럭처나 UI 프레임워크로부터 분리하고 의존성을 역전시킨다는 공통 철학을 가진 아키텍처 설계법을 비교 연구합니다 [8, 9].
- [[Microservices Architecture]]
  - 확장 방향: DDD의 Bounded Context가 대규모 분산 시스템 환경에서 개별 마이크로서비스의 경계를 식별하고 설계하는 기초 단위로 어떻게 활용되는지 확장해 봅니다 [3, 10].

---
*Last updated: 2026-05-03*