CHAP02 - DDD-START/ONLINE-STUDY GitHub Wiki

μ•„ν‚€ν…μ²˜

μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜ μ—λŠ” 4가지 μ˜μ—­(계측)이 μžˆμŠ΅λ‹ˆλ‹€. (ν‘œν˜„, μ‘μš©, 도메인, 인프라)

  1. ν‘œν˜„ μ˜μ—­(Controler)λŠ” http request 와 responseλ₯Ό μ²˜λ¦¬ν•˜λŠ” κ³„μΈ΅μž…λ‹ˆλ‹€.
  2. μ‘μš© μ˜μ—­(Service)λŠ” λ‚΄λΆ€ λ‘œμ§μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€. λ‘œμ§μ„ 직접 κ΅¬ν˜„ν•˜κΈ°λ³΄λ‹¨ 도메인에 둜직 κ΅¬ν˜„μ„ μœ„μž„ν•©λ‹ˆλ‹€.
  3. 도메인 μ˜μ—­(Order, DTO, VO)은 도메인 λͺ¨λΈμ„ κ΅¬ν˜„ν•˜κ³ , 도메인과 κ΄€λ ¨λœ 핡심 λ‘œμ§μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
  4. μΈν”„λΌμŠ€νŠΈλŸ­μ²˜ μ˜μ—­ (jpa λ₯Ό μ‚¬μš©ν•œ 경우 Repository) 은 κ΅¬ν˜„ κΈ°μˆ μ„ λ‹€λ£Ήλ‹ˆλ‹€. λ‹€λ₯Έ ORM ν”„λ ˆμž„μ›Œν¬λ‚˜ μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Ό 연동을 μ§€μ›ν•©λ‹ˆλ‹€.

(계측ꡬ쑰) μ•„ν‚€ν…μ²˜

4가지 μ˜μ—­μ„ μ‚¬μš©ν• λ•Œ 보편적으둜 계측ꡬ쑰 μ•„ν‚€ν…μ²˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 μ•„ν‚€ν…μ²˜μ—μ„œλŠ” μƒμœ„κ³„μΈ΅μ΄ ν•˜μœ„κ³„μΈ΅μ— μ˜μ‘΄ν•΄μ•Όν•˜μ§€λ§Œ 개발 νŽΈμ˜μ„±μ„ μœ„ν•΄ μœ μ—°ν•˜κ²Œ μ μš©ν•©λ‹ˆλ‹€.

ν‘œν˜„
  v
μ‘μš©
  v
도메인
  v
μΈν”„λΌμŠ€νŠΈλŸ­μ²˜

DIP(의쑴 μ—­μ „ 원칙)

  • μ›λž˜λŠ” κ³ μˆ˜μ€€ λͺ¨λ“ˆ(μƒμœ„)이 μ €μˆ˜μ€€ λͺ¨λ“ˆ(ν•˜μœ„)에 μ˜μ‘΄ν•˜λ˜ ꡬ쑰λ₯Ό λ°˜λŒ€λ‘œ μ €μˆ˜μ€€ λͺ¨λ“ˆμ΄ κ³ μˆ˜μ€€ λͺ¨λ“ˆμ˜ μ˜μ‘΄ν•˜κ²Œ ν•©λ‹ˆλ‹€ (μ˜ˆμ‹œ μ½”λ“œλ₯Ό 봐야 이해가 μ‰¬μš΄λ°, 핡심은 μΈν„°νŽ˜μ΄μŠ€ ν™œμš©)
  • μ΄λ ‡κ²Œ ν•˜λŠ” μ΄μœ λŠ” μ €μˆ˜μ€€ λͺ¨λ“ˆμ˜ λ³€κ²½(ex: mybatis -> jpa λ³€κ²½)이 κ³ μˆ˜μ€€ λͺ¨λ“ˆμ— μ €μˆ˜μ€€ λͺ¨λ“ˆ κ΅¬ν˜„λΆ€μ˜ ꡐ체와 ν…ŒμŠ€νŠΈμ—μ„œ νŽΈμ˜μ„±μ„ μ–»κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.
  • κ³ μˆ˜μ€€ μΈν„°νŽ˜μ΄μŠ€μ„ implements ν•΄μ„œ μ €μˆ˜μ€€ λͺ¨λ“ˆμ„ κ΅¬ν˜„ν•΄λ†“κ³ , κ³ μˆ˜μ€€ λͺ¨λ“ˆ κ΅¬ν˜„μ‹œμ— μ €μˆ˜μ€€ λͺ¨λ“ˆμ˜ κΈ°λŠ₯은 κ³ μˆ˜μ€€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • κ³ μˆ˜μ€€ μΈν„°νŽ˜μ΄μŠ€μ˜ 이름을 도메인(κ³ μˆ˜μ€€)κ³Ό 연관지어 μž‘μ„±ν•΄μ•Όν•©λ‹ˆλ‹€. μ €μˆ˜μ€€(인프라)κ³Ό 연관지어 μΈν„°νŽ˜μ΄μŠ€λͺ…을 μ§€μœΌλ©΄ μ €μˆ˜μ€€ λͺ¨λ“ˆ κ΅¬ν˜„λΆ€ λ³€κ²½μ‹œ μΈν„°νŽ˜μ΄μŠ€λͺ…도 ν•¨κ»˜ λ³€κ²½λ˜μ–΄μ•Όν•˜λŠ” 상황이 λ°œμƒν•©λ‹ˆλ‹€. 그럼 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 도메인 μ˜μ—­ λ‚΄λΆ€κΉŒμ§€ μˆ˜μ •μ΄ ν•„μš”ν•˜κ²Œλ©λ‹ˆλ‹€.

도메인 μ˜μ—­μ˜ μ£Όμš”κ΅¬μ„±μš”μ†Œ

  1. Entity 고유 μ‹λ³„μžλ₯Ό κ°–λŠ” 객체둜 μžμ‹ μ˜ 라이프 사이클을 κ°–μŠ΅λ‹ˆλ‹€. (ex) μ£Όλ¬Έ, νšŒμ›, μƒν’ˆ, ν˜œνƒ) κ΄€μ œμ§€ν–₯ DB ν…Œμ΄λΈ”κ³Ό λ™μΌν•˜λ‹€κ³  μ—¬κΈΈ 수 μžˆλŠ”λ°. DB ν…Œμ΄λΈ”μ€ 데이터 지ν–₯ 이고, Entity λŠ” 객체 지ν–₯μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ DB ν…Œμ΄λΈ”μ€ λ°μ΄ν„°λ§Œ 가지고 μžˆμ§€λ§Œ Entity κ°μ²΄λŠ” 데이터 이외에 μ—¬λŸ¬ μ°Έμ‘° 객체(μ£Όλ¬Έ μ—”ν„°ν‹°λŠ” 배솑지 정보 μ°Έμ‘°λ₯Ό 가짐)와 도메인 κΈ°λŠ₯을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. Value 직관적인 μ΄ν•΄ν• μˆ˜ μžˆλ„λ‘ λ”°λ‘œ μƒμ„±ν•œ 속성 객체 λ˜λŠ” 같은 κ°œλ…μ„ 같은 것듀을 ν•˜λ‚˜μ˜ 묢음 객체 μž…λ‹ˆλ‹€. case1) Money, OrderNo λ“±μ˜ μ›μ‹œνƒ€μž… λ³€μˆ˜ ν•˜λ‚˜λ§Œ μžˆλŠ” class λ₯Ό μƒμ„±ν•˜μ—¬ ν•΄λ‹Ή μ›μ‹œνƒ€μž… λŒ€μ‹ μ— ν•΄λ‹Ή class μ°Έμ‘° case2) Order κ°μ²΄μ—μ„œ, 주문자 정보(Orderer) κ΄€λ ¨ 된 μ†μ„±λ§Œ λ‚˜λˆ„μ–΄μ„œ Class λ₯Ό μƒˆλ‘œ μƒμ„±ν•˜κ³  ν•΄λ‹Ή class λ₯Ό μ°Έμ‘°
public class Orderer {
	private String name;
	private String email;
}
  1. Aggregate μ‹œμŠ€ν…œμ΄ μ»€μ§€λ©΄μ„œ 점점 λ³΅μž‘ν•΄μ§€λŠ” Entity 관계λ₯Ό κ·Έλ£Ή λ‹¨μœ„λ‘œ κ΄€λ¦¬ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€. 각 κ·Έλ£Ήμ—λŠ” ROOT Entity κ°€ μ‘΄μž¬ν•˜κ³ , λ‹€λ₯Έ 그룹간에 접근은 ROOT Entityλ₯Ό ν†΅ν•΄μ„œλ§Œ 접근이 κ°€λŠ₯λ„λ‘ν•©λ‹ˆλ‹€. (3μž₯에 더 μžμ„Ένžˆμ„€λͺ…됨)
  2. Repository Repository λŠ” Aggregate λ‹¨μœ„λ‘œ 도메인 객체λ₯Ό DB 에 μ €μž₯ν•˜κ³  μ‘°νšŒν•˜λŠ” κΈ°λŠ₯을 내뢀에 κ΅¬ν˜„ν•©λ‹ˆλ‹€. Repository μΈν„°νŽ˜μ΄μŠ€λŠ” 도메인 μ˜μ—­μ— μ†ν•˜λ„λ‘ μ—κ·Έλ¦¬κ±°νŠΈμ™€ 연관지어 이름을 μ§“μŠ΅λ‹ˆλ‹€.
  3. Domain Service νŠΉμ • 엔터티에 μ†ν•˜μ§€ μ•ŠλŠ” 도메인 λ‘œμ§μ„ μ œκ³΅ν•©λ‹ˆλ‹€. ν• μΈκΈˆμ•‘κ³„μ‚° 은 μƒν’ˆ, 쿠폰, νšŒμ›λ“±κΈ‰, κ΅¬λ§€κΈˆμ•‘λ“± λ‹€μ–‘ν•œ Entity와 Value λ₯Ό ν•„μš”λ‘œ ν•˜λŠ”λ°, μ΄λŸ¬ν•œ λ‘œμ§μ€ 도메인 μ„œλΉ„μŠ€μ—μ„œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

μΈν”„λΌμŠ€νŠΈλŸ­μ²˜

도메인 객체의 μ˜μ†μ„± 처리, νŠΈλžœμž­μ…˜, smtp, rest client λ“± λ‹€λ₯Έμ˜μ—­μ—μ„œ ν•„μš”λ‘œ ν•˜λŠ” orm ν”„λ ˆμž„μ›Œν¬, κ΅¬ν˜„κΈ°μˆ , 보쑰기λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€. 도메인 μ˜μ—­μ—μ„œ μƒμ„±ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 가지고 λ‚΄λΆ€ κ΅¬ν˜„μ„ ν•˜λŠ”κ²Œ μ‹œμŠ€ν…œμ„ 더 μœ μ—°ν•˜κ²Œν•©λ‹ˆλ‹€.

λͺ¨λ“ˆ

λͺ¨λ“ˆ 섀계(νŒ¨ν‚€μ§€ ꡬ쑰 섀계)에 정닡은 μ—†μŠ΅λ‹ˆλ‹€. μœ„μ— 4가지 μ˜μ—­λ³„λ‘œ νŒ¨ν‚€μ§€ ꡬ쑰λ₯Ό λΆ„ν• ν•  μˆ˜λ„ 있고, μ΅œμƒλ‹¨μ— μ—κ·Έλ¦¬κ±°νŠΈ λ‹¨μœ„λ‘œ λ¨Όμ € νŒ¨ν‚€μ§€ λΆ„ν• ν›„ κ·Έ ν•˜μœ„μ— 계측에 따라 νŒ¨ν‚€μ§€λ₯Ό λΆ„ν• ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.