BE/DDD
[DDD Start!] 2. μν€ν μ³ κ°μ
Taylor Kang
2021. 6. 7. 10:00
μν€ν μ³
1. νν ( = UI μμ)
- μ¬μ©μμ μμ²μ λ°μ μμ© μμμ μ λ¬νκ³ , μ²λ¦¬ κ²°κ³Όλ₯Ό λ€μ μ¬μ©μμκ² λ³΄μ¬μ£Όλ μν
- ex. μΉ μ΄ν리μΌμ
- μ€νλ§ MVC νλ μμν¬
- νν μμμ μ¬μ©μλ μΉλΈλΌμ°μ λ₯Ό μ¬μ©νλ μ¬λ or REST APIλ₯Ό νΈμΆνλ μΈλΆ μμ€ν
- 컨νΈλ‘€λ¬ λ μ΄μ΄
2. μμ©
- μμ€ν μ΄ μ¬μ©μμκ² μ 곡ν΄μΌν κΈ°λ₯μ ꡬν - λλ©μΈ μμμ λλ©μΈ λͺ¨λΈμ μ¬μ©
- λ‘μ§μ μ§μ μνν기보λ€λ λλ©μΈ λͺ¨λΈμ λ‘μ§ μνμ μμ
- μλΉμ€ λ μ΄μ΄
3. λλ©μΈ
- λλ©μΈ λͺ¨λΈ(μν°ν°μ λ°Έλ₯)μ ꡬν
- λλ©μΈμ ν΅μ¬ λ‘μ§μ λλ©μΈ λͺ¨λΈμ ꡬν
4. μΈνλΌ μ€νΈλμ³
- ꡬν κΈ°μ μ λν κ²μ λ€λ£Έ.
- ex. DB μ°λ μ²λ¦¬, λ©μμ§ ν μ μ‘/μμ κΈ°λ₯, SMTPλ₯Ό μ΄μ©ν λ©μΌ λ°μ‘ κΈ°λ₯
- λλ©μΈμ 볡μ‘λμ λ°λΌ μμ©/λλ©μΈ κ³μΈ΅μ ν©μΉκΈ°λ ν¨.
- κ³μΈ΅ ꡬ쑰λ₯Ό μ격νκ² μ μ©νλ©΄ μμ κ³μΈ΅μ λ°λ‘ μλ κ³μΈ΅μλ§ μμ‘΄μ κ°μ ΈμΌνμ§λ§ ꡬνμ νΈλ¦¬ν¨μ μν΄ κ³μΈ΅ ꡬ쑰λ₯Ό μ μ°νκ² μ μ©νλ€. (μμ© κ³μΈ΅μ΄ μΈνλΌμ€νΈλμ³ κ³μΈ΅μ μμ‘΄)
- νν/μμ©/λλ©μΈ κ³μΈ΅μ μμΈ κ΅¬ν κΈ°μ μ λ€λ£¨λ μΈνλΌ μ€νΈλμ³ κ³μΈ΅μ μ’
μλκ² λ¨.
- λ¬Έμ 1) μμ λ μ΄μ΄λ§ ν μ€νΈ νκΈ° μ΄λ €μμ§. (ν μ€νΈ μ΄λ €μ) μΈνλΌ μ€νΈλμ³κ° μ νν λμν΄μΌ μλ²½νκ² λμνλ―λ‘.
- λ¬Έμ 2) ꡬν λ°©μμ λ³κ²½νκΈ° μ΄λ €μμ§ (κΈ°λ₯νμ₯μ μ΄λ €μ) κΈ°μ‘΄ μΈνλΌ μ€νΈλμ³μ νΉνλ μ½λκ° μμ λ μ΄μ΄μ μμ±λ μ μμ
DIP (Dependency Inversion Principle; μμ‘΄ μμ λ²μΉ)
- κ³ μμ€ λͺ¨λ: μλ―Έ μλ λ¨μΌ κΈ°λ₯μ μ 곡νλ λͺ¨λ μ μμ€ λͺ¨λ: νμ κΈ°λ₯μ μ€μ λ‘ κ΅¬νν κ² ⇒ DIPλ μ μμ€ λͺ¨λμ΄ κ³ μμ€ λͺ¨λμ μμ‘΄νλλ‘ λ°κΎΌλ€. μΈν°νμ΄μ€λ₯Ό μ¬μ©
- μλΉμ€ λ μ΄μ΄μμ μ¬μ©ν΄μΌνλ ꡬνλΆλ₯Ό μΈν°νμ΄μ€λ‘ λ¨Όμ μ μνκ³ → ꡬν ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μμλ°μμ νμ κΈ°λ₯μ ꡬννλ€.
- μ€μ μ¬μ©ν ꡬν κ°μ²΄λ μμ‘΄ μ£Όμ μ μ΄μ©ν΄μ μ λ¬λ°μ ꡬν κΈ°μ μ λ³κ²½ν΄μΌν κ²½μ°μλ μμ‘΄μ± μ£Όμ λΆλΆλ§ λ³κ²½ν΄μ£Όλ©΄ λ¨.
- ν
μ€νΈ μμλ λμ© κ°μ²΄λ₯Ό μ¬μ©ν΄μ ν
μ€νΈλ₯Ό μ§νν μ μμ
- ex. stubRepo, stubRuleμ Mockito Mock νλ μμν¬λ₯Ό μ΄μν΄μ λμ© κ°μ²΄λ‘ μμ±ν μ μμ
*νμ κΈ°λ₯μ μΆμνν μΈν°νμ΄μ€λ κ³ μμ€ λͺ¨λ κ΄μ μμ λμΆν΄μΌνλ©°, κ³ μμ€ λͺ¨λμ μμΉνλ€. → μ μμ€ λͺ¨λμμ μΈν°νμ΄λ₯Ό μΆμΆνλ©΄ μλλ€. (λ¨μν μΈν°νμ΄μ€μ ꡬνν΄λμ€λ₯Ό λΆλ¦¬νλ κ°λ μ΄ μλ, κ³ μμ€ λͺ¨λμ΄ μ μμ€ λͺ¨λμ μμ‘΄νμ§ μλλ‘ νκΈ° μν¨μ)
- μν€ν μ³ μμ€μμ DIP λ₯Ό μ μ©νλ©΄ μΈνλΌ μ€νΈλμ³ μμμ΄ μμ©/λλ©μΈ μμμ μμ‘΄νλ κ΅¬μ‘°κ° λλ€.
- DIPλ₯Ό μ μ©νλ©΄ μμ μμμ μν₯μ μ΅μννλ©΄μ ꡬν체λ₯Ό λ³κ²½νκ±°λ μΆκ°ν μ μμ
- νμ§λ§ 무쑰건 μΈνλΌ μ€νΈλμ²μ λν μμ‘΄μ μμ λ κ²μ΄ μ’μ κ²μ μλ
- ex. μ€νλ§ νΈλμμ μ²λ¦¬λ₯΄ μν΄ @Transactional μ¬μ© or JPA μ μ© μ΄λ Έν μ΄μ μ λλ©μΈ λͺ¨λΈν΄λμ€μ μ¬μ©νλ κ²½μ°(@Entity, @Table) → ꡬνμ νΈλ¦¬ν¨μ DIPμ μ₯μ λ§νΌ μ€μνλ―λ‘ μ μ°νκ² μ μ©ν΄μΌν¨.
λλ©μΈ μμμ μ£Όμ ꡬμ±μμ
1. Entity μν°ν°
- κ³ μ μ μλ³μλ₯Ό κ°λ κ°μ²΄
- μμ μ λΌμ΄ν μ¬μ΄ν΄μ κ°μ§
- λλ©μΈμ κ³ μ ν κ°λ μ νν (λλ©μΈ λͺ¨λΈμ λ°μ΄ν° + λ°μ΄ν° κ΄λ ¨ κΈ°λ₯)
2. Value λ°Έλ₯
- κ³ μ μ μλ³μλ₯Ό κ°μ§ μλ κ°μ²΄
- κ°λ μ μΌλ‘ νλμΈ λλ©μΈ κ°μ²΄μ μμ±μ νν
- μν°ν°μ μμ± or λ€λ₯Έ λ°Έλ₯ νμ μ μμ±μΌλ‘ μ¬μ©
3. Aggregate μ 그리거νΈ
- κ΄λ ¨ κ°μ²΄(μν°ν°, λ°Έλ₯ κ°μ²΄)λ₯Ό κ°λ μ μΌλ‘ νλλ‘ λ¬Άμ κ²
- ex. 'μ£Όλ¬Έ' μ 그리 κ±°νΈ = Order μν°ν° + OrderLine λ°Έλ₯ + Order λ°Έλ₯ κ°μ²΄
- λλ©μΈμ΄ 컀μ§μλ‘ κ°λ°ν λλ©μΈ λͺ¨λΈλ 컀μ§λ©΄μ λ§μ μν°ν°μ λ°Έλ₯κ° μΆν → 볡μ‘λ λμμ§. → μ 그리거νΈλ₯Ό μ¬μ©νλ©΄ κ΄λ ¨ κ°μ²΄λ₯Ό λ¬Άμ΄μ κ°μ²΄ κ΅°μ§ λ¨μλ‘ λͺ¨λΈμ λ°λΌλ³Ό μ μκ² λ¨
- κ΅°μ§μ μν κ°μ²΄λ€μ κ΄λ¦¬νλ 루νΈμν°ν°λ₯Ό κ°μ§
4. Repository λ ν¬μ§ν 리
- λλ©μΈ λͺ¨λΈμ μμμ± μ²λ¦¬λ₯Ό μν΄μ 물리μ μ μ₯μμ λλ©μΈ κ°μ²΄λ₯Ό 보κ΄ν΄μΌν¨
- ꡬνμ μν λλ©μΈ λͺ¨λΈ (μꡬμ¬νμμ λμΆλλ λλ©μΈ λͺ¨λΈ: μν°ν°/λ°Έλ₯)
- μ κ·Έλ¦¬κ±°νΈ λ¨μλ‘ λλ©μΈ κ°μ²΄λ₯Ό μ μ₯νκ³ μ‘°ννλ κΈ°λ₯μ μ 곡
- ex. DBMS ν μ΄λΈμμ μν°ν° κ°μ²΄λ₯Ό λ‘λ©νκ±°λ μ μ₯νλ κΈ°λ₯ μ 곡
5. Domain Service λλ©μΈ μλΉμ€
- νΉμ μν°ν°μ μνμ§ μμ or μ¬λ¬ μν°ν°μ λ°Έλ₯λ₯Ό νμλ‘ νλ λλ©μΈ λ‘μ§μ μ 곡νλ κ²½μ°
- ex. ν μΈ κΈμ‘ κ³μ° - μν/μΏ ν°/νμλ±κΈ/ꡬ맀κΈμ‘ ...
- λλ©μΈ λͺ¨λΈμ μν°ν° vs DB ν
μ΄λΈμ μν°ν°
- μ°¨μ΄μ 1) λλ©μΈ λͺ¨λΈμ μν°ν°λ λ°μ΄ν°μ λλΆμ΄ λλ©μΈ κΈ°λ₯μ ν¨κ» μ 곡
- μ°¨μ΄μ 2) λλ©μΈ λͺ¨λΈμ μν°ν°λ λ°Έλ₯ νμ μ μ΄μ©ν΄μ κ°λ μ μΌλ‘ νλμΈ λ°μ΄ν°λλ₯Ό λ¬Άμ μ μμ
λͺ¨λ ꡬμ±
- μν€ν
μ³μ κ° μμμ λ³λ ν¨ν€μ§μ μμΉ
- (aggregate λ³λ‘) ui / application / domain / infrastructure
- domain μ΄ ν¬λ©΄ νμ λλ©μΈλ³λ‘ λͺ¨λμ λλλ€.
- (aggregate λ³λ‘) ui / application / domain / infrastructure
*ν ν¨ν€μ§μ κ°λ₯νλ©΄ 10κ° λ―Έλ§μΌλ‘ νμΌ κ°μλ₯Ό μ μ§