BE/DDD

[DDD Start!] 1. 도메인 λͺ¨λΈ μ‹œμž‘

Taylor Kang 2021. 6. 7. 09:59

도메인

  • 도메인
    • μ†Œν”„νŠΈμ›¨μ–΄λ‘œ ν•΄κ²°ν•˜κ³ μž ν•˜λŠ” 문제 μ˜μ—­
    • 도메인은 μ—¬λŸ¬ ν•˜μœ„ λ„λ©”μΈμœΌλ‘œ ꡬ성
      • ν•œ ν•˜μœ„ 도메인은 λ‹€λ₯Έ ν•˜μœ„ 도메인과 μ—°λ™ν•˜μ—¬ μ™„μ „ν•œ κΈ°λŠ₯을 제곡
    • λ„λ©”μΈμ˜ 일뢀 κΈ°λŠ₯은 μžμ²΄μ‹œμŠ€ν…œμœΌλ‘œ κ΅¬ν˜„, 일뢀 κΈ°λŠ₯은 μ™ΈλΆ€ μ—…μ²΄μ˜ μ‹œμŠ€ν…œμ„ μ΄μš©ν•  수 있음
    • 도메인 ꡬ성은 상황에 따라 달라짐

도메인 λͺ¨λΈ(κ°œλ… λͺ¨λΈ)

  • μ •μ˜
    • νŠΉμ • 도메인을 κ°œλ…μ μœΌλ‘œ ν‘œν˜„ν•œ 것
    • 도메인 자체λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•œ κ°œλ… λͺ¨λΈ
  • 도메인 λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ κ΄€κ³„μžλ“€μ΄ λ™μΌν•œ λͺ¨μŠ΅μœΌλ‘œ 도메인을 μ΄ν•΄ν•˜κ³ , 도메인 지식을 κ³΅μœ ν•˜λŠ”λ° 도움이 됨
  • μ’…λ₯˜ ⇒ ν‘œν˜„λ°©μ‹μ€ 도메인을 μ΄ν•΄ν•˜λŠ”λ° 도움이 λœλ‹€λ©΄ 무엇이든 μ‚¬μš© κ°€λŠ₯
    • UML ν‘œκΈ°λ²•
      • 객체 기반 도메인 λͺ¨λΈ (클래슀 λ‹€μ΄μ–΄κ·Έλž¨)
        • 도메인이 μ œκ³΅ν•˜λŠ” κΈ°λŠ₯ + λ„λ©”μΈμ˜ μ£Όμš” 데이터 ꡬ성
      • μƒνƒœ λ‹€μ΄μ–΄κ·Έλž¨ 기반 도메인 λͺ¨λΈ
        • μƒνƒœ 전이λ₯Ό λͺ¨λΈλ§
    • κ·Έλž˜ν”„ μ΄μš©ν•œ 도메인 λͺ¨λΈλ§
      • 관계가 μ€‘μš”ν•œ 도메인일 경우
    • μˆ˜ν•™ 곡식을 ν™œμš©ν•œ 도메인 λͺ¨λΈλ§
      • 계산 κ·œμΉ™μ΄ μ€‘μš”ν•œ 경우

도메인 λͺ¨λΈ νŒ¨ν„΄ (도메인 κ³„μΈ΅μ˜ 객체λͺ¨λΈμ˜ κ΅¬ν˜„νŒ¨ν„΄)

  • μ•„ν‚€ν…μ³μƒμ˜ 도메인 계측을 객체 μ§€ν–₯ κΈ°λ²•μœΌλ‘œ κ΅¬ν˜„ν•˜λŠ” νŒ¨ν„΄
  • 일반적인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 아킀텍쳐
    • ν‘œν˜„ - μ‘μš© - 도메인 - μΈν”„λΌμŠ€νŠΈλŸ­μ³ ( - DB )
    1. ν‘œν˜„ (Presentation) == μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)
      • μ‚¬μš©μžμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  μ‚¬μš©μžμ—κ²Œ 정보λ₯Ό λ³΄μ—¬μ€Œ
      • μ‚¬μš©μž: SWλ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬μš©μž & μ™ΈλΆ€ μ‹œμŠ€ν…œ
    2. μ‘μš© (Application)
      • μ‚¬μš©μžκ°€ μš”μ²­ν•œ κΈ°λŠ₯을 μ‹€ν–‰
      • 도메인 계측을 μ‘°ν•©ν•΄μ„œ κΈ°λŠ₯을 μ‹€ν–‰
    3. 도메인
      • μ‹œμŠ€ν…œμ΄ μ œκ³΅ν•  λ„λ©”μΈμ˜ κ·œμΉ™μ„ κ΅¬ν˜„ (κ°œλ…λͺ¨λΈμ˜ κ΅¬ν˜„κ³„μΈ΅)
    4. μΈν”„λΌμŠ€νŠΈλŸ­μ³
      • DBλ‚˜ λ©”μ‹œμ§• μ‹œμŠ€ν…œκ³Ό 같은 μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ 연동을 처리
  • 핡심 κ·œμΉ™μ„ κ΅¬ν˜„ν•œ μ½”λ“œλŠ” 도메인 λͺ¨λΈμ—λ§Œ μœ„μΉ˜ν•˜λ―€λ‘œ κ·œμΉ™μ˜ λ³€κ²½/ν™•μž₯ μ‹œ λ‹€λ₯Έ μ½”λ“œμ— 영ν–₯을 덜 주게 됨

*도메인 λͺ¨λΈμ€ 도메인을 ν‘œν˜„ν•˜λŠ” κ°œλ…μ μΈ λͺ¨λΈμ˜ μ˜λ―Έν•˜κΈ°λ„ ν•˜κ³ , 도메인 계측을 κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 객체 λͺ¨λΈμ„ μ˜λ―Έν•˜κΈ°λ„ 함

도메인 λͺ¨λΈ λ„μΆœ

  1. μš”κ΅¬μ‚¬ν•­ λ‚˜μ—΄
  2. μš”κ΅¬μ‚¬ν•­μ„ 톡해 도메인 λ³„λ‘œ μ œκ³΅ν•΄μ•Ό ν•˜λŠ” κΈ°λŠ₯을 μ •μ˜
  3. 객체에 κ΄€λ ¨ κΈ°λŠ₯을 λ©”μ„œλ“œλ‘œ μΆ”κ°€
  4. μ–΄λ–€ λ°μ΄ν„°λ‘œ κ΅¬μ„±λ˜λŠ”μ§€ κ³ λ €ν•˜μ—¬ 객체에 ν•„λ“œ μΆ”κ°€
  5. 2의 μš”κ΅¬μ‚¬ν•­λ³„λ‘œ λ©”μ„œλ“œμ— 반영(도메인 κ·œμΉ™ 반영)
  6. 객체 μƒμ„±μ‹œ 쑰건이 μžˆλ‹€λ©΄ 이λ₯Ό μƒμ„±μžμ— 반영
  • μƒνƒœμ— 따라 μ œμ•½μ‚¬ν•­μ΄ μžˆλ”°λ©΄ μ—΄κ±°νƒ€μž…μ„ μ΄μš©ν•˜μ—¬ ν‘œν˜„

엔티티와 λ°Έλ₯˜

  • 도메인 λͺ¨λΈμ„ 크게 엔티티와 λ°Έλ₯˜λ‘œ ꡬ뢄됨

Entity

  • κ³ μœ ν•œ μ‹λ³„μžλ₯Ό κ°€μ§€λŠ” 객체
    • μ—”ν‹°ν‹°μ˜ μ‹λ³„μžλŠ” μ—”ν‹°ν‹°λ₯Ό 생성-μˆ˜μ •-μ‚­μ œ ν• λ•ŒκΉŒμ§€ λ°”λ€Œμ§€ μ•ŠμŒ.
    • μ‹λ³„μžλ₯Ό μ΄μš©ν•΄μ„œ equals(), hashCode() λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 있음
  • μ‹λ³„μž 생성
    1. νŠΉμ • κ·œμΉ™μ— 따라 생성
      • ex. μ£Όλ¬Έ 번호, μš΄μ†‘μž₯ 번호, μΉ΄λ“œλ²ˆν˜Έ
      • ν”νžˆ μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ€ ν˜„μž¬ μ‹œκ°„κ³Ό λ‹€λ₯Έ 값을 ν•¨κ»˜ μ‘°ν•©ν•˜λŠ” 것
    2. UUID μ‚¬μš©(Universally unique identifier)
      • λ‹€μˆ˜μ˜ 개발 μ–Έμ–΄μ—μ„œ UUID 생성기λ₯Ό μ œκ³΅ν•˜κ³  있음. (java.util.UUID class)
    3. 직접 κ°’ μž…λ ₯
      • ex. νšŒμ› 아이디, 이메일
    4. 일련번호 μ‚¬μš©
      • 주둜 λ””λΉ„μ—μ„œ μ œκ³΅ν•˜λŠ” μžλ™ 증가 κΈ°λŠ₯을 μ‚¬μš©
        • ex. oracle - μ‹œν€€μŠ€, mysql - DB μžλ™ 증가 칼럼

Value

  • μ‹λ³„μžλ₯Ό κ°€μ§€μ§€ μ•ŠλŠ” κ°μ²΄μ΄λ©΄μ„œ κ°œλ…μ μœΌλ‘œ μ™„μ „ν•œ ν•˜λ‚˜λ₯Ό ν‘œν˜„ν•  λ•Œ μ‚¬μš©
  • ex. [Value] Receiver = String recieverName + String receiverPhoneNumber [Value] ShippingInfo = String shippingAddress + String shippingZipcode
  • λ°Έλ₯˜ νƒ€μž…μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬κ°œμ˜ 데이터λ₯Ό λ¬Άμ–΄ κ°œλ…μ μœΌλ‘œ μ™„μ „ν•œ ν•˜λ‚˜λ₯Ό 잘 ν‘œν˜„ν•  수 있음
  • λ°Έλ₯˜ νƒ€μž…μ΄ κΌ­ λ‘κ°œ μ΄μƒμ˜ 데이터λ₯Ό κ°€μ Έμ•Ό ν•˜λŠ” κ²ƒμŒ μ•„λ‹˜ → 의미λ₯Ό λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ λ°Έλ₯˜ νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ°λ„ 함
    • ex. int price → Money Price
    • λ‹¨μˆœνžˆ int νƒ€μž…μœΌλ‘œ μ„ μ–Έν•œ price ν•„λ“œλ₯Ό Money λΌλŠ” λ°Έλ₯˜λ₯Ό μ‚¬μš©ν•΄μ„œ μ •μ˜ν•˜λ©΄ μ˜λ―Έκ°€ 더 λͺ…확해짐
    • Money νƒ€μž…μ„ μœ„ν•œ κΈ°λŠ₯을 μΆ”κ°€ν•  수 도 있음 (ex. λˆκ³„μ‚°)
  • λ°Έλ₯˜ 객체의 데이터λ₯Ό λ³€κ²½ν•  λ•ŒλŠ” κΈ°μ‘΄ 데이터λ₯Ό λ³€κ²½ν•˜κΈ° 보닀 λ³€κ²½ν•œ 데이터λ₯Ό κ°–λŠ” μƒˆλ‘œμš΄ λ°Έλ₯˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방식을 μ„ ν˜Έ → λ°Έλ₯˜λŠ” λΆˆλ³€μœΌλ‘œ κ΅¬ν˜„ν•˜λŠ” 것을 ꢌμž₯
    • λΆˆλ³€ νƒ€μž…(immutable) : 데이터 λ³€κ²½ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ” νƒ€μž…
      • μ•ˆμ „ν•œ μ½”λ“œ μž‘μ„±μ΄ ν•„μš”ν•œ 경우 μ‚¬μš©
      • μ°Έμ‘° 투λͺ…μ„± & μŠ€λ ˆλ“œμ— μ•ˆμ „ν•œ νŠΉμ§•

  • 두 객체가 같은지 비ꡐ할 λ•Œ...Value: λͺ¨λ“  속성이 같은지 비ꡐ
  • Entitiy: μ‹λ³„μžλ₯Ό 비ꡐ
  • μ—”ν‹°ν‹°μ˜ μ‹λ³„μžμ˜ μ‹€μ œ λ°μ΄ν„°λŠ” String κ³Ό 같은 λ¬Έμžμ—΄λ‘œ κ΅¬μ„±λ˜λŠ” κ²½μš°κ°€ λ§Žμ§€λ§Œ, μ‹λ³„μžλŠ” λ‹¨μˆœν•œ λ¬Έμžμ—΄μ΄ μ•„λ‹Œ λ„λ©”μΈμ—μ„œ νŠΉλ³„ν•œ 의미λ₯Ό μ§€λ‹ˆλŠ” κ²½μš°κ°€ λ§Žλ‹€.
  • μ‹λ³„μžλ₯Ό μœ„ν•œ λ°Έλ₯˜ νƒ€μž…μ„ μ‚¬μš©ν•΄μ„œ μ˜λ―Έκ°€ 잘 λ“œλŸ¬λ‚˜λ„λ‘ ν•  수 있음. ex. String [Order.id](<http://order.id>) → OrderNo Order.id
  • get/set λ©”μ„œλ“œλ₯Ό 무쑰건 μΆ”κ°€ν•˜λŠ” 것은 λ„λ©”μΈμ˜ 핡심 κ°œλ…μ΄λ‚˜ μ˜λ„λ₯Ό μ½”λ“œμ—μ„œ μ‚¬λΌμ§€κ²Œ ν•˜λ―€λ‘œ μ’‹μ§€ μ•ŠμŒ
  • 도메인 객체가 λΆˆμ™„μ „ν•œ μƒνƒœλ‘œ μ‚¬μš©λ˜λŠ” 것을 λ§‰μœΌλ €λ©΄ μƒμ„±μžλ₯Ό 톡해 ν•„μš” 데이터λ₯Ό λͺ¨λ‘ λ°›μ•„μ•Ό ν•œλ‹€.
    • μƒμ„±μž 호좜 μ‹œμ μ— 데이터λ₯Ό 검사할 수 있음

도메인 μš©μ–΄

  • 도메인에 μ‚¬μš©ν•˜λŠ” μš©μ–΄λ₯Ό μ΅œλŒ€ν•œ μ½”λ“œμ— λ°˜μ˜ν• μˆ˜ μžˆλ„λ‘ 해야함
    • μ½”λ“œ ↔ 도메인 μš©μ–΄ κ°„ 해석 과정이 쀄어듬
    • μ½”λ“œ 가독성 λ†’μ•„μ Έμ„œ 뢄석/μ΄ν•΄ν•˜λŠ” μ‹œκ°„ μ ˆμ•½
    • 도메인 μš©μ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ μ΅œλŒ€ν•œ 도메인 κ·œμΉ™μ„ μ½”λ“œλ‘œ μž‘μ„±ν•˜κ²Œ λ˜λ―€λ‘œ 버그도 κ°μ†Œ

'BE > DDD' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[DDD Start!] 3. μ• κ·Έλ¦¬κ±°νŠΈ  (0) 2021.06.09
[DDD Start!] 2. 아킀텍쳐 κ°œμš”  (0) 2021.06.07