MSA 와 DDD (1) (πŸ˜€Β μ™œ λ‚΄κ°€ MSA와 DDD 에 관심을 κ°–κ²Œ λ˜μ—ˆμ„κΉŒ?)

HeoSeungYeonΒ·2022λ…„ 2μ›” 23일
1
post-thumbnail

πŸ’‘ MSA와 DDD μ‹œλ¦¬μ¦ˆμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 순으둜 ν¬μŠ€νŒ…μ΄ μ§„ν–‰λ©λ‹ˆλ‹€.
(1) μ™œ λ‚΄κ°€ MSA와 DDD 에 관심을 κ°–κ²Œ λ˜μ—ˆμ„κΉŒ?
(2) DDDλ₯Ό ν™œμš©ν•œ MSA
(3) DDDμ—” μ–΄λ–€ λ¬Έμ œκ°€? feat. CQRS
(4) λͺ¨λ†€λ¦¬μ‹μ™€ MSA의 μ‘°ν•©

글에 λ“€μ–΄κ°€κΈ° μ•žμ„œ


MSA와 DDD 에 λŒ€ν•΄ ν•™μŠ΅ν•˜κ³  ν¬μŠ€νŒ…ν•˜κΈ° μ „, ν”„λ‘œμ νŠΈ κ²½ν—˜μ„ ν•˜λ©΄μ„œ λŠλ‚€λ°”λ₯Ό μ •λ¦¬ν•˜λŠ” 비쀑이 큰 ν”„λ‘€λ‘œκ·Έμ™€ 같은 글이닀. MSA와 DDD에 λŒ€ν•΄μ„œ 읽고 μ‹Άλ‹€λ©΄, λ°”λ‘œ λ‹€μŒ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•˜κΈΈ λ°”λž€λ‹€.

πŸ˜€Β μ™œ λ‚΄κ°€ MSA와 DDD 에 관심을 κ°–κ²Œ λ˜μ—ˆμ„κΉŒ?


ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ λ°±μ—”λ“œ λ°λΈŒμ½”μŠ€ 1κΈ° κ΅μœ‘κ³Όμ •μ„ μ§„ν–‰ν•˜λ©΄μ„œ β€˜Sky Scannerβ€™μ˜ API μ„œλ²„λ₯Ό ν΄λ‘ μ½”λ”©ν•˜λŠ” CarrierRoute ν”„λ‘œμ νŠΈμ™€ 동넀 이벀트 관리 μ„œλΉ„μŠ€μΈ Everevent ν”„λ‘œμ νŠΈλ₯Ό κ²½ν—˜ν•˜μ˜€λ‹€.

두 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ MSA와 DDD에 λ‚΄κ°€ 관심을 κ°–κ²Œλœ λ¬Έμ œλ“€μ„ 맞λ‹₯λœ¨λ ΈλŠ”λ° MSA와 DDD에 λŒ€ν•œ 곡뢀λ₯Ό ν•˜κΈ° 전에 κ·Έ 계기에 λŒ€ν•΄μ„œ λ¨Όμ € 정리해보면 쒋을 것 κ°™μ•„ 이번 ν¬μŠ€νŒ…μ„ μ€€λΉ„ν•˜κ²Œ λ˜μ—ˆλ‹€.

1. CarrierRoute ν”„λ‘œμ νŠΈ


CarrierRoute ν”„λ‘œμ νŠΈ 링크

CarrierRoute ν”„λ‘œμ νŠΈμ—μ„œ 3λͺ…μ˜ νŒ€μ›μ΄ 3가지 도메인을 각자 λΆ„λ‹΄ν•˜μ—¬ κ°œλ°œν•˜μ˜€λ‹€.

  • ν•­κ³΅νŽΈ
  • ν˜Έν…”
  • 렌트카

λ‚˜λŠ” μ—¬κΈ°μ„œ ν•­κ³΅νŽΈ 도메인을 맑아 λ‹€μŒκ³Ό 같은 API κ΅¬ν˜„μ„ λ§‘μ•˜λ‹€.

APIHttp MethodURI
ν•­κ³΅κΆŒ 전체 쑰회GET/api/v1/flights/
ν•­κ³΅νŽΈ 전체 쑰회GET/api/v1/flights/
ν•­κ³΅νŽΈ 단일 쑰회GET/api/v1/flights/{flightId}
ν•­κ³΅νŽΈ μ˜ˆμ•½POST/api/v1/bookings/flights
ν•­κ³΅νŽΈ μ˜ˆμ•½ 쑰회GET/api/v1/bookings/flights
ν•­κ³΅νŽΈ μ˜ˆμ•½ μƒμ„Έμ‘°νšŒGET/api/v1/bookings/flights/{bookingId}
ν•­κ³΅νŽΈ μ˜ˆμ•½ μ·¨μ†ŒDELETE/api/v1/bookings/flights/{bookingId}

What is problem?


ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” μ• μžμΌ ν”„λ‘œμ„ΈμŠ€ 쀑 ν•˜λ‚˜μΈ 슀크럼 λ°©μ‹μœΌλ‘œ 개발이 진행됐닀.

μš°λ¦¬νŒ€μ€ 2μ£Ό ν”„λ‘œμ νŠΈλ₯Ό 3번의 μŠ€ν”„λ¦°νŠΈλ‘œ λ‚˜λˆ„μ–΄ 일정을 κ³„νšν•˜μ˜€κ³ , 짧은 μΌμ •μ΄μ§€λ§Œ 반볡적인 μ£ΌκΈ°λ₯Ό κ°–μœΌλ©° 지속적인 κ°œμ„ μ΄ κ°€λŠ₯ν•œ μ• μžμΌ ν”„λ‘œμ„ΈμŠ€μ— κΈ°λŒ€λ₯Ό κ°–κ³  ν”„λ‘œμ νŠΈμ— μž„ν–ˆλ‹€.

첫 번째 μŠ€ν”„λ¦°νŠΈ λ•Œ,

  • μš”κ΅¬μ‚¬ν•­ 뢄석
  • μœ μ¦ˆμΌ€μ΄μŠ€ μž‘μ„±
  • API 섀계

λ₯Ό ν•˜κ³  두 번째 μŠ€ν”„λ¦°νŠΈ 땐, ERD 섀계λ₯Ό μ§„ν–‰ν•˜κ³  λ°”λ‘œ μ½”λ“œ κ°œλ°œμ— λ“€μ–΄κ°”λ‹€.

ν•˜μ§€λ§Œ 각자 λΆ„λ‹΄ν•œ μ½”λ“œκ°œλ°œμ— 듀어갔을 λ•Œ, λ‚˜λŠ” μš”κ΅¬μ‚¬ν•­κ³Ό API에 맞게 ERDκ°€ 잘 λΆ„λ¦¬λ˜μ–΄ μžˆμ§€ μ•ŠλŠ” λ¬Έμ œμ λ“€μ„ λ°œκ²¬ν•˜μ˜€λ‹€.

κ²°κ΅­ λ‹€λ₯Έ νŒ€μ›λ“€μ΄ μ½”λ“œ κ°œλ°œμ„ μ§€μ†μ μœΌλ‘œ μ΄λ£¨μ–΄λ‚˜κ°ˆ λ•Œ, λ‚˜λŠ” ERD μž¬μˆ˜μ • μž‘μ—…μ„ ν•˜λ©°, μ–΄λ €μš΄ 뢀뢄이 μžˆμ„ 땐 κ²Œλ”νƒ€μš΄μ— μ ‘μ†ν•˜μ—¬ νŒ€μ›κ³Ό λ©˜ν† λ‹˜κ»˜ μ§ˆλ¬Έμ„ λ˜μ§€λ©° ERDλ₯Ό μž¬μ„€κ³„ν•˜μ˜€λ‹€.

ERDλ₯Ό μž¬μ„€κ³„ν•˜λ©΄μ„œ 깨달은 점 은 λ‹€μŒκ³Ό κ°™μ•˜λ‹€.

  • 도메인이 κΈ°λŠ₯에 맞게 μ œλŒ€λ‘œ 뢄리 λ˜μ–΄μ§€μ§€ μ•Šμ•˜λ‹€.
    • 짧은 ν”„λ‘œμ νŠΈ κΈ°κ°„μœΌλ‘œ 인해 λ‹¨μˆœνžˆ ν•­κ³΅νŽΈ, ν˜Έν…”, 렌트카 3가지 λ„λ©”μΈμœΌλ‘œ 3λͺ…μ΄μ„œ 역할을 λ‚˜λˆ  μ„œλ‘œ κ°œλ°œμ— λŒ€ν•œ 간섭을 μ΅œμ†Œν™”ν•˜λ €κ³  ν–ˆμ—ˆλ‹€.
    • ν•˜μ§€λ§Œ κ·Έ λ‚΄λΆ€μ—λŠ” μ˜ˆμ•½ν•˜λŠ” 도메인, κ²°μ œν•˜λŠ” 도메인 λ“± 뢄리해야 ν•  도메인듀이 많이 μ‘΄μž¬ν–ˆλ‹€.
    • λ˜ν•œ μ§„μ •ν•œ μ• μžμΌ ν”„λ‘œμ„ΈμŠ€λ₯Ό 지ν–₯ν•˜λ €λ©΄ μ„œλ‘œμ— λŒ€ν•œ 도메인을 이해λ₯Ό λ°”νƒ•μœΌλ‘œ 개발이 이루어져야 νŽ˜μ–΄ ν”„λ‘œκ·Έλž˜λ°λ“±μ΄ μˆ˜μ›”ν•˜λ‹€.
  • μ• μžμΌ ν”„λ‘œμ„ΈμŠ€κ°€ μŠ€ν”„λ¦°νŠΈλΌλŠ” μ£ΌκΈ°λ₯Ό κ°–μœΌλ©° 지속적인 κ°œμ„ μ„ ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ΄μ§€λ§Œ λΌˆλŒ€λ₯Ό μž‘λŠ” ERD μ„€κ³„λŠ” 깊게 κ³ λ―Όν•˜μ—¬ μ™„μ„± ν•΄μ•Όν•œλ‹€.
    • 그렇지 μ•ŠμœΌλ©΄ 개발 도쀑에 ERD μ„€κ³„μ˜ ν—ˆμ μ„ 발견 μ‹œ, μˆ˜μ • μ‹œκ°„μ΄ λŠ˜μ–΄λ‚œλ‹€.

CarrierRoute ν”„λ‘œμ νŠΈ κΈ°κ°„ 땐, λ©˜ν† λ‹˜κ³Ό β€˜λ„λ©”μΈμ„ 잘 λΆ„λ¦¬ν•˜κ³  μ„€κ³„ν•˜λŠ” 방법'에 λŒ€ν•΄μ„œ 이야기λ₯Ό 많이 λ‚˜λˆ΄λ‹€. λ©˜ν† λ‹˜μ€ μžμ‹ μ˜ νšŒμ‚¬μ—μ„œ 적용 쀑인 DDD와 이벀트 μŠ€ν† λ° 방식에 λŒ€ν•΄μ„œ μ΄μ•ΌκΈ°ν•΄μ£Όμ…¨λŠ”λ°, 도메인을 μ œλŒ€λ‘œ λΆ„λ¦¬ν•˜μ§€ λͺ»ν•œ 채 κ°œλ°œμ„ ν•˜λ˜ν„°λΌ λ”μš± λ‚΄μš©μ΄ μ™€λ‹Ώμ•˜μ—ˆλ‹€.

2. Everevent ν”„λ‘œμ νŠΈ


Everevent ν”„λ‘œμ νŠΈ 링크

Everevent ν”„λ‘œμ νŠΈμ—μ„œλ„ CarrierRoute ν”„λ‘œμ νŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 3λͺ…μ˜ νŒ€μ›μ΄μ„œ μ§„ν–‰ν•˜μ˜€λ‹€.

ν•™μ°½μ‹œμ ˆ λΆ€ν„° ν”„λ‘œμ νŠΈλ“€μ„ ν•΄μ˜€λ©΄μ„œ λŠκ»΄μ™”λ˜κ±΄λ° 맀번 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄ λ‹€μŒ ν”„λ‘œμ νŠΈ λ•Œ β€˜μ‘°κΈˆμ˜ μ„±μž₯’을 λͺΈμ†Œ μ²΄κ°ν•œλ‹€λŠ” 것이닀. (🀭)

CarrierRoute ν”„λ‘œμ νŠΈλ₯Ό 마치고 λ°”λ‘œ ν•œλ‹¬ λ’€, Everevent ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ©΄μ„œ 느꼈던 β€˜μ‘°κΈˆμ˜ μ„±μž₯’을 미리 λ§ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€. (도메인 뢄리 및 섀계 κ΄€μ μ—μ„œλ§Œ)

  1. 도메인을 APIλ₯Ό 섀계와 ν•¨κ»˜, μžμ› κ΄€μ μ—μ„œ λ”μš± μ„ΈλΆ€μ μœΌλ‘œ λΆ„λ¦¬ν•˜μ˜€λ‹€.
    1. 멀버, 이벀트, κ°€κ²Œ, 리뷰, 즐겨찾기, μ’‹μ•„μš” 둜 λΆ„λ¦¬ν•˜μ˜€μœΌλ©° 데이터가 μ €μž₯되고 μ‘°νšŒλ˜λŠ” 것을 κ³ λ €ν•˜μ—¬ ERD와 ν•¨κ»˜ APIλ₯Ό μ„€κ³„ν•˜λ‹ˆ, Restful API 섀계 뿐만 μ•„λ‹ˆλΌ, 개발 λ˜ν•œ μ‰½κ²Œ ν•  수 μžˆμ—ˆλ‹€.
  2. β€˜νŠΉμ • 도메인 - κ°œμΈβ€™ μ‹μœΌλ‘œ 역할을 λ‚˜λˆ„μ§€ μ•Šμ•˜λ‹€.
    1. 이전 ν”„λ‘œμ νŠΈμ—μ„œ 잘λͺ»ν–ˆλ˜ 점, 덕뢄에 각자 λͺ¨λ“  도메인을 μ΄ν•΄ν•˜κ³  μžˆμ–΄ νŽ˜μ–΄ ν”„λ‘œκ·Έλž˜λ°μ΄ μˆ˜μ›”ν•΄μ‘Œλ‹€.

1. 도메인을 APIλ₯Ό 섀계와 ν•¨κ»˜ β€˜μžμ› κ΄€μ β€™μ—μ„œ λ”μš± μ„ΈλΆ€μ μœΌλ‘œ λΆ„λ¦¬ν•˜μ˜€λ‹€.


이전 ν”„λ‘œμ νŠΈμ— λΉ„ν•΄ μƒλŒ€μ μœΌλ‘œ μš”κ΅¬μ‚¬ν•­μ΄ κ°„λ‹¨ν•΄μ„œ λΆ„λ¦¬ν•˜κΈ° 쉬웠을 수 μžˆμ§€λ§Œ, κ°€μ‹œμ μœΌλ‘œ β€˜μ„ΈλΆ„ν™”λœ 도메인’을 λ³Ό 수 μžˆμ–΄μ„œ λ§Œμ‘±μŠ€λŸ¬μ› λ‹€.

Everevent Project ERD


2. β€˜νŠΉμ • 도메인 - κ°œμΈβ€™ μ‹μœΌλ‘œ 역할을 λ‚˜λˆ„μ§€ μ•Šμ•˜λ‹€.


이전 ν”„λ‘œμ νŠΈμ—μ„œ 잘λͺ»ν–ˆλ˜ 점을 고치기 μœ„ν•΄μ„œ μ–΄λ–»κ²Œ 해야할지 고민이 λ§Žμ•˜λ‹€. 운이 μ’‹κ²Œλ„(?!) 이전 λ°©μ‹μ˜ ν‹€μ—μ„œ λ²—μ–΄λ‚˜μ§€ λͺ»ν•œ λ°©λ²•μœΌλ‘œ 역할을 λ‚˜λˆ„λ €λ‹€κ°€ 이걸 κ²Œλ”νƒ€μš΄μ—μ„œ μ§€μΌœλ³Έ λ©˜ν† λ‹˜μ˜ ν”Όλ“œλ°±μ— 정신이 λ²ˆμ©ν–ˆλ˜ 기얡이 μžˆλ‹€.

β€œμ΅œλŒ€ν•œ μž‘μ€ λ‹¨μœ„λ‘œ 이슈λ₯Ό 파고 μš°μ„ μˆœμœ„ λ³„λ‘œ μ •λ ¬ν•œ λ’€, λ‹€ 끝낸 μ‚¬λžŒμ΄ λ‹€μŒ 이슈λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•΄λ³΄μ„Έμš”!” - λ©˜ν† λ‹˜ Says


κ·Έλž˜μ„œ λ‹€μŒκ³Ό 같은 κ·œμΉ™μ„ 톡해 역할을 λΆ„λ‹΄ν•˜μ˜€κ³  이전에 λŠλΌμ§€ λͺ»ν–ˆλ˜ μ—¬λŸ¬ μž₯점듀을 λ°œκ²¬ν•  수 μžˆμ—ˆλ‹€.

μ—­ν•  λΆ„λ‹΄

  • 각자 λŠ₯λ™μ μœΌλ‘œ μžμ‹ μ˜ 이슈λ₯Ό μ°Ύμ•„ ν•΄κ²°ν•  수 μžˆλ‹€.
  • λͺ¨λ‘κ°€ 도메인을 μ΄ν•΄ν•˜κ³  μžˆμ–΄ νŽ˜μ–΄ ν”„λ‘œκ·Έλž˜λ° μ‹œ, νš¨μœ¨μ μ΄λ‹€.
  • 역할은 API λ³„λ‘œ λ‚˜λˆ΄μ§€λ§Œ, 이슈λ₯Ό 잘개 μͺΌκ°œλ‹ˆ 병λͺ©ν˜„상이 μ€„μ–΄λ“€μ—ˆλ‹€.

3. 글을 마치며


λ‚΄ 생각이 β€œμ„œλ²„? 개발만 μž˜ν•˜λ©΄ λ˜μ§€β€ μ—μ„œ β€œκ°œλ°œ μž˜ν•˜λ €λ©΄ 도메인 섀계에 λŒ€ν•œ κΉŠμ΄κ°€ ν•„μš”ν•˜λ‹€.” 더 λ‚˜μ•„κ°€, κΈ°λŠ₯별 μ„œλΉ„μŠ€λ₯Ό 독립적인 λͺ¨λ“ˆλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΄€λ¦¬ν•˜λŠ” β€œMSA κ³΅λΆ€ν•΄λ³΄μž!” 둜 λ°”λ€Œκ²Œ 된 μ†Œμ€‘ν•œ κ²½ν—˜μΈ 두 ν”„λ‘œμ νŠΈμ˜€λ‹€.

각 λΆ€λΆ„ λΆ€λΆ„ λ§ˆλ‹€ λŠλ‚€μ μ„ 즉ν₯적으둜 적느라 μž₯ν™©ν–ˆμ§€λ§Œ,

두 ν”„λ‘œμ νŠΈλ₯Ό 톡해

  • 도메인 μ„€κ³„μ˜ μ€‘μš”μ„±
  • μ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μ˜ μ€‘μš”μ„±

을 μ•Œκ²Œ 됐던 것 κ°™λ‹€.

κ·Έλž˜μ„œ λ‹€μŒ ν¬μŠ€νŒ… λΆ€ν„°λŠ” DDD(도메인 주도 개발)κ³Ό MSA(마이크둜 μ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜)에 λŒ€ν•΄μ„œ κ³΅λΆ€ν•˜κ³ μž ν•œλ‹€.
ν™”μ΄νŒ…! πŸ€›πŸ»

2개의 λŒ“κΈ€

comment-user-thumbnail
2022λ…„ 8μ›” 20일

잘 읽고 κ°‘λ‹ˆλ‹€ :)

1개의 λ‹΅κΈ€