λλ©μΈ
π λλ©μΈμ΄λ ?
- μννΈμ¨μ΄λ‘ ν΄κ²°νκ³ μ νλ λ¬Έμ μμ
- μ¨λΌμΈ μ±
μ ν맀νλ μμ μμ€ν
μ ꡬννκ³ ν λ, λλ©μΈκ³Ό νμ λλ©μΈμ μλμ κ°μ΄ λΆλ₯ν μ μμ
- λλ©μΈ : μ¨λΌμΈ μμ
- νμ λλ©μΈ : νμ, μν, μ£Όλ¬Έ, κ²°μ , λ°°μ‘, μ μ°, λ¬Έμ λ±
- ν νμ λλ©μΈμ λ€λ₯Έ νμ λλ©μΈκ³Ό μ°λνμ¬ μμ ν κΈ°λ₯μ μ 곡
- 물건 ꡬ맀 : μ£Όλ¬Έ, κ²°μ , λ°°μ‘, μ μ°
- νΉμ λλ©μΈμ μν μννΈμ¨μ΄λΌκ³ ν΄μ λλ©μΈμ΄ μ 곡ν΄μΌ ν λͺ¨λ κΈ°λ₯μ μ§μ ꡬννλ κ²μ μλ
- μΈλΆ PG, μΈλΆ μ±ν μ루μ
- λλ©μΈ λ§λ€ κ³ μ λ νμ λλ©μΈμ΄ νμ μ‘΄μ¬νμ§λ μμ
- λλ©μΈμ μ 곡ν λμμ λ°λΌ λ¬λΌμ§κΈ°λ ν¨
λλ©μΈ λͺ¨λΈ
π λλ©μΈ λͺ¨λΈμ΄λ?
- νΉμ λλ©μΈμ κ°λ μ μΌλ‘ ννν κ²μ΄κ³ , λλ©μΈ μ체λ₯Ό μ΄ν΄νκΈ° μν κ°λ λͺ¨λΈ
- λλ©μΈμ λͺ¨λ λ΄μ©μ λ΄κ³ μμ§λ μμ§λ§, μ¬λ¬ κ°λ°μλ€μ΄ λμΌν λͺ¨μ΅μΌλ‘ λλ©μΈ μ΄ν΄ λ° λλ©μΈ μ§μμ 곡μ νλλ° λμμ΄ λ¨
- λλ©μΈμ μ΄ν΄νκΈ° μν΄μ ννλ°©μμ λ€μν μ μμ
λλ©μΈ λͺ¨λΈ μ’ λ₯ μμ
- ν΄λμ€ λ€μ΄μ΄κ·Έλ¨ : κΈ°λ₯κ³Ό λ°μ΄ν°λ₯Ό ν¨κ» 보μ¬μ€
- μν λ€μ΄μ΄κ·Έλ¨ : νΉμ λλ©μΈμ μνμ μ΄λ₯Ό λνλ
λλ©μΈ λͺ¨λΈ ν¨ν΄
π λλ©μΈ λͺ¨λΈ ν¨ν΄μ΄λ?
- λλ©μΈ κ·μΉμ κ°μ²΄ μ§ν₯ κΈ°λ²μΌλ‘ ꡬννκ³ , ν΄λΉ μ½λλ₯Ό λλ©μΈ κ³μΈ΅μ μμΉμν΄
- Presentation(νν)
- μ¬μ©μμ μμ²μ μ²λ¦¬νκ³ μ¬μ©μμκ² μ 보λ₯Ό 보μ¬μ€
- Application(μμ©)
- μ¬μ©μκ° μμ²ν κΈ°λ₯μ μ€ν
- μ 무 λ‘μ§μ μ§μ ꡬννμ§ μμΌλ©° λλ©μΈ κ³μΈ΅μ μ‘°ν©ν΄μ κΈ°λ₯μ μ€ν
- Domain(λλ©μΈ)
- μμ€ν μ΄ μ 곡ν λλ©μΈμ κ·μΉμ ꡬν
- Intrastructure(μΈνλΌμ€νΈλμ³)
- μΈλΆ μμ€ν κ³Όμ μ°λμ μ²λ¦¬(DB, Messaging λ±)
EX) μ£Όλ¬Έμ κ΄ν λλ©μΈ λͺ¨λΈ ν¨ν΄μ μ μ©ν μ½λ (μ건 : μΆκ³ μ λ°°μ‘μ§ λ³κ²½ κ°λ₯)
public class Order {
private OrderStatus status;
private ShippingInfo shippingInfo;
//μΆκ³ μ μ λ°°μ‘μ§λ₯Ό λ³κ²½ν μ μμ (λκΈ° μ€ : PAYMENT_WAITING, μ€λΉ μ€ : PREPARING)
public void changeShippingInfo(ShippingInfo newShippingInfo) {
if (!status.isShippingChangeable()) {
throw new IllegalStateException();
}
this.shippingInfo = newShippingInfo;
}
}
public enum OrderStatus {
PAYMENT_WAITING {
public boolean isShippingChangeable() {
return true;
}
},
PREPARING {
public boolean isShippingChangeable() {
return true;
}
},
SHIPPED, DELIVERING, DELIVERY_COMPLETED;
public boolean isShippingChangeable() {
return false;
}
}
ν΅μ¬ κ·μΉμ ꡬνν μ½λκ° λλ©μΈ λͺ¨λΈμλ§ μμΉνκΈ° λλ¬Έμ, κ·μΉμ΄ λ°λκ±°λ κ·μΉμ νμ₯ν΄μΌ ν λ λ€λ₯Έ μ½λμ μν₯μ λ μ£Όκ³ λ³κ²½ λ΄μμ λͺ¨λΈμ λ°μν μ μκ² λ¨
λλ©μΈ λͺ¨λΈ μμ± μ μμ¬ν
π μ²μμλ κ°μ μμ€μ κ°λ λͺ¨λΈμ μμ±νμ¬ λλ©μΈμ λν μ 체 μ€κ³½μ μ΄ν΄νλλ° μ§μ€νκ³ , ꡬννλ κ³Όμ μμ κ°λ λͺ¨λΈμ ꡬν λͺ¨λΈλ‘ μ μ§μ μΌλ‘ λ°μ
- κ°λ λͺ¨λΈμ λ§λ€λ μ²μλΆν° μλ²½νκ² λλ©μΈμ νννλ λͺ¨λΈμ λ§λλ μλλ₯Ό ν μ μμ§λ§ μ€μ λ‘ μ΄λ λΆκ°λ₯μ κ°κΉμ
- μννΈμ¨μ΄λ₯Ό κ°λ°νλ λμ λλ©μΈμ μ μ λ μ΄ν΄νκ² λκΈ° λλ¬Έμ, μκ°μ΄ μ§λκ°μ λ°λΌ λͺ¨λΈμ μμ νλ κ²½μ°κ° λ§κΈ° λλ¬Έ (μ§μμ΄ μμ΄λ©΄μ μμ ν λ€λ₯Έ μλ―Έλ‘ ν΄μλμ΄μ§λ μν©λ μ‘΄μ¬)
λλ©μΈ λͺ¨λΈ λμΆ
π λλ©μΈμ λͺ¨λΈλ§ν λ κΈ°λ³Έμ΄ λλ μμ μ?
- μꡬμ¬νμΌλ‘ λΆν° μλμ μμλ€μ μ°ΎμμΌν¨
1. ν΅μ¬ ꡬμ±μμ
2. κ·μΉ
3. κΈ°λ₯
- μꡬμ¬νμ ν΅ν΄ μ 곡ν΄μΌ νλ κΈ°λ₯μ λμΆ κ°λ₯
- μΆκ³ μνλ‘ λ³κ²½
- λ°°μ‘μ§ μ 보 λ³κ²½
- μꡬμ¬νμ ν΅ν΄ νΉμ νλͺ©μ΄ μ΄λ€ λ°μ΄ν°λ‘ ꡬμ±λμ΄μΌ νλμ§ μ μ μμ
- ν μνμ νκ° μ΄μ μ£Όλ¬Έ
- κ° μνμ ꡬ맀 κ°κ²© ν© = (μν κ°κ²© * ꡬ맀 κ°μ)
- μꡬμ¬νμ ν΅ν΄ κ° νλͺ©κ°μ κ΄κ³λ₯Ό μ μ μμ
- μ£Όλ¬Έμ μ΅μ ν μ’ λ₯ μ΄μμ μνμ ν¬ν¨ ν΄μΌ ν¨
- μꡬμ¬νμ λ°λΌ νΉμ 쑰건μ΄λ μνμ λ°λΌ μ μ½μ΄ κ·μΉμ΄ λ¬λ¦¬ μ μ©λλ κ²½μ°
- μΆκ³ λ₯Ό νλ©΄ λ°°μ‘μ§ μ 보λ₯Ό λ³κ²½ν μ μμ
- μΆκ³ μ μ μ£Όλ¬Έμ μ·¨μν μ μμ
- κ³ κ°μ΄ κ²°μ μλ£νκΈ° μ μλ μνμ μ€λΉνμ§ μμ
λλ©μΈ λͺ¨λΈ λ¬Έμν λ° κ³΅μ
π μ λ°μ μΈ κΈ°λ₯ λͺ©λ‘μ΄λ λͺ¨λ ꡬ쑰λ μμ μμ€μμ μ 리λ λ¬Έμλ₯Ό μ°Έμ‘°νλ κ²μ΄ μννΈμ¨μ΄ μ λ°μ λΉ λ₯΄κ² μ΄ν΄ νλλ° λμ
λ κΉκ² μ΄ν΄κ° νμκ° μλ λΆλΆμ μ½λλ‘ λΆμνκ³ , λλ©μΈ μ§μμ΄ μ 묻μ΄λλλ‘ μ½λ μ체λ λ¬Έμνμ λμ
μν°ν°μ λ°Έλ₯
π λͺ¨λΈμ ν¬κ² μν°ν°μ λ°Έλ₯λ‘ κ΅¬λΆ
λΆλ₯ | DTO | VO | Entity |
μ μ | κ° κ³μΈ΅κ° λ°μ΄ν° μ μ‘ | κ° ννμ© | DB ν μ΄λΈ 맀νμ© |
μλ³μ ν¬ν¨ μ¬λΆ | X | X | O |
μν λ³κ²½ κ°λ₯ μ¬λΆ | κ°λ³ / λΆλ³ | λΆλ³ | κ°λ³ / λΆλ³ |
Business λ‘μ§ ν¬ν¨ μ¬λΆ | X | O | O |
Getter ν¬ν¨ μ¬λΆ | O | O | O |
Setter ν¬ν¨ μ¬λΆ | O | X | O |
equals & hashCode ꡬν μ¬λΆ | X | O | O |
DTO
- κ° κ³μΈ΅κ° λ°μ΄ν° κ΅νμ μν κ°μ²΄
- Business λ‘μ§μ ν¬ν¨νμ§ μμ
- getter / setter λͺ¨λ κ°μ§ μ μμ
VO
- κ°λ
μ μΌλ‘ μμ ν νλλ₯Ό ννν λ μ¬μ©
- μ°νΈλ²νΈ, μ£Όμ, μμΈμ£Όμ → μ£Όμ (λ¬Άμ΄μ νν)
public class ShippingInfo {
...
private Address address;
...
}
public class Address {
private String postalCode;
private String address;
private String addressDetail;
}
- λ³΄λ€ λͺ
ννκ² ννν μ μκ²λκ³ , μ½λμ κ°λ
μ±λ μ¬λΌκ°
- μλ³μμ μλ―Έλ₯Ό λ³΄λ€ λͺ ννκ² λͺ μνκΈ° μν΄μ μ¬μ©
public class Order {
private OrderNo id;
...
public OrderNo getId() {
return id;
}
}
- μμμ λ VOμ μ£Όμκ° λ¬λΌλ, λ΄μ©μ΄ λμΌνλ€λ©΄ λ VO λ λμΌνλ€κ³ νλ¨
- equals / hashCodeλ₯Ό ꡬν
Entity
- κ° Entity λ κ³ μ ν μλ³μλ₯Ό κ°μ§κ³ μμ
- μμ±λ°©λ²
- UUID
- νΉμ ν κ·μΉ : νμ¬ μκ°κ³Ό λ€λ₯Έ κ°μ μ‘°ν©νμ¬ μ¬μ©
- κ° μ§μ μ λ ₯ : νμ ID, Email
- μΌλ ¨λ²νΈ : DB Auto Increment
- μμ±λ°©λ²
- μμμ λ Entityμ μλ³μκ° κ°μΌλ©΄ λ Entityλ λμΌνλ€κ³ νλ¨
- equals / hashCodeλ₯Ό μλ³μλ₯Ό κΈ°μ€μΌλ‘ ꡬν
λλ©μΈ λͺ¨λΈμ Setterλ₯Ό μΆκ°νλ€λ©΄?
- λλ©μΈμ ν΅μ¬ κ°λ μ΄λ μλλ₯Ό μ½λμμ μ¬λΌμ§κ² ν¨
- λλ©μΈ κ°μ²΄λ₯Ό μμ±ν λ μμ ν μνκ° μλμλ μκ² λ§λ¬
- λλ©μΈ κ°μ²΄κ° λΆμμ ν μνλ‘ μ¬μ©λλκ²μ λ§μΌλ €λ©΄ μμ±μμ μ νμν κ²μ λͺ¨λ μ λ¬ν΄μ€μΌ ν¨
π equals / hashCode λ?
* equals : λκ°μ κ°μ²΄κ° λ΄μ©μ΄ κ°μμ§ νμΈ
→ λ Object == λΉκ΅λ₯Ό λμ΄, κ°μ΄ κ°μμ§ λΉκ΅νλ €λ©΄ equals()λ₯Ό @Override
* hashCode : λκ°μ κ°μ²΄κ° κ°μ κ°μ²΄μΈμ§ νμΈ
→ equals()κ° trueμΈ λ Objectλ₯Ό HashMapμ putμ ν λ λμΌν Keyλ‘ μΈμνκ³ μΆμ κ²½μ°μ hashCode()λ₯Ό @Override
λλ©μΈ μ©μ΄
π λλ©μΈ μ©μ΄λ₯Ό μ½λμ λ°μνμ§ μμΌλ©΄?
- κ°λ°μκ° μ½λμ μλ―Έλ₯Ό ν΄μν΄μΌ νλ λΆλ΄μ΄ μκΉ
// BAD
public enum OrderStatus {
STEP1, STEP2, STEP3, STEP4 ..
}
// GOOD
public enum OrderStatus {
PAYMENT_WAITING, PREPARING, SHIPPED, DELIVERING ..
}
- κ°κ°μ STEPμ΄ μ΄λ μνλ₯Ό λνλ΄λμ§ μ§κ΄μ μΌλ‘ 보μ΄μ§ μμ νμ μ΄ νλ¬
- νμ νλλΌλ κ·Έ μνλ‘ λ§€λ² λ¨Έλ¦ΏμμΌλ‘ λ³ννλ κ³Όμ μ΄ μΆκ°
- λλ©μΈ μ©μ΄λ₯Ό μ½λμ μ§μ μ¬μ©ν΄μ μ΄λ° λΆνμν κ³Όμ μ μ€μ΄κ³ , μ½λκ° λ°λ‘ μ΄ν΄λ μ μλλ‘ ν΄μ£Όλ κ²μ΄ μ’μ
μ΅λ²κ· μκ°λμ DDD START! 1μ₯μ μμ½νμ΅λλ€.
'Programming Books > DDD START!' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Chapter 2. μν€ν μ² κ°μ (0) | 2022.08.15 |
---|
λκΈ