DDD
Domain Driven Design
DDD(Domain-Driven Design)λ μννΈμ¨μ΄ κ°λ° λ°©λ²λ‘ μ€ νλλ‘, 볡μ‘ν λλ©μΈμ λ€λ£¨λ μννΈμ¨μ΄ μμ€ν μ κ°λ°νκΈ° μν μ κ·Ό λ°©μμ λλ€. DDDλ λλ©μΈμ 볡μ‘μ±μ μ΄μ μ λ§μΆκ³ , λλ©μΈ μ λ¬Έκ°μ κ°λ°μ κ°μ νμ μ κ°μ‘°ν©λλ€.
μ£Όμ κ°λ
κ³Ό μμΉ
λλ©μΈ
μννΈμ¨μ΄ μμ€ν μ΄ μ μ©λλ λ¬Έμ μμ λλ μ 무 μμμ λ§ν©λλ€. λλ©μΈμ 볡μ‘ν λΉμ¦λμ€ κ·μΉ, κ°λ , νλ‘μΈμ€ λ±μ ν¬ν¨νλ©°, μννΈμ¨μ΄ μμ€ν μ λλ©μΈμ λͺ¨λΈλ‘ ννν©λλ€.
λλ©μΈ λͺ¨λΈ
λλ©μΈμ νννκΈ° μν μΆμνλ κ°λ μ΄μ ꡬ쑰μ λλ€. λλ©μΈ λͺ¨λΈμ λλ©μΈμ ν΅μ¬ κ·μΉ, κ°λ , νλ‘μΈμ€λ₯Ό κ°μ²΄, κ° κ°μ²΄, μν°ν°, μ 그리κ²μ λ±μ κ°λ μ μ¬μ©νμ¬ ννν©λλ€.
μ 그리κ²μ(Aggregate):
κ΄λ ¨λ κ°μ²΄λ€μ κ·Έλ£Ήμ νλμ λ¨μλ‘ λ¬Άμ κ°λ μ λλ€. μ 그리κ²μμ λ΄λΆμ μΌλ‘ μΌκ΄λ μνλ₯Ό μ μ§νκ³ λλ©μΈ κ·μΉμ μ μ©ν©λλ€. μ 그리κ²μμ λλ©μΈ λͺ¨λΈμ μ€μ¬ μμμ΄λ©°, λλ©μΈμ κ²½κ³μ μΌκ΄μ±μ μ μ§νλ μν μ ν©λλ€.
λλ©μΈ μ£Όλ μ€κ³:
λλ©μΈμ μ€μ¬μΌλ‘ μμ€ν μ μ€κ³νλ λ°©λ²λ‘ μ λλ€. λλ©μΈ μ£Όλ μ€κ³λ λλ©μΈ μ λ¬Έκ°μ κ°λ°μ κ°μ νμ μ κ°μ‘°νκ³ , λλ©μΈ λͺ¨λΈλ§μ ν΅ν΄ λ¬Έμ μμμ μ΄ν΄νκ³ μ€κ³νλ λ°©μμ μΆκ΅¬ν©λλ€.
μν€ν
μ² κ΅¬μ±
μ¬μ©μ μΈν°νμ΄μ€ UI λλ νν Presentation
μ¬μ©μμ μμ²μ μ²λ¦¬νκ³ μ¬μ©μμκ² μ 보λ₯Ό 보μ¬μ€λ€. μ¬κΈ°μ μ¬μ©μλ μννΈμ¨μ΄λ₯Ό μ¬μ©νλ μ¬λλΏλ§ μλλΌ μΈλΆ μμ€ν μΌ μλ μλ€.
μμ© Application
μ¬μ©μκ° μμ²ν κΈ°λ₯μ μ€ννλ€. μ 무 λ‘μ§μ μ§μ ꡬννμ§ μμΌλ©° λλ©μΈ κ³μΈ΅μ μ‘°ν©ν΄μ κΈ°λ₯μ μ±ννλ€
λλ©μΈ
μμ€ν μ΄ μ 곡ν λλ©μΈ κ·μΉμ ꡬννλ€.
μΈνλΌμ€νΈλμ² infrastructure
λ°μ΄νΈλ² μ΄μ€λ λ©μμ§ μμ€ν κ³Ό κ°μ μΈλΆ μμ€ν κ΄μ μ°λμ μ²λ¦¬νλ€
μν°ν°μ λ°Έλ₯
μν°ν°
μν°ν°λ μλ³ κ°λ₯νκ³ λ³κ²½ κ°λ₯ν κ°λ μ λνλ λλ€. μν°ν°λ μ£Όλ‘ κ³ μ μλ³μλ₯Ό κ°μ§λ©°, κ·Έ μλ³μλ₯Ό κΈ°λ°μΌλ‘ λλ©μΈμμ μλ³λ©λλ€.
μλ₯Ό λ€μ΄, κ³ κ°(Customer) μν°ν°λ κ³ κ°μ κ³ μ ν μλ³μλ‘ μλ³λ μ μμ΅λλ€.
μν°ν°λ κ³ μ ν μλ³μμ μν΄ μλ³λ©λλ€. μν°ν°μ μμ±μ΄ λ³κ²½λλλΌλ μλ³μκ° μ μ§λλ©΄ μ¬μ ν κ°μ μν°ν°λ‘ μ·¨κΈλ©λλ€.
μλ₯Ό λ€μ΄, κ³ κ°μ μ΄λ¦μ΄ λ³κ²½λλλΌλ μλ³μλ‘ κ³ κ°μ μλ³ν μ μμ΅λλ€.
μν°ν°λ λ³κ²½ κ°λ₯ν μνλ₯Ό κ°μ§ μ μμ΅λλ€. λλ©μΈ κ·μΉμ λ°λΌ μν°ν°μ μμ±μ΄ λ³κ²½λκ³ , μν°ν°μ μνλ₯Ό λ³κ²½ν μ μμ΅λλ€.
μν°ν°λ λλ©μΈμμ κ°μ²΄(Entity)λ‘μ μ€μν μν μ μνν©λλ€. μν°ν°λ λλ©μΈμ ν΅μ¬ κ°λ μ νννκ³ λλ©μΈ κ·μΉμ μ μ©νλλ° μ¬μ©λ©λλ€.
λ°Έλ₯
λ°Έλ₯λ λ³κ²½ λΆκ°λ₯νκ³ λλ±μ±(Equality)μ κΈ°μ€μΌλ‘ λΉκ΅λ©λλ€. λ°Έλ₯λ μ£Όλ‘ λλ©μΈμμ κ°λ μ μΈ μμ±μ λνλ λλ€.
μλ₯Ό λ€μ΄, μ£Όμ(Address) κ° κ°μ²΄λ μΌλ ¨μ μμ±(λμ, μ°νΈλ²νΈ λ±)μ κ°μ§κ³ μμΌλ©°, λ μ£Όμκ° λμΌν μμ±μ κ°μ§λ©΄ λλ±νλ€κ³ νλ¨λ©λλ€.
λ°Έλ₯λ κ·Έ μμ²΄λ‘ μλ³λμ§ μκ³ , μμ±μ μ‘°ν©μΌλ‘ μλ³λ©λλ€. λ°Έλ₯λ μμ±μ΄ λ³κ²½λλ©΄ μλ‘μ΄ κ° κ°μ²΄λ‘ μ·¨κΈλ©λλ€.
μλ₯Ό λ€μ΄, μ£Όμμ μμ±μ΄ λ³κ²½λλ©΄ μλ‘μ΄ μ£Όμ κ°μ²΄κ° μμ±λ©λλ€.
λ°Έλ₯λ λ³κ²½ λΆκ°λ₯ν(Immutable) μμ±μ κ°μ§λλ€. λ°Έλ₯μ μμ±μ μμ± μμ μ κ²°μ λκ³ μ΄νμλ λ³κ²½λμ§ μμ΅λλ€. λ°Έλ₯μ μμ±μ λ³κ²½νλ €λ©΄ μλ‘μ΄ κ° κ°μ²΄λ₯Ό μμ±ν΄μΌ ν©λλ€.
λ°Έλ₯λ λλ©μΈμμ κ°λ μ μΈ μμ±μ λνλ΄λλ° μ¬μ©λ©λλ€. λ°Έλ₯λ λλ©μΈμ νΉμ μμ±μ νννκ³ , κ°μ λ³κ²½μ΄λ λλ±μ± λΉκ΅μ μ¬μ©λ©λλ€.
λλ©μΈ μμμ μ£Όμ ꡬμ±μμ
μν°ν°(ENTITY)
κ³ μ μ μλ³μλ₯Ό κ°λ κ°μ²΄λ‘ μμ μ λΌμ΄ν μ¬μ΄ν΄μ κ°λλ€. μ£Όλ¬Έ(Order), νμ(Member), μν(Product)κ³Ό κ°μ΄ λλ©μΈμ κ³ μ ν κ°λ μ νννλ€. λλ©μΈ λͺ¨λΈμ λ°μ΄ν°λ₯Ό ν¬ν¨νλ©° ν΄λΉ λ°μ΄ν°μ κ΄λ ¨λ κΈ°λ₯μ ν¨κ» μ 곡νλ€.
λ°Έλ₯(VALUE)
κ³ μ μ μλ³μλ₯Ό κ°μ§ μμ κ°μ²΄λ‘ μ£Όλ‘ κ°λ μ μΌλ‘ νλμΈ κ°μ ννν λ μ¬μ©λλ€. λ°°μ‘μ§ μ£Όμλ₯Ό νννκΈ° μν μ£Όμ(Address)λ ꡬ맀 κΈμ‘μ μν κΈμ‘(Meney)μ κ°μ νμ μ΄ λ°Έλ₯ νμ μ΄λ€. μν°ν°μ μμ±μΌλ‘ μ¬μ©ν λΏλ§ μλλΌ λ€λ₯Έ λ°Έλ₯ νμ μ μμ±μΌλ‘λ μ¬μ©ν μ μλ€.
μ 그리거νΈ(AGGREGATE)
μ 그리거νΈλ μ°κ΄λ μν°ν°μ λ°Έλ₯ κ°μ²΄λ₯Ό κ°λ μ μΌλ‘ νλλ‘ λ¬Άμ κ²μ΄λ€. μλ₯Ό λ€μ΄ μ£Όλ¬Έκ³Ό κ΄λ ¨λ Order μν°ν°, OrderLine λ°Έλ₯, Orderer λ°Έλ₯ κ°μ²΄λ₯Ό 'μ£Όλ¬Έ' μ 그리거νΈλ‘ λ¬Άμ μ μλ€.
리ν¬μ§ν°λ¦¬(REPOSITORY)
λλ©μΈ λͺ¨λΈμ μμμ±μ μ²λ¦¬νλ€. μλ₯Ό λ€μ΄ DBMS ν μ΄λΈμμ μν°ν° κ°μ²΄λ₯Ό λ‘λ©νκ±°λ μ μ₯νλ κΈ°λ₯μ μ 곡νλ€.
λλ―Έμ μλΉμ€(DOMAN SERVICE)
νΉμ μν°ν°μ μνμ§ μμ λλ©μΈ λ‘μ§μ μ 곡νλ€. 'ν μΈ κΈμ‘ κ³μ°'μ μν, μΏ ν°, νμ λ±κΈ, ꡬ맀 κΈμ‘ λ± λ€μν 쑰건μ μ΄μ©ν΄μ ꡬννκ² λλλ°, μ΄λ κ² λλ©μΈ λ‘μ§μ΄ μ¬λ¬ μν°ν°μ λ°Έλ₯λ₯Ό νμλ‘ νλ©΄ λλ©μΈ μλΉμ€μμ λ‘μ§μ ꡬννλ€.
λ°μ΄λλ 컨ν
μ€νΈ(Bounded Context)
λ°μ΄λλ 컨ν μ€νΈ(Bounded Context)λ λλ©μΈ μ£Όλ μ€κ³(Domain-Driven Design)μμ μ€μν κ°λ μ€ νλμ λλ€. λ°μ΄λλ 컨ν μ€νΈλ μννΈμ¨μ΄ μμ€ν μ μμ λλ©μΈ λͺ¨λΈλ‘ λΆν νλ κΈ°μ μ κ·Έλ£Ήνλ₯Ό λνλ λλ€. κ° λ°μ΄λλ 컨ν μ€νΈλ νΉμ λΉμ¦λμ€ λλ©μΈκ³Ό κ΄λ ¨λ κΈ°λ₯, κ·μΉ, νλ‘μΈμ€ λ±μ ν¬ν¨νκ³ , ν΄λΉ λλ©μΈμ λν λͺ νν κ²½κ³λ₯Ό μ μν©λλ€.
νΉμ§
κ²½κ³:
κ° λ°μ΄λλ 컨ν μ€νΈλ νΉμ λλ©μΈμ λνλ΄λ©°, ν΄λΉ λλ©μΈμ κ²½κ³λ₯Ό μ μν©λλ€. μλ‘ λ€λ₯Έ λ°μ΄λλ 컨ν μ€νΈλ λ 립μ μΌλ‘ κ°λ°, λ°°ν¬ λ° κ΄λ¦¬λ μ μμ΅λλ€.
λͺ¨λΈ:
λ°μ΄λλ 컨ν μ€νΈλ νΉμ λλ©μΈμ λν λͺ¨λΈμ ν¬ν¨ν©λλ€. μ΄ λͺ¨λΈμ λλ©μΈμ ν΅μ¬ κ°λ , μν°ν°, κ° κ°μ²΄, μ 그리κ²μ΄νΈ λ±μ ν¬ν¨νλ©°, ν΄λΉ λλ©μΈμ νμν λΉμ¦λμ€ κ·μΉκ³Ό λ‘μ§μ λ°μν©λλ€.
μ λΉμΏΌν°μ€ μΈμ΄:
λ°μ΄λλ 컨ν μ€νΈλ νΉμ λλ©μΈμ μ΄ν΄νκΈ° μν κ³΅ν΅ μΈμ΄μΈ μ λΉμΏΌν°μ€ μΈμ΄λ₯Ό μ¬μ©ν©λλ€. μ λΉμΏΌν°μ€ μΈμ΄λ λλ©μΈ μ λ¬Έκ°, κ°λ°μ, μ¬μ©μ λ± λͺ¨λ μ΄ν΄κ΄κ³μλ€μ΄ μ¬μ©ν μ μλ 곡μ μΈμ΄μ λλ€.
컨ν
μ€νΈ λ§€ν:
μλ‘ λ€λ₯Έ λ°μ΄λλ 컨ν μ€νΈ κ°μλ 컨ν μ€νΈ λ§€νμ ν΅ν΄ μνΈμμ©ν μ μμ΅λλ€. 컨ν μ€νΈ λ§€νμ κ° μ»¨ν μ€νΈμ κ²½κ³λ₯Ό λμ΄μ λλ©μΈ μ΄λ²€νΈ, μμ², μλ΅ λ±μ κ΅ννκ³ λ°μ΄ν° μΌκ΄μ±μ μ μ§νλ λ°©λ²μ μ 곡ν©λλ€.
Architecture
Layered
Presentation Laye
Presentation Layerλ μ¬μ©μμ μνΈμμ©νκ³ μ 보λ₯Ό νμνλ λ μ΄μ΄μ λλ€. μ¬μ©μ μΈν°νμ΄μ€(UI)μ κ΄λ ¨λ κΈ°λ₯μ λ΄λΉν©λλ€. μΉ μ ν리μΌμ΄μ μ κ²½μ° HTML, CSS, JavaScriptλ₯Ό μ¬μ©νλ©°, λͺ¨λ°μΌ μ±μ΄λ λ°μ€ν¬ν± μ ν리μΌμ΄μ μμλ ν΄λΉ νλ«νΌμ UI μ»΄ν¬λνΈλ₯Ό μ¬μ©ν©λλ€.
Application Layer
Application Layerλ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ λ μ΄μ΄μ λλ€. μμ© νλ‘κ·Έλ¨μ ν΅μ¬ κΈ°λ₯μ ꡬννκ³ , μ¬μ©μ μμ²μ μ²λ¦¬νμ¬ λλ©μΈ λ μ΄μ΄λ‘ μ λ¬ν©λλ€. μ΄ λ μ΄μ΄λ λλ©μΈμ ν΅μ¬ κ°λ μ μ΄ν΄νκ³ λΉμ¦λμ€ κ·μΉμ μ μ©ν©λλ€.
Domain
Domain Layerλ Layered Architectureμμ μ€μν λΆλΆμ λλ€. λλ©μΈ λ μ΄μ΄λ μννΈμ¨μ΄ μμ€ν μ ν΅μ¬μ λνν©λλ€. λλ©μΈ λͺ¨λΈ, μν°ν°, κ° κ°μ²΄, μ 그리κ²μ΄νΈ λ±μ κ°λ μ ν¬ν¨νλ©°, λλ©μΈ κ·μΉκ³Ό λλ©μΈ νΉν λ‘μ§μ ꡬνν©λλ€.
Infrastructure
Data Access Layerλ λ°μ΄ν°λ² μ΄μ€λ μΈλΆ μμ€ν κ³Όμ μνΈμμ©μ μ²λ¦¬νλ λ μ΄μ΄μ λλ€. λ°μ΄ν° μ‘μΈμ€, λ°μ΄ν° μ‘°μ, λ°μ΄ν°λ² μ΄μ€μμ μ°κ²° λ±μ λ΄λΉν©λλ€. μ΄ λ μ΄μ΄λ λ°μ΄ν° μ μ₯μμμ μΈν°νμ΄μ€λ₯Ό ꡬννκ³ , μμ© νλ‘κ·Έλ¨μ λ°μ΄ν° μꡬλ₯Ό μ²λ¦¬ν©λλ€.
Clean
μν°ν°(Entity):
μν°ν°λ μ ν리μΌμ΄μ μ ν΅μ¬ λΉμ¦λμ€ κ·μΉμ ν¬ν¨νλ κ°μ₯ μμͺ½ λ μ΄μ΄μ λλ€. λλ©μΈ λͺ¨λΈμ ꡬμ±νκ³ λΉμ¦λμ€ λλ©μΈ λ‘μ§μ ν¬ν¨ν©λλ€. μν°ν°λ μμ€ν μ λ€λ₯Έ λ μ΄μ΄μ λ 립μ μΌλ‘ μ‘΄μ¬ν μ μμ΄μΌ ν©λλ€.
μ μ€μΌμ΄μ€(Use Case):
μ μ€μΌμ΄μ€ λ μ΄μ΄λ μν°ν°μ μμ‘΄νλ©°, λΉμ¦λμ€ λ‘μ§μ ꡬνν©λλ€. μ¬μ©μμ μμ²μ μ²λ¦¬νκ³ μν°ν°μ λν μ‘°μμ μ μ΄ν©λλ€. μ μ€μΌμ΄μ€ λ μ΄μ΄λ μ ν리μΌμ΄μ μ νΉμ κΈ°λ₯ λλ μ¬μ© μ¬λ‘μ ν΄λΉνλ μ½λλ₯Ό ν¬ν¨ν©λλ€.
μΈν°νμ΄μ€(Interface):
μΈν°νμ΄μ€ λ μ΄μ΄λ μ¬μ©μμ μμ€ν κ°μ μνΈμμ©μ μ²λ¦¬ν©λλ€. μ΄λ μ¬μ©μ μΈν°νμ΄μ€(UI), μΉ API, CLI(Command Line Interface) λ±μ ν¬ν¨ν μ μμ΅λλ€. μΈν°νμ΄μ€ λ μ΄μ΄λ μ¬μ©μμ μ λ ₯μ λ°μ μ μ€μΌμ΄μ€ λ μ΄μ΄λ‘ μ λ¬νκ³ , κ·Έ κ²°κ³Όλ₯Ό μ¬μ©μμκ² λ°νν©λλ€.
νλ μμν¬ λ° λλΌμ΄λ²(Frameworks and Drivers):
νλ μμν¬ λ° λλΌμ΄λ² λ μ΄μ΄λ μΈλΆ μμμμ μ°λμ λ΄λΉν©λλ€. λ°μ΄ν°λ² μ΄μ€, μΉ νλ μμν¬, μλνν° λΌμ΄λΈλ¬λ¦¬ λ±κ³Όμ μνΈμμ©μ μ²λ¦¬ν©λλ€. μ΄ λ μ΄μ΄λ λ΄λΆμ μμͺ½ λ μ΄μ΄μ λν μμ‘΄μ±μ κ°μ§λ©°, μΈλΆ μμμ λν μΈλΆ ꡬνμ μΊ‘μνν©λλ€.
Hexagonal
μ¬μ©μ μΈν°νμ΄μ€(User Interface):
μ¬μ©μμ μμ€ν κ°μ μνΈμμ©μ μ²λ¦¬ν©λλ€. μ¬μ©μμ μ λ ₯μ λ°κ³ , μΆλ ₯μ νμνλ λ±μ μν μ λ΄λΉν©λλ€.
μ΄ν리μΌμ΄μ (Application):
λΉμ¦λμ€ λ‘μ§μ ν¬ν¨νκ³ μμΌλ©°, μ¬μ©μ μΈν°νμ΄μ€λ‘λΆν°μ μμ²μ μ²λ¦¬ν©λλ€. μ΄λ μμ€ν μ ν΅μ¬ κΈ°λ₯μ ꡬννλ λΆλΆμ λλ€.
ν¬νΈ(Ports):
μΈλΆ μμμμ μνΈμμ©μ μΆμνν©λλ€. μ£Όλ‘ μΈν°νμ΄μ€λ‘μ¨ μν μ νλ©°, μΈλΆ μμ€ν μ΄λ λ°μ΄ν°λ² μ΄μ€ λ±κ³Όμ ν΅μ μ μ²λ¦¬ν©λλ€.
μ΄λν°(Adapters):
ν¬νΈμ μ€μ ꡬν체 κ°μ μ°κ²°μ λ΄λΉν©λλ€. μ΄λν°λ ν¬νΈλ₯Ό ꡬννκ³ , ν΄λΉ ν¬νΈλ₯Ό ν΅ν΄ μΈλΆ μμ€ν κ³Ό μνΈμμ©ν©λλ€.
λλ©μΈ(Domain):
λΉμ¦λμ€ λλ©μΈμ ν΅μ¬ κ·μΉκ³Ό κ°λ μ ν¬ν¨ν©λλ€. λλ©μΈμ μμ€ν μ ν΅μ¬ λ‘μ§μ λ΄λΉνλ©°, λΉμ¦λμ€μ λ³Έμ§μ μΈ νΉμ±μ ννν©λλ€.
μΈνλΌμ€νΈλμ²(Infrastructure):
λ°μ΄ν°λ² μ΄μ€, μΈλΆ μλΉμ€, μΈλΆ μμ€ν κ³Όμ ν΅μ λ±κ³Ό κ°μ΄ μμ€ν μ μΈνλΌλ₯Ό ꡬμ±νλ μμλ€μ ν¬ν¨ν©λλ€.
Reference
μ± : λλ©μΈ μ£Όλ κ°λ° μμνκΈ° - μ΅λ²κ·
Last updated
Was this helpful?