LUCATHREE.COM

← Back to list
🧐 TIL

[DDD] 도메인 μ„œλΉ„μŠ€, Domain Service

μž‘μ„±μΌ:
TILDDDArchitecture

μ„œλΉ„μŠ€μ˜ μ •μ˜

일상 μƒν™œμ—μ„œ λ§ν•˜λŠ” β€˜μ„œλΉ„μŠ€(service)β€™λŠ” 보톡 ν•˜λ‚˜μ˜ λŒ€μƒμ΄ λ‹€λ₯Έ λŒ€μƒμ—κ²Œ 무언가λ₯Ό ν•΄μ£ΌλŠ” 것을 μ˜λ―Έν•œλ‹€. μ—¬κΈ°μ„œ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” λŒ€μƒμ„ β€˜μ„œλΈŒ(serve)λ₯Ό ν•˜λŠ” μžβ€™λΌ ν•˜μ—¬ β€˜μ„œλ²„(server)’라고 ν•˜κ³  μ„œλΉ„μŠ€λ₯Ό 제곡 λ°›λŠ” λŒ€μƒμ€ μ†λ‹˜μ΄λΌ ν•˜μ—¬ β€˜ν΄λΌμ΄μ–ΈνŠΈ(client)’라고 λΆ€λ₯Έλ‹€. 그리고 이 κ°œλ…μ€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλ„ κ·ΈλŒ€λ‘œ μ‚¬μš©λœλ‹€.
그런데 λ¬Έμ œλŠ” β€˜λ¬΄μ–Έκ°€λ₯Ό ν•΄μ€€λ‹€β€™λΌλŠ” κ°œλ…μ΄ μ›Œλ‚™ ν¬κ΄„μ μ΄λ‹€λ³΄λ‹ˆ μ„œλΉ„μŠ€λΌλŠ” 단어가 μ—¬κΈ°μ €κΈ°μ—μ„œ λ‹€ μ“°μ—¬μ„œ ν”„λ‘œκ·Έλž˜λ° λ‚΄μ—μ„œ μ •ν™•νžˆ μ„œλΉ„μŠ€μ˜ κ°œλ…μ„ μ •ν•˜κ³  경계λ₯Ό λ‚˜λˆ„κΈ°κ°€ μ–΄λ ΅λ‹€.
κ·Έλž˜μ„œ 도메인 주도 μ„€κ³„μ—μ„œλŠ” μ„œλΉ„μŠ€λ₯Ό 크게 λ‘˜λ‘œ λ‚˜λˆ μ„œ μ •μ˜ν•˜λŠ”λ° ν•˜λ‚˜λŠ” 도메인을 μœ„ν•œ μ„œλΉ„μŠ€μΈ 도메인 μ„œλΉ„μŠ€κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” 이용자의 λͺ©μ μ— λΆ€μ‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§ν•˜λŠ” β€˜μ• ν”Œλ¦¬μΌ€μ΄μ…˜β€™μ„ μœ„ν•œ μ„œλΉ„μŠ€, 즉 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλΉ„μŠ€λ‹€.
μ—¬κΈ°μ„œλŠ” λ¨Όμ € 도메인 μ„œλΉ„μŠ€μ— λŒ€ν•œ κ°œλ…λΆ€ν„° 곡뢀해보도둝 ν•œλ‹€.

도메인 μ„œλΉ„μŠ€

μ•žμ„œ μ„œλΉ„μŠ€λž€ β€˜λ¬΄μ–Έκ°€λ₯Ό ν•˜λŠ” 것’이라고 μ •μ˜ν–ˆλŠ”λ°, μ„œλΉ„μŠ€ κ°μ²΄λŠ” κ³§ κ·Έ 무언가λ₯Ό ν•˜λŠ” 행동 자체λ₯Ό 객체둜 ν‘œν˜„ν•œ 것이라고 λ³Ό 수 μžˆλ‹€.
그런데 μ• μ΄ˆμ— κ°μ²΄λž€ 속성값과 행동을 κ°–λŠ”λ‹€. κ°’ κ°μ²΄λ‚˜ μ—”ν‹°ν‹° 같은 도메인 객체에 행동을 μ •μ˜ν•  수 μžˆλŠ”λ° ꡳ이 μ„œλΉ„μŠ€ 객체가 ν•„μš”ν•œ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?
κ·Έ μ΄μœ λŠ” μ‹œμŠ€ν…œμƒ κ°’ κ°μ²΄λ‚˜ μ—”ν‹°ν‹°λ‘œ κ΅¬ν˜„ν•˜κΈ° λΆ€μžμ—°μŠ€λŸ¬μš΄ 행동듀이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 이런 λΆ€μžμ—°μŠ€λŸ¬μ›€μ„ ν•΄κ²°ν•΄μ£ΌλŠ” 것이 도메인 μ„œλΉ„μŠ€λ‹€.

κ°’ κ°μ²΄λ‚˜ 엔티티에 μ •μ˜ν•˜κΈ° μ–΄μƒ‰ν•œ 행동

β€˜λ„λ©”μΈ 주도 섀계 μ² μ € μž…λ¬Έβ€™μ—μ„œλŠ” 쀑볡검사λ₯Ό μ˜ˆμ‹œλ‘œ λ“ λ‹€.
User λΌλŠ” μ—”ν‹°ν‹°κ°€ μžˆμ„ λ•Œ, μƒˆλ‘œμš΄ User 객체λ₯Ό λ§Œλ“œλŠ” κ³Όμ •μ—μ„œ 객체 동일성을 μœ μ§€ν•˜κ³  객체 κ°„ ꡬ별을 μœ„ν•΄μ„œλŠ” 이미 λ™μΌν•œ User 객체가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ id 쀑볡검사가 ν•„μš”ν•˜λ‹€.
μ΄λ•Œ id의 쀑볡여뢀λ₯Ό κ²€μ‚¬ν•˜λŠ” 행동을 User 엔티티에 μ •μ˜ν•˜κ²Œ 될 경우 Userκ°€ 슀슀둜 쀑볡인지 μ•„λ‹Œμ§€λ₯Ό κ²€μ¦ν•΄μ„œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ 것은 μ•„λ‹ˆμ§€λ§Œ νšŒμ›κ°€μž… κ³Όμ •μ—μ„œ κ³ κ°μ—κ²Œ β€œλ‹Ήμ‹ μ€ κΈ°μ‘΄ κ³ κ°μž…λ‹ˆκΉŒ?”λ₯Ό 물어보면 고객이 슀슀둜 전체 νšŒμ› 리슀트λ₯Ό λ³΄λ©΄μ„œ 닡을 μ°Ύμ•„μ•Ό ν•˜κ²Œ λ˜κ±°λ‚˜, λŒ€λ‹΅μ„ 해도 그게 참인지 거짓인지 μ‹œμŠ€ν…œμ€ μ•Œ 수 μ—†λ‹€.
그리고 이런 점은 id의 속성 κ°’μœΌλ‘œ UserId λΌλŠ” κ°’ 객체λ₯Ό μ •μ˜ν–ˆλ‹€ 해도 λ§ˆμ°¬κ°€μ§€λ‹€. UserId κ°’ 객체에 쀑볡여뢀λ₯Ό κ²€μ‚¬ν•˜λŠ” 행동을 μ •μ˜ν•˜λ €λ©΄ UserId κ°μ²΄λ§ˆλ‹€ 전체 νšŒμ› id 리슀트λ₯Ό μ†μ„±μœΌλ‘œ 갖도둝 ν•˜κ±°λ‚˜ UserIdκ°€ λ‹€λ₯Έ μ–΄λ”˜κ°€μ— μ €μž₯λ˜μ–΄ μžˆλŠ” id 리슀트 직접 μ‘°νšŒν•˜κ²Œ ν•΄μ•Όν•œλ‹€.
이런 λΆ€μžμ—°μŠ€λŸ¬μ›€λ“€μ΄ UserService λΌλŠ” 도메인 μ„œλΉ„μŠ€ 객체λ₯Ό μ •μ˜ν•˜κ³  UserService의 ν–‰λ™μœΌλ‘œ 쀑볡검사λ₯Ό λΆ€μ—¬ν•¨μœΌλ‘œμ¨ ν•΄κ²°ν•  수 μžˆλ‹€.

도메인 μ„œλΉ„μŠ€λŠ” λ‚¨μš©ν•˜κΈ° 쉽닀

μ€‘μš”ν•œ 것은 도메인 μ„œλΉ„μŠ€λŠ” κ°’ κ°μ²΄λ‚˜ 엔티티에 μ •μ˜ν•˜κΈ° λΆ€μžμ—°μŠ€λŸ¬μš΄ 행동듀을 μ²˜λ¦¬ν•˜λŠ” λͺ©μ μœΌλ‘œλ§Œ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 것이닀.
μžμΉ«ν•˜λ©΄ κ°’ κ°μ²΄λ‚˜ 엔티티에 μ •μ˜λ˜μ–΄μ•Ό ν•  행동을 λͺ¨λ‘ 도메인 μ„œλΉ„μŠ€λ‘œ λ§Œλ“€μ–΄λ²„λ¦΄ μˆ˜λ„ μžˆλŠ”λ°, μ½”λ“œ μƒμœΌλ‘œλŠ” λ¬Έμ œκ°€ μ—†μ–΄λ³΄μ΄μ§€λ§Œ μ •μž‘ κ°’ κ°μ²΄λ‚˜ 엔티티에 μžˆμ–΄μ•Ό ν•  행동 정보듀이 νŒŒνŽΈν™” λ˜μ–΄ μ½”λ“œλ₯Ό 읽고 도메인 κ·œμΉ™μ„ λ°œκ²¬ν•˜κΈ° μ–΄λ ΅κ²Œ 될 수 μžˆλ‹€.
μ΄λ ‡κ²Œ 되면 도메인 객체가 μ›λž˜ ν¬ν•¨ν–ˆμ–΄μ•Ό ν•  μ§€μ‹μ΄λ‚˜ 처리 λ‚΄μš©μ„ λͺ¨λ‘ μ„œλΉ„μŠ€ κ°μ²΄μ—κ²Œ λΉΌμ•—κΈ°κ²Œ λ˜λŠ”λ° 이처럼 μ œκ³΅ν•  정보가 μ—†λŠ” 도메인 객체λ₯Ό 빈혈 도메인 λͺ¨λΈ(anemic domain model)이라고 ν•œλ‹€.
빈혈 도메인 λͺ¨λΈμ€ 데이터와 ν–‰μœ„λ₯Ό ν•¨κ»˜ λͺ¨μ•„ λ†“λŠ”λ‹€λŠ” 객체 μ§€ν–₯ μ„€κ³„μ˜ 기본원칙과 지식을 λ¬Έμ„œν™”ν•˜κΈ° μœ„ν•œ 도메인 주도 μ„€κ³„μ˜ λͺ©μ κ³Ό μ •λ°˜λŒ€ λœλ‹€.
Β 
+ 그러면 λ‚¨μš©μ„ μ–΄λ–»κ²Œ ν”Όν•  것인가?
μ±…μ—μ„œλŠ” β€œλ„λ©”μΈ μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 κ°€λŠ₯ν•œ ν•œ ν”Όν•˜λΌβ€κ³  ν•œλ‹€. μ΅œλŒ€ν•œ κ°’ κ°μ²΄λ‚˜ 엔티티에 행동을 μ •μ˜ν•˜κ³  λΆ€μžμ—°μŠ€λŸ¬μ›€μ„ ν•΄κ²°ν•˜λŠ” λͺ©μ μœΌλ‘œλ§Œ μ‚¬μš©ν•˜λΌλŠ” 기쀀을 μ œμ‹œν•΄μ£ΌκΈ΄ ν–ˆμ§€λ§Œ μ½μœΌλ©΄μ„œ μ—¬μ „νžˆ λ§‰μ—°ν•œ 감이 λ“€μ—ˆλ‹€.
μœ μ¦ˆμΌ€μ΄μŠ€λ₯Ό λ³΄λ©΄μ„œ 개인적으둜 μƒκ°ν•œ 것은 일단 섀계 λ‹¨κ³„μ—μ„œλŠ” 미리 도메인 μ„œλΉ„μŠ€λ₯Ό ꡬ상해놓지 μ•ŠλŠ” 것이 μ’‹κ² λ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€. μœ μ¦ˆμΌ€μ΄μŠ€ μ†Œκ°œμ—μ„œλ„ 도메인 μ„œλΉ„μŠ€μ˜ κ΅¬ν˜„μ€ μž‘μ—… μˆœμ„œμ˜ λ§ˆμ§€λ§‰μ— λ“±μž₯ν•˜λŠ”λ°, μ§μ ‘μ μœΌλ‘œ μ–΄λ–»κ²Œ ν•˜λΌκ³  κΈ€λ‘œ ν‘œν˜„λ˜μ–΄ μžˆμ§€λŠ” μ•Šμ•˜μ§€λ§Œ μ΅œλŒ€ν•œ 도메인 λͺ¨λΈ 내에 행동을 μ •μ˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ μš°μ„  κ΅¬ν˜„μ„ ν•˜λ‹€κ°€ λΆ€μžμ—°μŠ€λŸ¬μ›€μ΄ λ°œκ²¬λ˜μ—ˆμ„ λ•Œμ—μ„œμ•Ό 도메인 μ„œλΉ„μŠ€λ₯Ό λΆ„λ¦¬ν•΄λ‚΄λŠ” 것이 λ‚¨μš©μ„ ν”Όν•  λ°©λ²•μ΄λž€ 생각이 λ“€μ—ˆλ‹€.
Β