Files
2nd/10_Wiki/Topics/02_Architecture_Principles/Domain-Driven Design.md
T
2026-05-02 16:24:15 +09:00

8.7 KiB

id, category, confidence_score, tags, last_reinforced
id category confidence_score tags last_reinforced
P-REINFORCE-WIKI-F537C4B2 10_Wiki/💡 Topics/02_Architecture_Principles 0.95
domain-driven-design
microservices-architecture
modular-monolith
hexagonal-architecture
event-sourcing-pattern
architecture-principles
2026-05-02

Domain-Driven Design

📌 Brief Summary

도메인 주도 설계(Domain-Driven Design, DDD)는 비즈니스 역량과 도메인 로직을 중심으로 소프트웨어 모델을 분할하고 구조화하는 설계 원칙이다 [1, 2]. 이 원칙은 마이크로서비스, 헥사고날 아키텍처, 모듈형 모놀리스 등 현대 소프트웨어 아키텍처 패턴들이 요구하는 명확한 논리적 경계와 비즈니스 규칙을 수립하는 데 핵심적인 척도가 된다 [1-3]. 복잡한 도메인 로직을 효율적으로 분리하고 구성할 수 있게 하지만, 그에 비례하여 높은 수준의 추상화와 설계 패턴에 대한 이해를 요구한다 [4, 5].

📖 Core Content

  • 비즈니스 역량 중심의 서비스 모델링: DDD는 서비스를 비즈니스 역량(business capability)이나 하위 도메인(subdomain)을 중심으로 조직하도록 유도한다 [2, 6]. 이는 각 서비스가 특정 비즈니스 기능을 캡슐화해야 한다는 마이크로서비스 아키텍처(MSA)의 핵심 원칙과 완벽하게 일치한다 [2].
  • 명확한 로직 경계와 캡슐화(Encapsulation): DDD는 비즈니스 규칙을 구현하는 비즈니스 엔티티, 즉 DDD Aggregate 단위로 로직을 구성한다 [6]. 모듈형 모놀리스(Modular Monolith) 아키텍처에 DDD 원칙을 적용할 경우, 시스템을 물리적 네트워크로 분할하지 않고도 비즈니스 로직의 경계를 명확하게 강제하여 코드베이스를 더 조직적이고 유지보수하기 쉽게 만들 수 있다 [1, 7].
  • 클린/헥사고날 아키텍처와의 융합: 도메인 로직을 외부 인프라스트럭처나 UI로부터 격리하는 헥사고날 아키텍처(Hexagonal Architecture) 및 클린 아키텍처(Clean Architecture)는 본질적으로 DDD 원칙을 기반으로 하거나 강력한 시너지를 발휘한다 [3, 8]. 일례로 Salesforce와 같은 대규모 플랫폼 또한 복잡한 도메인 로직을 효과적으로 관리하기 위해 도메인 주도 아키텍처(Domain-Driven Architecture)를 기반으로 구축되었다 [5].

⚖️ Trade-offs & Caveats

  • 가파른 학습 곡선과 높은 전문성 요구: 도메인 주도 설계를 제대로 이해하고 구현하기 위해서는 설계 패턴과 추상화 개념에 대한 성숙한 이해가 필수적이다 [4]. 이로 인해 DDD에 익숙하지 않은 소규모 팀이나 주니어 개발자에게는 매우 가파른 학습 곡선이 요구된다는 제약이 있다 [4].
  • 타 아키텍처 패턴 도입의 전제 조건: DDD에 대한 전문성은 단순히 설계를 넘어서 다른 아키텍처 패턴을 채택하는 데 직접적인 영향을 미친다. 예를 들어, 시스템의 변경 내역을 모두 저장하는 이벤트 소싱(Event Sourcing) 패턴을 도입하려 할 때, 팀 내에 DDD에 대한 충분한 전문성이 없다면 해당 패턴의 도입을 피해야 한다 [9].

🔗 Knowledge Connections

[소프트웨어 아키텍처 패턴]

  • Microservices Architecture
    • 연결 이유: MSA는 서비스를 비즈니스 역량 단위로 분리하는 데 중점을 두며, 이는 DDD의 핵심 철학과 완벽히 맞닿아 있기 때문이다 [2].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: DDD로 도출된 서브도메인이 실제 물리적인 분산 시스템 환경에서 어떻게 독립적인 서비스로 배포되고 상호작용하는지 이해할 수 있다.
  • Modular Monolith
    • 연결 이유: 분산 네트워크 구조를 취하지 않는 단일 코드베이스 환경에서도 DDD를 활용해 내부 비즈니스 모듈의 경계를 엄격히 나누는 데 활용되기 때문이다 [1, 7].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 오버엔지니어링(MSA)을 피하면서도 어떻게 DDD를 통해 시스템의 복잡성을 통제하고 유지보수성을 극대화하는지 파악할 수 있다.
  • Hexagonal Architecture
    • 연결 이유: 포트와 어댑터를 활용하여 외부 기술 종속성으로부터 내부 코어를 격리하는 이 아키텍처는 DDD에서 정의한 도메인 모델을 안전하게 보호하는 환경을 제공하기 때문이다 [3].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 비즈니스 로직을 기술 스택으로부터 완벽히 분리하여 순수하게 유지하는 구조적 메커니즘을 배울 수 있다.
  • Event Sourcing Pattern
    • 연결 이유: 이벤트 소싱 패턴을 효과적으로 설계하고 운용하기 위해서는 DDD 역량이 선제적으로 요구되기 때문이다 [9].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 상태 변경이 이력을 통해 관리될 때 비즈니스 모델(애그리거트)이 어떻게 이벤트를 발생시키고 재구성하는지 이해할 수 있다.

[비즈니스/로직 구성 요소]

  • DDD Aggregates
    • 연결 이유: DDD에서 비즈니스 규칙과 로직을 실제로 구현하고 캡슐화하는 핵심 데이터 단위이기 때문이다 [6].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 코드 수준에서 도메인의 규칙과 데이터 정합성이 어떻게 단일 트랜잭션 단위로 보호되는지 알 수 있다.
  • Subdomain
    • 연결 이유: 시스템의 전체 비즈니스 기능의 슬라이스를 구현 가능한 단위로 나눈 모델로, DDD 전략적 설계의 근간이기 때문이다 [6].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 거대한 비즈니스 문제가 어떻게 작은 구성 단위로 쪼개져 각각의 마이크로서비스 또는 모듈로 매핑되는지 파악할 수 있다.

Deeper Research Questions

  • 도메인 주도 설계(DDD)에서 정의하는 'Bounded Context'는 마이크로서비스의 물리적 경계와 어떤 관계를 가지며, 언제 이 둘을 일치시키는 것이 효과적인가?
  • 팀 내에 DDD 전문성이 부족할 때, 클린 아키텍처나 헥사고날 아키텍처를 섣불리 도입했을 때 발생하는 구체적인 기술 부채와 실패 사례는 무엇인가?
  • 모듈형 모놀리스(Modular Monolith) 아키텍처 환경에서 DDD의 Aggregate 간 통신과 데이터 참조는 어떤 방식으로 구현되어야 결합도(Coupling)를 낮출 수 있는가?
  • 이벤트 소싱(Event Sourcing) 패턴을 구현할 때, DDD의 역량이 필수적이라고 평가받는 이유는 상태 관리와 비즈니스 이벤트 흐름 사이의 어떤 상호작용 때문인가?
  • 기존의 데이터 중심(Data-Driven) 또는 트랜잭션 스크립트 기반 레거시 시스템을 도메인 주도 설계로 전환하기 위해 거쳐야 하는 점진적인 리팩토링 전략은 무엇인가?

Practical Application Contexts

  • Implementation: 비즈니스 규칙이 포함된 엔티티(Aggregate)를 개발할 때, 외부 DB 프레임워크나 UI 관련 코드가 도메인 모델에 침투하지 않도록 추상화된 포트/인터페이스를 구현한다.
  • System Design: 초기 스타트업에서 무리하게 MSA를 도입하기보다, 우선 모듈형 모놀리스 구조 하에서 DDD를 통해 논리적 도메인 경계를 잡아두어 훗날 확장에 대비하는 청사진으로 활용한다.
  • Operation / Maintenance: 명확한 서브도메인 분리를 통해 장애가 발생한 비즈니스 영역을 신속하게 파악하고, 다른 모듈로의 버그 전파(Cascading failure)를 방지하는 방식으로 코드를 유지보수한다.
  • Learning Path: 디자인 패턴 → 클린/헥사고날 아키텍처의 이해 → DDD 전략적 설계(Bounded Context) → DDD 전술적 설계(Aggregate, Value Object) → 이벤트 소싱 적용 순으로 심화 학습을 진행한다.
  • My Project Relevance: 복잡한 도메인(예: 금융, 결제, 헬스케어 등) 프로젝트에서 핵심 비즈니스 로직이 자주 변경되더라도, 외부 인프라 요인에 의해 코드가 망가지지 않도록 안전한 도메인 레이어를 설계하는 데 필수적으로 적용된다.

Adjacent Topics

  • CQRS (Command Query Responsibility Segregation)
    • 확장 방향: 소스에 관련 정보가 부족합니다. (※ 참고: 일반적인 소프트웨어 공학 맥락에서 이벤트 소싱과 함께 DDD 모델의 상태 조회와 명령 처리를 분리하는 전략으로 확장할 수 있으나, 제공된 소스 내에서는 DDD와의 직접적인 맵핑 정보가 부족함)

Last updated: 2026-05-02