LUCATHREE.COM

← Back to list
🧐 TIL

[DDD] κ°’ 객체, Value Object

μž‘μ„±μΌ:
TILDDDArchitecture

κ°’ κ°μ²΄λž€

κ°„λ‹¨ν•˜κ²ŒλŠ” λ„λ©”μΈμ˜ 고유 κ°œλ…μ„ κ°’μœΌλ‘œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ •μ˜ν•˜λŠ” 객체.
μ—¬κΈ°μ„œ β€˜κ°’β€™μ€ λ§κ·ΈλŒ€λ‘œ λ³€μˆ˜λ‚˜ λ‹€λ₯Έ 클래슀의 μ†μ„±μœΌλ‘œ λŒ€μž…ν•  수 μžˆλŠ” 값을 μ˜λ―Έν•œλ‹€.
μΌλ°˜μ μœΌλ‘œλŠ” 파이썬의 str, int, float 처럼 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ³„λ‘œ μ‘΄μž¬ν•˜λŠ” μ›μ‹œ 데이터가 κ°’μœΌλ‘œ 많이 μ‚¬μš©λ˜μ§€λ§Œ μ‹œμŠ€ν…œμ— 따라 μ‚¬μš©ν•  수 μžˆλŠ” κ°’μ˜ 쑰건이 λ‹¬λΌμ§ˆ μˆ˜λ„ μžˆλ‹€.
예λ₯Ό λ“€μ–΄ β€˜μ΄λ¦„β€™μ€ λ‹¨μˆœ λ¬Έμžμ—΄λ‘œ λ³Ό μˆ˜λ„ μžˆμ§€λ§Œ μ„±κ³Ό 이름이 λΆ„λ¦¬λ˜μ–΄μ•Ό ν•  μˆ˜λ„ 있고 νŠΉμˆ˜λ¬Έμžκ°€ μ‚¬μš©λ˜λ©΄ μ•ˆλ  μˆ˜λ„ μžˆλ‹€. 그리고 β€˜λ‚˜μ΄β€™λŠ” λ‹¨μˆœ 숫자둜 생각할 μˆ˜λ„ μžˆμ§€λ§Œ 0μ„Έ λ―Έλ§Œμ€ 쑴재 ν•  수 μ—†κ³  만 λ‚˜μ΄λ₯Ό ꡬ뢄해야 ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€.
κ·Έλž˜μ„œ μœ„μ™€ 같은 κ²½μš°μ—λŠ” 이름에 str νƒ€μž…μ„ μ“°λŠ” λŒ€μ‹  Name μ΄λΌλŠ” 클래슀λ₯Ό μ •μ˜ν•˜κ±°λ‚˜ λ‚˜μ΄μ— int λŒ€μ‹  Age λΌλŠ” 클래슀λ₯Ό μ •μ˜ν•˜κ³  각각 속성과 쑰건을 λΆ€μ—¬ν•΄ 쀄 μˆ˜λ„ μžˆλ‹€.
이처럼 κ°’ κ°μ²΄λŠ” 도메인 특유의 쑰건, κ·œμΉ™ 등이 λ‹΄κΈ΄ 객체이자 λ™μ‹œμ— 값이닀.

κ°’μ˜ νŠΉμ„±

값은 λŒ€ν‘œμ μœΌλ‘œ μ„Έ κ°€μ§€ μ„±μ§ˆμ„ κ°€μ§€κ³  μžˆλ‹€.
  • λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 주고받을 수 μžˆλ‹€.
  • 등가성을 비ꡐ할 수 μžˆλ‹€.

κ°’μ˜ λΆˆλ³€μ„±

λ³€μˆ˜μ— μƒˆλ‘œμš΄ 값을 λŒ€μž…ν•˜λŠ” 것은 κ°€λŠ₯ν•˜μ§€λ§Œ κ°’ μžμ²΄λŠ” λ°”λ€Œμ–΄μ„œλŠ” μ•ˆλ˜λ©° 값이 λ°”λ€λ‹€λŠ” 것은 버그가 λ°œμƒν™œ ν™•λ₯ μ„ 높인닀.
클래슀의 속성을 μˆ˜μ •ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό λ§Œλ“œλŠ” 것은 μ–΄λ ΅μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 문제λ₯Ό λŠλΌμ§€ λͺ»ν•  μˆ˜λ„ μžˆμ§€λ§Œ 숫자 2κ°€ κ°‘μžκΈ° 3이 λœλ‹€κ±°λ‚˜ β€œμ•ˆλ…•ν•˜μ„Έμš”β€κ°€ λ§ˆμŒλŒ€λ‘œ β€œHelloβ€λ‘œ λ°”λ€Œλ©΄ μ•ˆλ˜λ“―μ΄ 값은 λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€λŠ” 것이 μ „μ œλ˜μ–΄μ•Ό μ•ˆμ‹¬ν•˜κ³  값을 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— κ°’ κ°μ²΄μ—μ„œλ„ 이미 μ •μ˜λœ 값은 λ°”λ€Œμ–΄μ„œλŠ” μ•ˆλœλ‹€.

κ°’μ˜ κ΅ν™˜ κ°€λŠ₯μ„±

값은 λ³€ν•΄μ„œλŠ” μ•ˆλ˜μ§€λ§Œ λ§Œμ•½ νšŒμ›κ°€μž…μ‹œ μž…λ ₯ν•œ 이름을 μˆ˜μ •ν•˜λŠ” 것 처럼 값을 μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ—λŠ” μ–΄λ–»κ²Œ ν• κΉŒ? 이런 κ²½μš°μ—λŠ” κ°’ 자체λ₯Ό μˆ˜μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ λŒ€μž…λ¬Έμ„ 톡해 값을 κ΅ν™˜ν•˜λŠ” 방식을 μ‚¬μš©ν•œλ‹€.
νšŒμ›μ •λ³΄μ˜ μ΄λ¦„μ΄λΌλŠ” 속성에 κΈ°μ‘΄μ—λŠ” β€œJohnβ€μ΄λΌλŠ” 값이 μžˆμ—ˆλ‹€λ©΄ 이름을 λ°”κΎΈκΈ° μœ„ν•΄ β€œJohn” μ΄λΌλŠ” λ¬Έμžμ—΄μ„ μˆ˜μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ β€œTom” μ΄λΌλŠ” μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ 이름에 λŒ€μž…ν•΄μ£ΌλŠ” 것이닀.
κ°’ κ°μ²΄λŠ” λΆˆλ³€μ΄κΈ° λ•Œλ¬Έμ— λŒ€μž…λ¬Έμ„ ν†΅ν•œ κ΅ν™˜ μ™Έμ˜ μˆ˜λ‹¨μœΌλ‘œλŠ” μˆ˜μ •μ„ λ‚˜νƒ€λ‚Ό 수 μ—†λ‹€.

λ“±κ°€μ„± 비ꡐ κ°€λŠ₯

숫자 ν˜Ήμ€ 문자끼리 비ꡐ가 κ°€λŠ₯ν•˜λ“―μ΄ 같은 μ’…λ₯˜μ˜ κ°’λΌλ¦¬λŠ” 비ꡐ할 수 μžˆμ–΄μ•Ό ν•œλ‹€.
μ΄λ•Œ, κ°’ κ°μ²΄κ°„μ˜ 비ꡐλ₯Ό μœ„ν•΄μ„œλŠ” 객체의 속성을 κΊΌλ‚΄μ„œ 직접 λΉ„κ΅ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 객체간 비ꡐλ₯Ό ν•  수 μžˆλŠ” λ©”μ„œλ“œ μ •μ˜κ°€ ν•„μš”ν•˜λ‹€.
λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” μ΄μœ μ—λŠ” 값은 κ°’ 자체둜 비ꡐλ₯Ό ν•˜λŠ” 것이 μžμ—°μŠ€λŸ½κΈ° λ•Œλ¬Έμ΄λΌλŠ” 점도 μžˆμ§€λ§Œ, λ©”μ„œλ“œκ°€ 없을 경우 객체간 비ꡐλ₯Ό μœ„ν•œ μ½”λ“œλ₯Ό ν•„μš”ν•  λ•Œλ§ˆλ‹€ μž‘μ„±ν•΄μ€˜μ•Ό ν•˜λŠ”λ° 이둜 인해 객체 비ꡐ μ½”λ“œκ°€ μ—¬λŸ¬ 곳에 μž‘μ„±λ˜μ–΄ 있으면 λ‚˜μ€‘μ— κ°’ 객체에 속성이 좔가됐을 λ•Œ μ‚°κ°œν•œ λͺ¨λ“  μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ€˜μ•Ό ν•˜λŠ” 어렀움이 생기기 λ•Œλ¬Έμ΄λΌλŠ” 점도 μžˆλ‹€.

κ°’ 객체λ₯Ό μ •μ˜ν•˜λŠ” κΈ°μ€€

ν•„μš”μ— μ˜ν•΄ κ°’ 객체λ₯Ό μ •μ˜ν•˜λŠ” 것은 μ’‹μ§€λ§Œ λ”°μ§€κ³  λ“€μ–΄κ°€λ©΄ 이름은 μ„±κ³Ό μ΄λ¦„μœΌλ‘œ λ‚˜λ‰  μˆ˜λ„ 있고 μ„±κ³Ό 이름에도 κ·œμΉ™μ΄ ν•„μš”ν•  수 μžˆλ‹€. μˆ«μžκ°€ μ‚¬μš©λ˜λŠ” 곳은 λ‚˜μ΄ 외에도 가격, 개수, 반 번호 등이 μžˆμ„ 수 μžˆλŠ”λ° 각 μ‚¬μš©μ²˜λ§ˆλ‹€ λͺ¨λ‘ λ‹€λ₯Έ κ·œμΉ™μ΄ μ‘΄μž¬ν•œλ‹€.
κ·Έλ ‡λ‹€λ©΄ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•Œ μ›μ‹œ 데이터가 μ‚¬μš©λ˜λŠ” λͺ¨λ“  κ°œλ…μ„ κ°’ 객체둜 λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” 것 μ•„λ‹κΉŒ?
β€˜λ„λ©”μΈ 주도 섀계 μ² μ € μž…λ¬Έβ€™μ—μ„œλŠ” κ°’ 객체에 λŒ€ν•œ μ •μ˜ κΈ°μ€€μœΌλ‘œ β€œκ·œμΉ™μ΄ μ‘΄μž¬ν•˜λŠ”κ°€β€μ™€ β€œλ‚±κ°œλ‘œ 닀루어야 ν•˜λŠ”κ°€β€λ₯Ό μ œμ‹œν•œλ‹€.
ν˜„μ‹€μ—μ„œλŠ” κ·œμΉ™μ΄ μ‘΄μž¬ν•˜μ§€λ§Œ μ‹œμŠ€ν…œ 상 κ·œμΉ™μ„ μ μš©ν•  ν•„μš”κ°€ μ—†λ‹€λ©΄ λ‹Ήμž₯ κ°’ 객체둜 μ •μ˜ν•  ν•„μš”λŠ” 없을 것이닀. λ§ˆμ°¬κ°€μ§€λ‘œ 이름은 μ„±κ³Ό μ΄λ¦„μœΌλ‘œ λ‚˜λˆŒ 수 μžˆμ§€λ§Œ μ‹œμŠ€ν…œ 상 ꡳ이 κ΅¬λΆ„ν•΄μ„œ λ‚±κ°œλ‘œ λ‹€λ£° ν•„μš”κ°€ μ—†λ‹€λ©΄ κ°’ 객체둜 μ •μ˜ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
λ§Œμ•½ 두 κΈ°μ€€ 쀑 ν•œ κ°€μ§€λ§Œ λΆ€ν•©ν•˜λŠ” 경우라면 κ°’ 객체λ₯Ό μ •μ˜ν•˜μ§€ μ•Šλ”λΌλ„ 속성을 λ‚±κ°œλ‘œ λΆ„λ¦¬ν•˜κ±°λ‚˜ 속성에 λŒ€ν•œ 쑰건을 μƒμœ„ κ°μ²΄μ—μ„œ κ°•μ œν•˜λŠ” 방법이 μžˆλ‹€. λ¬Όλ‘  ν•œ κ°€μ§€ κΈ°μ€€λ§Œ 뢀합해도 κ°’ 객체λ₯Ό μ •μ˜ν•  μˆ˜λ„ 있으며 μ€‘μš”ν•œ 것은 κ°’ 객체의 ν•„μš”μ„±μ„ μ •ν™•νžˆ μ΄ν•΄ν•˜κ³  νŒλ‹¨μ— 따라 μ‚¬μš©ν•˜λŠ” 것이닀.

κ°’ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

행동 μ •μ˜

β€” κ°’ κ°μ²΄λŠ” 데이터λ₯Ό λ‹΄λŠ” κ²ƒλ§Œμ΄ λͺ©μ μ΄ μ•„λ‹ˆλ‹€. 데이터와 λ”λΆˆμ–΄ 데이터에 λŒ€ν•œ 행동을 ν•œ 곳에 λͺ¨μ•„ μžμ‹ λ§Œμ˜ κ·œμΉ™μ„ κ°–λŠ” 도메인 객체λ₯Ό μ •μ˜ν•˜λŠ” 것이 κ°’ 객체λ₯Ό μ •μ˜ν•˜λŠ” λͺ©μ μ΄λ‹€.
객체에 μ •μ˜λœ ν–‰μœ„λ₯Ό 톡해 ν•΄λ‹Ή 객체가 μ–΄λ–€ 일을 ν•  수 μžˆλŠ”μ§€ μ•Œ 수 있으며, λ°˜λŒ€λ‘œ μ •μ˜ λ˜μ§€ μ•ŠλŠ” 행동은 객체가 ν•  수 μ—†μœΌλ©° ν•΄λ‹Ή 객체가 μ‘΄μž¬ν•˜λŠ” λͺ©μ μ΄ μ•„λ‹˜μ„ μ•Œ 수 μžˆκΈ°λ„ ν•˜λ‹€.

ν‘œν˜„λ ₯ 증가

β€” κ°’ κ°μ²΄λŠ” 자기 μ •μ˜λ₯Ό 톡해 μžμ‹ μ΄ 무엇인지에 λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” 자기 λ¬Έμ„œν™”λ₯Ό λ•λŠ”λ‹€.

무결성 μœ μ§€

β€” 처리 λŒ€μƒμ΄ μ•„λ‹Œ μž…λ ₯을 확인해 κ±ΈλŸ¬λ‚΄λŠ” μ½”λ“œμΈ β€˜λ°©μ–΄ μ½”λ“œβ€™λ₯Ό κ°’ 객체에 μ μš©ν•˜λ©΄ κ·œμΉ™μ„ μœ„λ°˜ν•˜λŠ” μœ νš¨ν•˜μ§€ μ•Šμ€ 값을 μ²˜μŒλΆ€ν„° λ°©μ§€ν•  수 μžˆμ–΄ 무결성을 μœ μ§€ν•  수 있으며 값이 μ‚¬μš©λ  λ•Œλ§ˆλ‹€ μœ νš¨μ„± 검증을 ν•΄μ•Ό ν•  ν•„μš”λ„ μ—†μ• μ€€λ‹€.

잘λͺ»λœ λŒ€μž… λ°©μ§€

β€” β€˜ν‘œν˜„λ ₯ 증가’λ₯Ό 톡해 값을 λŒ€μž…ν•  λ•Œ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•œ 이해가 없어도 μ˜¬λ°”λ₯Έ μ½”λ“œμΈμ§€ νŒλ‹¨ν•˜κΈ° μ‰¬μ›Œμ§€κ³ , μ‹€μˆ˜λ‘œ 잘λͺ»λœ λŒ€μž…μ„ ν•œλ‹€ν•΄λ„ β€˜λ¬΄κ²°μ„± μœ μ§€β€™μ˜ μž₯점을 μ‚΄λ € μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” 곳을 μ‰½κ²Œ νŒŒμ•…ν•  수 있게 λœλ‹€.

μ½”λ“œμ˜ 반볡 λ°©μ§€

β€” μ•žμ„œ λ‚˜μ™”λ˜ λ“±κ°€μ„± 비ꡐλ₯Ό μœ„ν•œ λ©”μ„œλ“œλ‚˜ μœ νš¨μ„± 검증 μ½”λ“œ λ“± κ°’μ˜ 행동과 κ΄€λ ¨λœ μ½”λ“œλ₯Ό κ°’ 객체에 μ •μ˜ν•˜κ²Œ 되면 λ‘œμ§μ„ ν•œ 곳에 λͺ¨μ•„두고 λ°˜λ³΅ν•΄μ„œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œ λ˜λŠ” 경우λ₯Ό 크게 쀄일 수 μžˆλ‹€. ν•œ 곳에 λͺ¨μ—¬μžˆλŠ” μ½”λ“œλŠ” μˆ˜μ •λ„ ν•œ κ³³μ—μ„œλ§Œ ν•˜λ©΄ 되기 λ•Œλ¬Έμ— μž‘μ—…μ˜ λΆˆνŽΈν•¨μ„ 쀄이고 μ†Œν”„νŠΈμ›¨μ–΄μ˜ μœ μ—°μ„±λ„ λ†’μ—¬μ£Όκ²Œ λœλ‹€.