--- id: P-REINFORCE-AUTO-D052B2 category: "10_Wiki/πŸ’‘ Topics/Architecture" confidence_score: 0.95 tags: [auto-reinforced] last_reinforced: 2026-05-03 github_commit: "[P-Reinforce] Continuous Worker - Domain-Driven Design (DDD)" --- # [[Domain-Driven Design (DDD)|Domain-Driven Design (DDD)]] ## πŸ“Œ Brief 단기 Summary Domain-Driven Design(DDD, 도메인 주도 섀계)은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν”„λ ˆμž„μ›Œν¬λ‚˜ μΈν”„λΌμ—μ„œ λΆ„λ¦¬ν•˜μ—¬ '도메인(Domain)' 계측에 κ³ λ¦½μ‹œν‚€λŠ” μ•„ν‚€ν…μ²˜ 섀계 κΈ°λ²•μž…λ‹ˆλ‹€ [1, 2]. μ½”λ“œλ₯Ό 쑰직할 λ•Œ λ‹¨μΌν•˜κ³  응집λ ₯ μžˆλŠ” 도메인 κ°œλ…μΈ 'μ œν•œλœ μ»¨ν…μŠ€νŠΈ(Bounded Context)'λ₯Ό κΈ°μ€€μœΌλ‘œ λͺ¨λ“ˆμ„ λ‚˜λˆ„μ–΄ λ³΅μž‘μ„±μ„ μ œμ–΄ν•©λ‹ˆλ‹€ [3]. λŒ€κ·œλͺ¨ μ›Œν¬λ‘œλ“œμ™€ λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­μ„ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” μ—”ν„°ν”„λΌμ΄μ¦ˆ μ‹œμŠ€ν…œμ—μ„œ ν™•μž₯μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ ν™•λ³΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€ [4, 5]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized 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의 μƒμ„Έν•œ μ² ν•™κ³Ό κ΅¬ν˜„ 기법에 λŒ€ν•΄μ„œλŠ” μ†ŒμŠ€μ— κ΄€λ ¨ 정보가 λΆ€μ‘±ν•©λ‹ˆλ‹€.)* ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) * **검증 μ±…μž„ λΆ„λ¦¬μ˜ λ³΅μž‘μ„±:** 도메인 내뢀에 Value Object(κ°’ 객체)λ₯Ό 두어 μˆœμˆ˜ν•˜κ²Œ μœ νš¨μ„±μ„ κ²€μ¦ν•˜λŠ” 방식을 채택할 경우, μ™ΈλΆ€ μš”μ²­ 처리λ₯Ό μœ„ν•œ 인프라/μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ³„μΈ΅μ˜ 검증 라이브러리(예: Jakarta validation)λ₯Ό μ‚¬μš©ν• μ§€, ν˜Ήμ€ 도메인 객체 λ‚΄λΆ€μ—μ„œ μ²˜λ¦¬ν• μ§€λ₯Ό 두고 μ•„ν‚€ν…μ²˜μ  κ³ λ―Όκ³Ό μ œμ•½μ΄ λ”°λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€ [6]. * **초기 섀계 λΆ€λ‹΄:** ν”„λ ˆμž„μ›Œν¬ 자체의 κΈ°λ³Έ ꡬ쑰λ₯Ό λ„˜μ–΄, 도메인을 ν”„λ ˆμž„μ›Œν¬ μ’…μ†μ„±μ—μ„œ 100% λΆ„λ¦¬ν•˜κΈ° μœ„ν•œ 섀계(예: ν—₯사고날 μ•„ν‚€ν…μ²˜ λ„μž…)κ°€ ν•„μš”ν•©λ‹ˆλ‹€ [2]. 특히 Express.js처럼 ꡬ쑰λ₯Ό κ°•μ œν•˜μ§€ μ•ŠλŠ” ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” κ°œλ°œμžκ°€ 직접 DDD 기반의 ν™•μž₯μ„± νŒ¨ν„΄μ„ μ •μ˜ν•˜κ³  μœ μ§€ν•΄μ•Ό ν•˜λŠ” 섀계적 λΆ€λ‹΄(기술적 λΆ€μ±„μ˜ μœ„ν—˜)이 λ’€λ”°λ¦…λ‹ˆλ‹€ [5]. * *(기타 DDD κ΅¬ν˜„μ˜ ꡬ쑰적 μ˜€λ²„ν—€λ“œλ‚˜ μ„±λŠ₯ νŠΈλ ˆμ΄λ“œμ˜€ν”„μ— λŒ€ν•΄μ„œλŠ” μ†ŒμŠ€μ— κ΄€λ ¨ 정보가 λΆ€μ‘±ν•©λ‹ˆλ‹€.)* ## πŸ”— 지식 μ—°κ²° (Graph) ### 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* --- *Last updated: 2026-05-03* - Raw Source: 00_Raw/2026-05-03/Domain-Driven Design (DDD).md ---