λͺ©μ°¨
- entity μ λν 짧μ μκ°
- λͺ¨λ κ°μ²΄κ° entity μΌκΉ?
- value object
- entity μ value object
- value object μ 3κ°μ§ νΉμ±
- μΈ‘λ, μΈ‘μ , μλν, νν
- λΆλ³μ±
- λ±κ°μ±
- value object λ μ΄λ κ² μ΄λ€
- java μμ lombok μ
@Value
κ° μλ€ - value object μ context
- κ°λ μ νλ
- μν°ν°μ μ± μ λΆμ°
- java μμ lombok μ
μλ‘
μ§λμκ°μ μ¬λ¬λ²μ κ±Έμ³μ entity μ λν΄μ μ΄μΌκΈ°λ₯Ό ν΄λ³΄μλ€. κΈ°λ³Έμ μΈ entity μ κ°λ κ³Ό νΉμ± λΆν° μμν΄μ entity μ μλ³μμ λν μ΄μΌκΈ°κΉμ§..
μ΄λ²μκ°μλ μν°ν°μ λλΆμ΄ λλ©μΈ λͺ¨λΈμ ν΅μ¬ ꡬμ±μμμΈ Value Object, κ° κ°μ²΄μ λν΄μ μμ보λλ‘ νκ² λ€
entity μ λν 짧μ recap
value object
λ₯Ό μ΄μΌκΈ°ν λ νμ entity
λ ν¨κ» λ±μ₯νλ€.
value object λ₯Ό μ μ΄ν΄νκΈ° μν΄μ entity μ λν΄μλ μμλ³Ό νμλ μμ§λ§, entity μ λν΄μλ μ§λ μκ° μ΄μΌκΈ°λ₯Ό λ§μ΄ λλ΄κΈ° λλ¬Έμ μμΈν μ€λͺ μ μλ΅νκ³ ν΅μ¬λ§ μ΄μΌκΈ°ν΄λ³΄μ.
entity ν λ¬Έμ₯μΌλ‘ νννμλ©΄ μ΄λ κ² λ§ν μ μλ€
entity: λλ©μΈ κ°μ²΄κ° μ°μμ±μ κ°μ§κΈ° μν΄ μλ³μλ₯Ό λΆμ¬λ°μ, μ ν리μΌμ΄μ λ΄μμ μλ³μ΄ λ μ μλ λμ κ°μ²΄
μ΄λ κ² μλ³μ΄ νμν μ΄μ λ λ°λ‘ μκ°μ νλ¦μ λ°λ₯Έ λ³νλ₯Ό μΆμ νκ³ μΆκΈ° λλ¬Έμ΄λ€.
μΌλ°μ μΌλ‘ μ£Όλ¬Έ(Order)
λλ©μΈμμ μ μ μ μ£Όλ¬Έ νλκ° μ¬λ¬κ°μ§ μνλ₯Ό κ°κ²λλ€.
- μ£Όλ¬Έμμ²
- κ²°μ λκΈ°
- κ²°μ μλ£
- μ£Όλ¬Έ μ±κ³΅
- λ°°μ‘μ€
κ°κ°μ μνμ λ°λΌμ μ£Όλ¬Έ κ°μ²΄κ° ν΄μΌν μΌμ΄ λ€λ₯΄λ€.
μ μ νλ‘μ°μ μ μ κ° κ²°μ λ₯Ό λ§μΉλ©΄ κ²°μ λκΈ°
μ€μ΄λ μ£Όλ¬Έ κ°μ²΄λ₯Ό μλ³νκ³ κ²°μ μλ£
μνλ‘ λ³κ²½νλ μΌλ°μ μΈ νλ¦μ κ°λλ€.
κ·ΈλΌ λͺ¨λ κ°μ²΄κ° entity μ²λΌ μλ³μ±μ΄ νμν κΉ?
κ·Έλ μ§ μλ€. λλ©μΈ λͺ¨λΈμ μ‘΄μ¬νλ λͺ¨λ κ°μ²΄κ° μλ³μ±μ κ°μ§λ©΄ λ§€μ° λ³΅μ‘ν κ΅¬μ‘°κ° λ κ²μ΄λ€.
value object λ μλ³ν΄μΌν νμκ° μλ κ° κ·Έ μ체λ₯Ό μλ―Ένλ€.
entity μ value object λ₯Ό μ μ νκ² μμ΄ λλ©μΈμ λͺ¨λΈλ§νλκ²μ΄ μΌλ°μ μ΄λ€.
value object
Value Object λ λλ©μΈ λͺ¨λΈ λ΄μμ νΉμ ν κ°μ²΄λ₯Ό νννκ³ , μμΉννκ±°λ μΈ‘λνλ μΌλ§ μννλ€.
value λ μΈμ , μ΄λμ, λꡬμμν΄ μμ±λμλ κ·Έλ₯ κ°μΌ λΏμ΄λ€.
μ°λ¦¬κ° μμ κ³Όμ μμ value μ λν μλ³μ μμ΄λ²λ¦°λ€κ³ νλλΌλ entity μ λ¬λ¦¬ λ¬Έμ κ° λμ§ μλλ€.
entity μ value object ꡬλΆνκΈ°
entity μ value λ λλ©μΈ λͺ¨λΈ λ΄μμ μ€μν μν μ μννκ³ , μλ‘ μνΈ λ³΄μμ μΈ μν μ μννλ€.
μμ μ΄μΌκΈ°ν λ΄μ©μ ν λλ‘ μ΄ν΄λ₯Ό λκΈ° μν΄ νκ°μ§ μν©μ κ°μ ν΄λ³΄λλ‘ νκ² λ€.
λλ μΈμμμ λ€λ₯Έ μ¬λλ€κ³Ό ꡬλΆμ΄ λλ€. 'λ' λΌλ μ¬λμ λ€λ₯Έ μ¬λλ€κ³Ό μλ³λμ΄ λ 립μ μΈ κ°μ²΄λ‘μ¨ μ΄μκ°κ² λλ€.
κ·Έλ¦¬κ³ λ
λ₯Ό λ€λ₯Έ μ¬λλ€κ³Ό ꡬλΆνκΈ° λΆλͺ¨λμ λμκ² μ΄λ¦
μ μ§μ΄μ£Όμ
¨κ³ , λλΌλ λμκ² κ³ μ ν μλ―Όμμ μ¦λͺ
νκΈ° μν μ£Όλ―Όλ±λ‘λ²νΈ
λ₯Ό λ°κΈν΄μ£Όμλ€.
μ¬κΈ°μ entity μ value λ₯Ό ꡬλΆν΄λ³΄μ.
- entity: μλ³ν΄μΌν λμ
- value: μ΄λ€ λμμ νννκ³ μμΉννκ±°λ μΈ‘λνλ μ‘΄μ¬
κ·Έλ λ€λ©΄ 'λ' λ entity κ° λ κ²μ΄κ³ , λλ₯Ό μ€λͺ νλ 'μ΄λ¦' μ΄λ 'ν€μ λͺΈλ¬΄κ²' νΉμ 'μ£Όλ―Όλ±λ‘λ²νΈ' λ value κ° λ μ μλ€.
μ°λ¦¬κ° μ΄λ¦μ μΌλ ¨λ²νΈλ₯Ό λΆμ¬νλ μΌμ μλ€. μ΄λ¦μ κ·Έλ₯ μ΄λ¦μ΄λ€.
Value μ νΉμ±
μΌλ°μ μΌλ‘ Value Object λ μ½λλ‘μ primitive value κ° μλ ν΄λΉ value λ₯Ό Wrapping ν κ°μ²΄λ‘ νννλ€.
class Username {
private final String value;
public Username(String value) {
this.value = value;
}
}
μ΄λ κ² Value λ₯Ό Object λ‘ μ¬μ©νλ©΄ primitive type μ value λ³΄λ€ ν¨μ¬ λ readable νλ©°, type safe νλ€.
μ΄μ 본격μ μΌλ‘ Value μ 3κ°μ§μ νΉμ±μ λν΄μ μμ보μ
- λΆλ³μ±
- κ° λ±κ°μ±
value μ νΉμ± 1. λΆλ³μ±
value μ entity μ κ°μ₯ ν° νΉμ±μ΄λΌκ³ νλ€λ©΄ mutable
κ³Ό immutable
μ΄λΌκ³ ν μ μλ€.
μ°μ μ§λ¬Έ νλλ₯Ό ν΄λ³΄κ² λ€.
μ΄λ€ λ°μ΄ν°κ° mutable ν΄μΌνλ μ΄μ λ λκΉ?
entity μ μ‘΄μ¬ μ΄μ μλ λμΌνλ€.
νΉμ κ°μ²΄κ° μ°μμ±μ κ°μ§κ³ μ°μμ±μ λ°λΌ λ€λ₯Έ μν (state) λ₯Ό κ°μ ΈμΌ νκΈ° λλ¬Έμ΄λ€.
κ·Έ μ°μμ±μ μν΄μ μ°λ¦¬λ μλ³μλΌλ κ²μ λΆμ¬νκ³ μ΄λ μμ μ μλ³μλ₯Ό ν΅ν΄μ κ³Όκ±° μνλ₯Ό load νμ¬ μλ‘μ΄ μνλ‘ λ³νμμΌμ€λ€.
νμ§λ§ μ΄λ€ λ°μ΄ν°κ° immutable νλ€λ©΄?
immutable μ΄λΌλ©΄ μΈμ λ , μ΄λ€ μμ μ΄λ μμ±νκ³ μμ΄λ²λ¦΄ μ μλ€. λ³κ²½λ μΌμ΄ μκΈ° λλ¬Έμ μλ³λμ΄μΌν μ΄μ λ μλ€.
λ³κ²½λ νμκ° μλ λ°μ΄ν°λΌλ©΄ μ€νλ € μμ€ν λ΄μμ λ³κ²½λ μ μμμ 보μ₯νλ νΈμ΄ ν¨μ¬ λ«λ€.
μ΄λ»κ² immutable νκ² λ§λ€κΉ?
java μμ immutable νκ² λ§λλ λ°©λ²μ κ°λ¨νλ€.
κ°μ λ³κ²½ν μ μλ μμλ‘ λ§λ€μ΄λ²λ¦¬κ±°λ, ν λ² μμ±λλ©΄ νκ΄΄λ λκΉμ§ λ³κ²½λμ§ μλλ‘ λ§λ€λ©΄ λλ€
- final
- λ³μλ₯Ό μμλ‘ λ§λ€μ΄λ²λ¦°λ€.
- no setter
- κ°μ²΄κ° μλ©Έν λ κΉμ§ λ³κ²½λ μ μλ€.
λΆλ³μ±μ μ΄μ©ν μ
immutable ν νΉμ±μ κ°μ₯ μ μ΄μ©ν μΌλ‘λ λ°λ‘ μν°ν° μλ³μλ₯Ό κ°κ°μ²΄λ‘ λ§λλ κ²μ΄λ€.
μν°ν°μ μλ³μλ μ ν리μΌμ΄μ λ΄μμ λ³κ²½λ μ μμμ 보μ₯ν΄μΌνλ€.
μ§λμκ° μν°ν°μ μλ³μμ λν΄ μ΄μΌκΈ°νλ©° μλ³μ μμ μ±μ λν μ΄μΌκΈ°λ₯Ό νμλ€. μλ³μ μμ μ±μ μλ³μκ° ν λ² ν λΉλλ©΄ λ³κ²½λ μ μλλ‘ νμ¬ μλ³μμ λν΄ side effect free ν νκ²½μ λ§λ€μ΄μ£Όλ κ²μ μλ―Ένλ€
User λΌλ μν°ν°κ° μ‘΄μ¬νλ€λ©΄, μν°ν°μ μλ³μλ‘ primitive type μ μ΄μ©νμ λ, μλ³μ μμ μ±μ΄ μ§μΌμ§μ§ μμ μ μλ€.
κ²°κ΅ μλ³μ κ°μ²΄λ₯Ό immutable ν¨μ 보μ₯νλ Value Object λ‘ λ§λ€μ΄μ μλ³μ μμ μ±μ μ 곡ν μ μλ€.
// μλ³μ μμ μ± x
public class User {
Long id;
}
// μλ³μ μμ μ± o
public class User {
final UserId id; // λ³κ²½ λΆκ°
}
value μ νΉμ± 2. κ° λ±κ°μ±
μλ₯Όλ€μ΄ λ΄κ° κ°μ§ 5λ§μ μ§νμ λ΄ ν΅μ₯μ μλ 5λ§μμ μλ‘ λμΌν κ°μΉλ₯Ό λνλΈλ€.
μ΄λ λ― κ°μ μμ±κ³Ό κ΅¬μ‘°κ° λμΌνλ€λ©΄ μλ‘ κ°λ€κ³ μ΄μΌκΈ°ν μ μλ€.
μ΄λ κ² λ§ν μ μλ μ΄μ λ λ°λ‘ κ°μ λ±κ°μ±μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ΄κ³ value object μμ κ° λ±κ°μ±, λλ±μ±(equality) λΉκ΅λ₯Ό μ§μν΄μΌ νλ€.
μΌλ°μ μΌλ‘ java μμ equals()
λ©μλλ κΈ°λ³Έμ μΌλ‘ κ°μ²΄μ λμΌμ±μ λΉκ΅νκΈ° μν΄ reference λ₯Ό νμΈνλ€.
μ¦, λ κ°μ²΄μ λ©λͺ¨λ¦¬ μ£Όμκ° κ°μμ§λ₯Ό νμΈνκΈ° λλ¬Έμ λμΌν μμ±κ³Ό κ°μ κ°μ§λλΌλ λ€λ₯Έ κ°μ²΄λΌκ³ νννλλ°, Value λ reference λΉκ΅κ° μλ property value, structure λΉκ΅λ₯Ό μνν΄μΌ νλ€.
κ²°κ΅ equals()
μ hashcode() λ©μλλ₯Ό μ¬μ μν΄μ€μΌ νλ€.
equals μ hashcode overriding μ λν΄μλ equalsμ hashCodeλ μ κ°μ΄ μ¬μ μν΄μΌ ν κΉ? μμ μμΈν νμΈν μ μλ€.
Value λ μ΄λ κ² μ΄λ€
μμμ value object μ λν νΉμ±μ μ΄ν΄λ³΄μμΌλ μ΄μ Value Object λ₯Ό μ΄λ»κ² μ¬μ©ν μ§ μ΄μΌκΈ°ν΄λ³΄μ.
- java μμ lombok μ
@Value
κ° μλ€ - value object λ context κ° μ€μνλ€
- κ°λ μ νλ
- entity μ μ± μ λΆμ°
value μ¬μ©νκΈ° 1. java μμ lombok μ @Value
κ° μλ€.
μμ μμλ³Έ Value Object μ 3κ°μ§ νΉμ±μ ꡬννκΈ° μν΄μ λλ lombok μ @Value
μ΄λ
Έν
μ΄μ
μ μ£Όλ‘ μ¬μ©νλ€.
import lombok.Value;
@Value
class Username {
String value;
}
@Value
λ₯Ό μ¬μ©νλ©΄ μ°μ ν΄λΉ κ°μ²΄κ° κ°κ°μ²΄μΈμ§ μλμ§ μ΄λ
Έν
μ΄μ
λ©νλ‘ μ½κ² λͺ
μν μ μλ€λ μ₯μ μ΄ μλ€.
λν Value μ λΆλ³ νΉμ±μ λ§μ‘±μν€κΈ° μν΄μ νμ λ°λ³΅μ μΌλ‘ μμ±νλ private final
μ½λλ₯Ό λμ μμ±ν΄μ£Όλ©° κ° λ±κ°μ±μ μν equals and hash code
λ λμ ν΄μ μμ±ν΄μ€λ€.
equals κ° μ°Έμ‘°κ°μ λν λΉκ΅κ° μλ νΉμ±μΌλ‘ toString()
μμ λ μ΄μ κ°μ²΄ μ£Όμκ°μ μΆλ ₯ν νμκ° μλλ°, μ΄λν @Value
κ° toString()
μ override ν΄μ£ΌκΈ° λλ¬Έμ κ°νΈνλ€.
value μ¬μ©νκΈ° 2. value object λ context κ° μ€μνλ€
λ€λ₯Έ DDD μ μ μ μ μμλ€κ³Ό λ§μ°¬κ°μ§λ‘ value object λ μμ context κ° μ€μνλ€.
μ¦, context μ λ°λΌμ value object λ μλλκ° κ²°μ λλ€λ κ²μ΄λ€
μ°λ¦¬κ° 5λ§μκΆ μ§νλ₯Ό νμ₯ κ°μ§κ³ μλ€κ³ ν΄λ³΄μ. κ·ΈλΌ κ·Έ λμ λκ° λ§λ€μκ³ μΈμ λ§λ€μλμ§ μ€μν κΉ?
λ΄ μμ μλ λλ£ μ§κ°μ μλ 5λ§μκΆκ³Ό λ΄κ° κ°μ§κ³ μλ 5λ§μκΆμ λ°κΎΈμκ³ νλ©΄ λ³ μμ¬μμ΄ λ°κΏ μ μλ€.
μμΌκΉ? λ°λ‘ λμΌν κ°μΉλ₯Ό μ§λκΈ° λλ¬Έμ΄λ€.
λ°λ©΄μ λ²μ£μ μ°λ₯λ μ§νλ λλΌμμ μΌλ ¨λ²νΈλ₯Ό ν΅ν΄ μλ³ν μ μλ€.
μ°λ¦¬κ° λ²μ£μ μ°λ₯λ λμ value object λ‘ λ§λ€λ©΄ μ΄λ»κ² λ κΉ? κ·ΈλΌ μμ νΉμ±μ μν΄μ λμ΄λΌλ value λ μλ³μκ° μκΈ°μ μ°μμ±μ μμ΄λ²λ € μΆμ μ΄ λΆκ°λ₯νκ² λ μ μλ€.
μ΄λ λ― κ°μ λνλ΄λ value object λλΌλ μν©μ λ°λΌμ entity κ° λ μλ μκ³ value object κ° λ μλ μλ€.
value μ¬μ©νκΈ° 3. κ°λ μ νλ
Value Object λ κ° μμ±μ νλ λλ μ¬λ¬κ°λ₯Ό κ°μ§ μ μλ€.
μ¬λ¬κ°μ§ μμ±μ΄ μ‘΄μ¬ν μ μκΈ° λλ¬Έμ μλͺ»λ μ€κ³μ λ°λΌμλ Value Object κ° λͺ¨νΈν κ°λ μΌλ‘ μ§νν κ°λ₯μ±μ΄ μλ€.
κ°λ μ μΌλ‘ νλμ¬μΌ νλ€.
// 5,000,000β© κ°λ
μ νλ, λ νΉμ±μ νλλ‘ λ΄μΌ νλκ° λ¨
class Money {
long value; // 5,000,000
String currency; // μ, λ¬λ¬
}
value μ¬μ©νκΈ° 4. entity μ μ± μ λΆμ°
μ΄ κ°λ μ΄ κ°μ₯ μ€μνλ€.
value λ₯Ό λ¨μ§ entity λ₯Ό νννλ ꡬμ±μλ‘μλ§ μ¬μ©νλ€λ κ²μ anemic ν λλ©μΈ λͺ¨λΈμ΄ λ κ°λ₯μ±μ΄ λλ€.
μμ μλ value λ₯Ό λ¨μ§ primitive type λμ ν΄μ μ΄λ¦μ λΆμ¬νλ λͺ©μ μΌλ‘ μ¬μ©νμλλ°, μ΄λ λ€λ©΄ primitive type μ μ¬μ©νλνΈμ΄ ν¨μ¬ λ«λ€. μ μ ν μ± μμ΄ μλ value object λ μ‘΄μ¬ μ΄μ κ° μλ€.
λ€μ ꡬλ μ λν λ€μ μ²κ΅¬λ₯Ό μμ±νλ λλ©μΈ λͺ¨λΈλ§μ λ΄λ³΄μ
μ¬μ©μλ Subscription κ°μ²΄μκ² λ€μ μ²κ΅¬ μμ±μ μμ²νλ€.
κ·Έ λμ μ°Έμ¬ κ°μ²΄λ€μ Value Object λ₯Ό μ΄μ©νμ¬ λͺ¨λΈλ§ν μ½λμ΄λ€.
public class Subscription {
ReservedBill bill; // λ€μ μ²κ΅¬
}
@Value(staticConstructor = "of")
public class ReservedBill {
ReservedAt reservedAt; // μ²κ΅¬ μμ½μΌ
BillInterval interval; // μ²κ΅¬ μ£ΌκΈ°
}
@Value(staticConstructor = "of")
public class ReservedAt { // μ²κ΅¬ μμ½μΌ
LocalDateTime value; // μ²κ΅¬ μμ½μΌμ value
}
@Value(staticConstructor = "of")
public class BillInterval { // μ²κ΅¬ μ£ΌκΈ°
long value; // μ£ΌκΈ° value
IntervalUnit unit; // μ£ΌκΈ°μ λ¨μ
}
public enum IntervalUnit {
DAY,
MONTH
}
ν΄λμ€λͺ λ§ λ³΄λλΌλ Value Object μ λν λλ©μΈ λͺ¨λΈλ§μ΄ μ λμ΄μκ³ , κ°κ°μ Value λ€μ΄ κ°λ μ νλλ₯Ό νννκ³ μλ€.
κ·Έλ¦¬κ³ μμ μν©μ ꡬννκΈ° μν΄μ λλ μ΄λ κ² μ½λλ₯Ό μ§λ΄€λ€.
public class Subscription {
ReservedBill bill;
public void reserveNextBill() {
ReservedAt reservedAt = bill.getReservedAt();
BillInterval interval = bill.getInterval();
if (MONTH.equals(interval.getUnit())) { // μ²κ΅¬ μ£ΌκΈ°κ° 'μ' μ΄λΌλ©΄
LocalDateTime past = reservedAt.getValue();
// interval λ§νΌ μμ½μΌμ plus
LocalDateTime next = past.plusMonths(interval.getValue());
ReservedAt nextReservedAt = ReservedAt.of(next);
// λ€μ bill μμ±
this.bill = ReservedBill.of(nextReservedAt, interval);
} else if (DAY.equals(interval.getUnit())) {
// TODO impl
}
}
}
μ μ½λλ value object μ μ± μ λΆμ°μ΄ μ μ νκ² μνλμ§ μμλ€κ³ ν μ μλ€. κ·Έλ₯ primitive value λ₯Ό wrpping νκ² κ·Έ μ΄μλ μ΄νλ μλλ€.
Subscription μμ reserveNextBill()
μ΄λΌλ λ©μλλ₯Ό ν΅ν΄ μ²κ΅¬λ₯Ό μμ½νλ ν΄λΌμ΄μΈνΈ μ
μ₯μμλ μΊ‘μνκ° μ λμμμ§λ λͺ°λΌλ, entity μ value object κ°μ μ±
μ λΆλ°°κ° μ μ νκ² μ΄λ€μ§μ§ μμλ€.
μ΄λ Value Object λ₯Ό λ¨μν value data holder λ‘λ§ λ°λΌλ³΄μκΈ° λλ¬Έμ΄λ€.
Value Object κ° μ§μ ν λΉμ λ΄κΈ° μν΄μλ Value λ§μ μ± μμ λΆμ¬ν΄μΌνλ€.
Value Object λ₯Ό data holder λ‘ μ¬μ©νλ μμ μμ λ₯Ό μ± μκ³Ό μν μ λ°λΌ λ€μκ³Ό κ°μ΄ 리ν©ν λ§ν μ μλ€.
public class Subscription {
private ReservedBill bill;
public void reserveNextBill() {
this.bill = bill.reserve(); // μμ½ μμ²
}
}
Subscription μ ReservedBill μκ² λ€μ μ²κ΅¬λ₯Ό μμ±νλΌκ³ μμ²νλ€.
Subscription μ μ₯μμλ μΈλΆμ μΈ λ΄μ©μ μ νμκ° μλ€. λ¨μ§ μμ²ν λΏμ΄λ€.
κ·ΈλΌ ReservedBill μ΄ λ€μ κ³Όμ μ κ±°μ³μ nextBill μ μμ±νλ€
@Value(staticConstructor = "of")
public class ReservedBill {
ReservedAt reservedAt;
BillInterval interval;
public ReservedBill reserve() {
ReservedAt nextReservedAt = reservedAt.next(interval); // reservedAt μκ² κ³μ° μμ²
return ReservedBill.of(nextReservedAt, this.interval); // value λ°ν
}
}
nextBill μ μμ±ν λμλ ReservedAt μ μ΄λ»κ² κ³μ°νλμ§ μ νμκ° μλ€.
μ€μ λ‘ ReservedAt μκ² μ μ ν κ·Όκ±°λ₯Ό νλΌλ―Έν°λ‘ λ겨 νλ ₯ν λΏμ΄λ€
@Value(staticConstructor = "of")
public class ReservedAt {
LocalDateTime value;
public ReservedAt next(BillInterval interval) {
if (MONTH.equals(interval.getUnit())) {
return ReservedAt.of(value.plusMonths(interval.getValue()));
}
throw new UnsupportedOperationException();
}
}
μ΄λ κ² ν¨μΌλ‘μ¨ κ°κ°μ Value κ° μ± μμ κ°κ³ entity μ νλ ₯μ νκ² λλλ°, μ΄κ²μ΄ λ°λ‘ Value Object μ λ³Έμ§μ΄λ€.
μ΄μ©λ©΄ DDD μ λͺλͺ μ μ μ ν¨ν΄μ κ°μ²΄λ₯Ό μ μ§ν₯νλ λ°©λ²μ λ§νλκ² κ°κΈ°λ νλ€. κ°μ²΄μ μν κ³Ό μ± μ, νλ ₯κ³Ό μΊ‘μνκ° DDD μ κ·Όκ°μ΄λΌ μκ°νλ€
λ§μΉλ©°
value object λ μ΄μ©λ©΄ DDD μ μ¬λ¬ μ μ μ€μ κ°μ₯ λ§μ΄ μ¬μ©λλ μ μ μ΄ μλκΉ μκ°νλ€.
κ³Όκ±°μ DDD μ κ²½νμ΄ νλΆν ν μλμ΄ κ°λ°μλ‘λΆν° λΉμ μ Value Object λ λ무 λΉμ½ν΄μ, κ·Έλ₯ κ°λ€μ κ°μ²΄λ‘ λ§λ κ² λΏμ΄μμ.
λΌλ νΌλλ°±μ λ°μλ€.
κ·Έ λΉμμλ λ΄κ° λ§λ Value Object κ° λ λ ν μ μμμ§ λͺ°λλλ°, μ μ μκ°μ΄ μ§λ μλ‘ κ·Έ μ°¨μ΄κ° λκ»΄μ‘κ³ μ΄λ² κΈμ ν΅ν΄μ λλ Value Object μ λν΄ λ κ°κΉμμ§κ² κ°λ€.
Value Object μΌ λ§λ‘ rich domain model μ λ§λ€ μ μλ κ°μ₯ μ½κ³ μμ ν κΈΈμ΄ μλκΉ μκ°νκΈ°λ νλ€.
μ΄ κΈμ 보λ μ¬λ¬λΆλ κ·Έλ¬ν μΈμ¬μ΄νΈκ° λμμΌλ©΄ μ’κ² λ€.
Value Object μ λν΄μλ μμ§ νμ§ λͺ»ν μ΄μΌκΈ°κ° λ§λ€.
ORM μ΄ defacto κ° λ νμ¬, Value Object λ₯Ό μ μ₯νκΈ° μν΄μ κ²ͺμ΄μΌ νλ λͺκ°μ§μ λΆνΈν μ λ€κ³Ό κ·Έ ννΌ κΈ°λ²λ€μ λν΄μ κΈ°νκ° λλ€λ©΄ κΈμ μ¨λ³΄λλ‘ νκ² λ€.
'π¬web application > - DDD' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
DDD μ aggregate μ λν μ΄μΌκΈ° (1) | 2024.04.10 |
---|---|
[DDD] Entity μ μλ³μ(identifier) μ λν μ¬λ¬ μ΄μΌκΈ° (2) | 2023.07.15 |
[DDD] Entity μ λν μ¬λ¬ μ΄μΌκΈ° (0) | 2023.07.15 |
Repository Pattern - μ€μ νΈ (Spring μμ DIP λ₯Ό ν΅ν΄ Repository μ μ μΈκ³Ό ꡬν λΆλ¦¬μν€κΈ°) (6) | 2022.08.28 |
[DDD] Repository Pattern μ΄λ, μ΄λ‘ νΈ (0) | 2022.08.23 |
λκΈ