BE/DDD

[DDD Start!] 2. 아킀텍쳐 κ°œμš”

Taylor Kang 2021. 6. 7. 10:00

아킀텍쳐

1. ν‘œν˜„ ( = UI μ˜μ—­)

  • μ‚¬μš©μžμ˜ μš”μ²­μ„ λ°›μ•„ μ‘μš© μ˜μ—­μ— μ „λ‹¬ν•˜κ³ , 처리 κ²°κ³Όλ₯Ό λ‹€μ‹œ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ£ΌλŠ” μ—­ν• 
  • ex. μ›Ή μ–΄ν”Œλ¦¬μΌ€μ…˜
    • μŠ€ν”„λ§ MVC ν”„λ ˆμž„μ›Œν¬
    • ν‘œν˜„ μ˜μ—­μ˜ μ‚¬μš©μžλŠ” μ›ΉλΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬λžŒ or REST APIλ₯Ό ν˜ΈμΆœν•˜λŠ” μ™ΈλΆ€ μ‹œμŠ€ν…œ
  • 컨트둀러 λ ˆμ΄μ–΄

2. μ‘μš©

  • μ‹œμŠ€ν…œμ΄ μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•΄μ•Όν•  κΈ°λŠ₯을 κ΅¬ν˜„ - 도메인 μ˜μ—­μ˜ 도메인 λͺ¨λΈμ„ μ‚¬μš©
  • λ‘œμ§μ„ 직접 μˆ˜ν–‰ν•˜κΈ°λ³΄λ‹€λŠ” 도메인 λͺ¨λΈμ— 둜직 μˆ˜ν–‰μ„ μœ„μž„
  • μ„œλΉ„μŠ€ λ ˆμ΄μ–΄

3. 도메인

  • 도메인 λͺ¨λΈ(엔티티와 λ°Έλ₯˜)을 κ΅¬ν˜„
    • λ„λ©”μΈμ˜ 핡심 λ‘œμ§μ„ 도메인 λͺ¨λΈμ— κ΅¬ν˜„

4. 인프라 슀트럭쳐

  • κ΅¬ν˜„ κΈ°μˆ μ— λŒ€ν•œ 것을 λ‹€λ£Έ.
  • ex. DB 연동 처리, λ©”μ‹œμ§• 큐 전솑/μˆ˜μ‹  κΈ°λŠ₯, SMTPλ₯Ό μ΄μš©ν•œ 메일 λ°œμ†‘ κΈ°λŠ₯

  • λ„λ©”μΈμ˜ λ³΅μž‘λ„μ— 따라 μ‘μš©/도메인 계측을 ν•©μΉ˜κΈ°λ„ 함.
  • 계측 ꡬ쑰λ₯Ό μ—„κ²©ν•˜κ²Œ μ μš©ν•˜λ©΄ μƒμœ„ 계측은 λ°”λ‘œ μ•„λž˜ κ³„μΈ΅μ—λ§Œ μ˜μ‘΄μ„ κ°€μ Έμ•Όν•˜μ§€λ§Œ κ΅¬ν˜„μ˜ νŽΈλ¦¬ν•¨μ„ μœ„ν•΄ 계측 ꡬ쑰λ₯Ό μœ μ—°ν•˜κ²Œ μ μš©ν•œλ‹€. (μ‘μš© 계측이 μΈν”„λΌμŠ€νŠΈλŸ­μ³ 계측에 의쑴)
  • ν‘œν˜„/μ‘μš©/도메인 계측은 상세 κ΅¬ν˜„ κΈ°μˆ μ„ λ‹€λ£¨λŠ” 인프라 슀트럭쳐 계측에 μ’…μ†λ˜κ²Œ 됨.
    • 문제 1) μƒμœ„ λ ˆμ΄μ–΄λ§Œ ν…ŒμŠ€νŠΈ ν•˜κΈ° μ–΄λ €μ›Œμ§. (ν…ŒμŠ€νŠΈ 어렀움) 인프라 μŠ€νŠΈλŸ­μ³κ°€ μ •ν™•νžˆ λ™μž‘ν•΄μ•Ό μ™„λ²½ν•˜κ²Œ λ™μž‘ν•˜λ―€λ‘œ.
    • 문제 2) κ΅¬ν˜„ 방식을 λ³€κ²½ν•˜κΈ° μ–΄λ €μ›Œμ§ (κΈ°λŠ₯ν™•μž₯의 어렀움) κΈ°μ‘΄ 인프라 μŠ€νŠΈλŸ­μ³μ— νŠΉν™”λœ μ½”λ“œκ°€ μƒμœ„ λ ˆμ΄μ–΄μ— μž‘μ„±λ  수 있음
    ⇒ ν•΄κ²° : DIP 적용

DIP (Dependency Inversion Principle; 의쑴 μ—­μ „ 법칙)

  • κ³ μˆ˜μ€€ λͺ¨λ“ˆ: 의미 μžˆλŠ” 단일 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” λͺ¨λ“ˆ μ €μˆ˜μ€€ λͺ¨λ“ˆ: ν•˜μœ„ κΈ°λŠ₯을 μ‹€μ œλ‘œ κ΅¬ν˜„ν•œ 것 ⇒ DIPλŠ” μ €μˆ˜μ€€ λͺ¨λ“ˆμ΄ κ³ μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•˜λ„λ‘ λ°”κΎΌλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©
  • μ„œλΉ„μŠ€ λ ˆμ΄μ–΄μ—μ„œ μ‚¬μš©ν•΄μ•Όν•˜λŠ” κ΅¬ν˜„λΆ€λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ λ¨Όμ € μ •μ˜ν•˜κ³  → κ΅¬ν˜„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›μ•„μ„œ ν•„μš” κΈ°λŠ₯을 κ΅¬ν˜„ν•œλ‹€.
  • μ‹€μ œ μ‚¬μš©ν•  κ΅¬ν˜„ κ°μ²΄λŠ” 의쑴 μ£Όμž…μ„ μ΄μš©ν•΄μ„œ μ „λ‹¬λ°›μŒ κ΅¬ν˜„ κΈ°μˆ μ„ λ³€κ²½ν•΄μ•Όν•  κ²½μš°μ—λ„ μ˜μ‘΄μ„± μ£Όμž… λΆ€λΆ„λ§Œ λ³€κ²½ν•΄μ£Όλ©΄ 됨.
  • ν…ŒμŠ€νŠΈ μ‹œμ—λ„ λŒ€μš© 객체λ₯Ό μ‚¬μš©ν•΄μ„œ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•  수 있음
    • ex. stubRepo, stubRule을 Mockito Mock ν”„λ ˆμž„μ›Œν¬λ₯Ό μ΄μš”ν•΄μ„œ λŒ€μš© 객체둜 생성할 수 있음

*ν•˜μœ„ κΈ°λŠ₯을 μΆ”μƒν™”ν•œ μΈν„°νŽ˜μ΄μŠ€λŠ” κ³ μˆ˜μ€€ λͺ¨λ“ˆ κ΄€μ μ—μ„œ λ„μΆœν•΄μ•Όν•˜λ©°, κ³ μˆ˜μ€€ λͺ¨λ“ˆμ— μœ„μΉ˜ν•œλ‹€. → μ €μˆ˜μ€€ λͺ¨λ“ˆμ—μ„œ μΈν„°νŽ˜μ΄λ₯Ό μΆ”μΆœν•˜λ©΄ μ•ˆλœλ‹€. (λ‹¨μˆœνžˆ μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ν΄λž˜μŠ€λ₯Ό λΆ„λ¦¬ν•˜λŠ” κ°œλ…μ΄ μ•„λ‹Œ, κ³ μˆ˜μ€€ λͺ¨λ“ˆμ΄ μ €μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•¨μž„)


  • 아킀텍쳐 μˆ˜μ€€μ—μ„œ DIP λ₯Ό μ μš©ν•˜λ©΄ 인프라 슀트럭쳐 μ˜μ—­μ΄ μ‘μš©/도메인 μ˜μ—­μ— μ˜μ‘΄ν•˜λŠ” ꡬ쑰가 λœλ‹€.
  • DIPλ₯Ό μ μš©ν•˜λ©΄ μƒμœ„ μ˜μ—­μ— 영ν–₯을 μ΅œμ†Œν™”ν•˜λ©΄μ„œ κ΅¬ν˜„μ²΄λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ μΆ”κ°€ν•  수 있음
  • ν•˜μ§€λ§Œ 무쑰건 인프라 μŠ€νŠΈλŸ­μ²˜μ— λŒ€ν•œ μ˜μ‘΄μ„ μ—†μ• λŠ” 것이 쒋은 것은 μ•„λ‹˜
    • ex. μŠ€ν”„λ§ νŠΈλžœμž­μ…˜ 처리λ₯΄ μœ„ν•΄ @Transactional μ‚¬μš© or JPA μ „μš© μ–΄λ…Έν…Œμ΄μ…˜μ„ 도메인 λͺ¨λΈν΄λž˜μŠ€μ— μ‚¬μš©ν•˜λŠ” 경우(@Entity, @Table) → κ΅¬ν˜„μ˜ νŽΈλ¦¬ν•¨μ€ DIP의 μž₯점만큼 μ€‘μš”ν•˜λ―€λ‘œ μœ μ—°ν•˜κ²Œ μ μš©ν•΄μ•Όν•¨.

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

1. Entity μ—”ν‹°ν‹°

  • 고유의 μ‹λ³„μžλ₯Ό κ°–λŠ” 객체
  • μžμ‹ μ˜ 라이프 사이클을 가짐
  • λ„λ©”μΈμ˜ κ³ μœ ν•œ κ°œλ…μ„ ν‘œν˜„ (도메인 λͺ¨λΈμ˜ 데이터 + 데이터 κ΄€λ ¨ κΈ°λŠ₯)

2. Value λ°Έλ₯˜

  • 고유의 μ‹λ³„μžλ₯Ό κ°–μ§€ μ•ŠλŠ” 객체
  • κ°œλ…μ μœΌλ‘œ ν•˜λ‚˜μΈ 도메인 객체의 속성을 ν‘œν˜„
  • μ—”ν‹°ν‹°μ˜ 속성 or λ‹€λ₯Έ λ°Έλ₯˜ νƒ€μž…μ˜ μ†μ„±μœΌλ‘œ μ‚¬μš©

3. Aggregate μ• κ·Έλ¦¬κ±°νŠΈ

  • κ΄€λ ¨ 객체(μ—”ν‹°ν‹°, λ°Έλ₯˜ 객체)λ₯Ό κ°œλ…μ μœΌλ‘œ ν•˜λ‚˜λ‘œ 묢은 것
  • ex. 'μ£Όλ¬Έ' 애그리 거트 = Order μ—”ν‹°ν‹° + OrderLine λ°Έλ₯˜ + Order λ°Έλ₯˜ 객체
  • 도메인이 컀질수둝 κ°œλ°œν•  도메인 λͺ¨λΈλ„ μ»€μ§€λ©΄μ„œ λ§Žμ€ 엔티티와 λ°Έλ₯˜κ°€ μΆœν˜„ → λ³΅μž‘λ„ 높아짐. → μ• κ·Έλ¦¬κ±°νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ κ΄€λ ¨ 객체λ₯Ό λ¬Άμ–΄μ„œ 객체 κ΅°μ§‘ λ‹¨μœ„λ‘œ λͺ¨λΈμ„ 바라볼 수 있게 됨
  • ꡰ집에 μ†ν•œ 객체듀을 κ΄€λ¦¬ν•˜λŠ” λ£¨νŠΈμ—”ν‹°ν‹°λ₯Ό 가짐

4. Repository λ ˆν¬μ§€ν† λ¦¬

  • 도메인 λͺ¨λΈμ˜ μ˜μ†μ„± 처리λ₯Ό μœ„ν•΄μ„  물리적 μ €μž₯μ†Œμ— 도메인 객체λ₯Ό 보관해야함
  • κ΅¬ν˜„μ„ μœ„ν•œ 도메인 λͺ¨λΈ (μš”κ΅¬μ‚¬ν•­μ—μ„œ λ„μΆœλ˜λŠ” 도메인 λͺ¨λΈ: μ—”ν‹°ν‹°/λ°Έλ₯˜)
  • μ• κ·Έλ¦¬κ±°νŠΈ λ‹¨μœ„λ‘œ 도메인 객체λ₯Ό μ €μž₯ν•˜κ³  μ‘°νšŒν•˜λŠ” κΈ°λŠ₯을 제곡
  • ex. DBMS ν…Œμ΄λΈ”μ—μ„œ μ—”ν‹°ν‹° 객체λ₯Ό λ‘œλ”©ν•˜κ±°λ‚˜ μ €μž₯ν•˜λŠ” κΈ°λŠ₯ 제곡

5. Domain Service 도메인 μ„œλΉ„μŠ€

  • νŠΉμ • 엔티티에 μ†ν•˜μ§€ μ•Šμ€ or μ—¬λŸ¬ 엔티티와 λ°Έλ₯˜λ₯Ό ν•„μš”λ‘œ ν•˜λŠ” 도메인 λ‘œμ§μ„ μ œκ³΅ν•˜λŠ” 경우
  • ex. 할인 κΈˆμ•‘ 계산 - μƒν’ˆ/쿠폰/νšŒμ›λ“±κΈ‰/κ΅¬λ§€κΈˆμ•‘ ...
  • 도메인 λͺ¨λΈμ˜ μ—”ν‹°ν‹° vs DB ν…Œμ΄λΈ”μ˜ μ—”ν‹°ν‹°
    • 차이점 1) 도메인 λͺ¨λΈμ˜ μ—”ν‹°ν‹°λŠ” 데이터와 λ”λΆˆμ–΄ 도메인 κΈ°λŠ₯을 ν•¨κ»˜ 제곡
    • 차이점 2) 도메인 λͺ¨λΈμ˜ μ—”ν‹°ν‹°λŠ” λ°Έλ₯˜ νƒ€μž…μ„ μ΄μš©ν•΄μ„œ κ°œλ…μ μœΌλ‘œ ν•˜λ‚˜μΈ λ°μ΄ν„°λ“œλ₯Ό 묢을 수 있음

λͺ¨λ“ˆ ꡬ성

  • μ•„ν‚€ν…μ³μ˜ 각 μ˜μ—­μ€ 별도 νŒ¨ν‚€μ§€μ— μœ„μΉ˜
    • (aggregate λ³„λ‘œ) ui / application / domain / infrastructure
      • domain 이 크면 ν•˜μœ„ λ„λ©”μΈλ³„λ‘œ λͺ¨λ“ˆμ„ λ‚˜λˆˆλ‹€.

*ν•œ νŒ¨ν‚€μ§€μ— κ°€λŠ₯ν•˜λ©΄ 10개 미만으둜 파일 개수λ₯Ό μœ μ§€