Skip to content

hhko/beyond-code

Repository files navigation

Make It Work, Make It Right, Make It Fast
λ―Έμ†Œ μ§“λŠ” μ œν’ˆ, λ―Έμ†Œ μ§“λŠ” νŒ€, λ―Έμ†Œ μ§“λŠ” μ½”λ“œ

Build DddGym Monolithic

μ €μž₯μ†Œ μ†Œκ°œ μ˜€λ””μ˜€ .wav 파일 by λ…ΈνŠΈλΆLM

λͺ©ν‘œ

지속 κ°€λŠ₯ν•œ μ½”λ“œ
μ½”λ“œλŠ” νŒ€μ΄ ν•¨κ»˜ μ™„μ„±ν•΄ κ°€λŠ” ν•œ 편의 κΈ€μž…λ‹ˆλ‹€. μš°λ¦¬λŠ” κ·Έ 글을 차곑차곑 μŒ“μ•„ μ œν’ˆμ„ λ§Œλ“€μ–΄ κ°‘λ‹ˆλ‹€.

  • μ†ŒμŠ€ μ½”λ“œμ˜ κ΅¬μ‘°λŠ” μ±…μ˜ λͺ©μ°¨μ²˜λŸΌ λͺ…ν™•ν•˜κ³  직관적이어야 ν•˜λ©°, 이λ₯Ό 톡해 도메인과 μ œν’ˆμ˜ 이해λ₯Ό μžμ—°μŠ€λŸ½κ²Œ μ΄λŒμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” λ‹¨μˆœν•œ 검증 도ꡬλ₯Ό λ„˜μ–΄, λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ ν•™μŠ΅ν•˜λŠ” ν•΅μ‹¬κ°€μ΄λ“œκ°€ λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

지속 κ°€λŠ₯ν•œ μ½”λ“œ

지속 κ°€λŠ₯ν•œ μ½”λ“œλŠ” 마치 ν•œ 편의 μ•„λ¦„λ‹€μš΄ μ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€. μ‹œκ°„μ΄ ν˜λŸ¬λ„ κ·Έ μ˜λ―Έμ™€ κ°€μΉ˜κ°€ λ°”λž˜μ§€ μ•Šκ³ , μ½λŠ” μ΄μ—κ²Œ κΎΈμ€€ν•œ 감동을 μ£ΌλŠ” μ½”λ“œμž…λ‹ˆλ‹€. 이런 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 일은 λ‹¨μˆœνžˆ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 것을 λ„˜μ–΄, μ½”λ“œμ˜ 아름닀움과 λͺ…λ£Œν•¨μ„ μΆ”κ΅¬ν•˜λŠ” 개발자의 μ² ν•™μ΄μž μžμ„Έμž…λ‹ˆλ‹€.

μ½”λ“œλŠ” 마치 ν•œ 그루의 λ‚˜λ¬΄μ²˜λŸΌ μžλžλ‹ˆλ‹€.

λ‚˜λ¬΄λŠ” 처음 심을 λ•ŒλŠ” μž‘κ³  μ—°μ•½ν•˜μ§€λ§Œ, μ‹œκ°„μ΄ 흐λ₯΄λ©΄μ„œ 뿌리λ₯Ό 내리고 κ°€μ§€λ₯Ό λ»—μ–΄ κ²°κ΅­ μšΈμ°½ν•œ μˆ²μ„ 이루게 λ©λ‹ˆλ‹€. 지속 κ°€λŠ₯ν•œ μ½”λ“œλ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 처음 μž‘μ„±ν•  땐 μž‘μ€ 뢀뢄에 λΆˆκ³Όν• μ§€ λͺ°λΌλ„, μ‹œκ°„μ΄ μ§€λ‚˜λ©΄μ„œ 점차 더 λ§Žμ€ κΈ°λŠ₯을 λ‹΄κ³ , 더 λ§Žμ€ μ΄λ“€μ˜ 손을 거치며 μ œν’ˆκ³Ό ν•¨κ»˜ μ„±μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

이처럼 지속 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 일은 λ‹¨μˆœν•œ 기술 κ΅¬ν˜„μ„ λ„˜μ–΄, 미래λ₯Ό λ‚΄λ‹€λ³΄λŠ” μ•ˆλͺ©κ³Ό μ±…μž„κ°μ΄ ν•„μš”ν•œ μΌμž…λ‹ˆλ‹€. μ½”λ“œλŠ” κ²°κ΅­ μž‘μ„±μžμ˜ μ² ν•™κ³Ό κ°€μΉ˜κ΄€μ΄ κ³ μŠ€λž€νžˆ λ“œλŸ¬λ‚˜λŠ” μž‘ν’ˆμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μš°λ¦¬λŠ” μŠ€μŠ€λ‘œμ—κ²Œ λŠμž„μ—†μ΄ μ§ˆλ¬Έν•΄μ•Ό ν•©λ‹ˆλ‹€

  • 이 μ½”λ“œκ°€ μ‹œκ°„μ΄ μ§€λ‚˜λ„ μ‰½κ²Œ μ΄ν•΄λ˜κ³  μœ μ§€λ³΄μˆ˜λ  수 μžˆμ„κΉŒ?
  • 이 μ½”λ“œκ°€ λ‹€λ₯Έ μ‚¬λžŒλ“€κ³Όμ˜ ν˜‘μ—…μ— 걸림돌이 λ˜μ§€λŠ” μ•Šμ„κΉŒ?
  • 이 μ½”λ“œκ°€ λ³€ν™”ν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ— μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•  수 μžˆμ„κΉŒ?

이 μ§ˆλ¬Έλ“€μ€ μš°λ¦¬κ°€ λ‚˜μ•„κ°€μ•Ό ν•  λ°©ν–₯을 μ•Œλ €μ£ΌλŠ” λ‚˜μΉ¨λ°˜μ΄ λ©λ‹ˆλ‹€. 가독성이 높은 μ½”λ“œ, λͺ…ν™•ν•˜κ²Œ μ •μ˜λœ μΈν„°νŽ˜μ΄μŠ€, 그리고 μ‹ λ’°ν•  수 μžˆλŠ” ν…ŒμŠ€νŠΈλŠ” 지속 κ°€λŠ₯ν•œ μ½”λ“œμ˜ 핡심 μš”μ†Œμ΄μž, μ œν’ˆμ˜ 지속적인 μ§„ν™”λ₯Ό λ’·λ°›μΉ¨ν•˜λŠ” κΈ°λ°˜μž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 지속 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 길은 κ²°μ½” 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€. λ•Œλ‘œλŠ” λ‹Ήμž₯의 λ§ˆκ°μ— 쫓겨, μž„μ‹œλ°©νŽΈμ— κΈ°λŒ€κ³  싢은 μœ ν˜Ήμ— 빠지기도 ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μš°λ¦¬λŠ” μ–Έμ œλ‚˜ κΈ΄ 호흑으둜 바라봐야 ν•©λ‹ˆλ‹€. μΌμ‹œμ μΈ ν•΄κ²°μ±…λ³΄λ‹€λŠ” μž₯기적인 κ΄€μ μ—μ„œμ˜ ν’ˆμ§ˆμ„ 더 μ€‘μš”ν•˜κ²Œ 여겨야 ν•©λ‹ˆλ‹€. 그것이 μ§„μ •ν•œ 개발자의 μ‹œμ„ μ΄λ©°, νŒ€κ³Ό μ œν’ˆμ„ μœ„ν•œ μ§„μ •ν•œ 기여라고 λ―ΏμŠ΅λ‹ˆλ‹€.

μ œκ°€ κΏˆκΎΈλŠ” μ½”λ“œλŠ”, β€˜μ œν’ˆκ³Ό ν•¨κ»˜ μ„±μž₯ν•˜λŠ” μ½”λ“œβ€™, β€˜λ‹€μ‹œ 읽고 싢은 μ½”λ“œβ€™, β€˜λˆ„κ΅°κ°€μ—κ²Œ 배움이 λ˜λŠ” μ½”λ“œβ€™μž…λ‹ˆλ‹€. 그것이 μ œκ°€ μ½”λ“œλ₯Ό μ“°λŠ” 이유이며, 지속 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό ν–₯ν•΄ λŠμž„μ—†μ΄ λ‚˜μ•„κ°€λŠ” μ΄μœ μž…λ‹ˆλ‹€. 그리고 이 여정은 ν˜Όμžκ°€ μ•„λ‹Œ, 같은 κΏˆμ„ κΎΈλŠ” κ°œλ°œμžλ“€κ³Ό ν•¨κ»˜ λ§Œλ“€μ–΄κ°€λŠ” κΈΈμž…λ‹ˆλ‹€.

κ²°κ΅­, 지속 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 일은 λ‹¨μˆœν•œ 기술적 문제λ₯Ό λ„˜μ–΄μ„œ 인간적인 λ¬Έμ œμ΄κΈ°λ„ ν•©λ‹ˆλ‹€. μ„œλ‘œλ₯Ό λ°°λ €ν•˜κ³  μ‘΄μ€‘ν•˜λ©°, ν•¨κ»˜ μ„±μž₯ν•˜λŠ” κ²ƒμ΄μ•Όλ§λ‘œ 지속 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μœ„ν•œ κ°€μž₯ μ€‘μš”ν•œ μš”μ†ŒλΌκ³  λ―ΏμŠ΅λ‹ˆλ‹€.

이것이 λ°”λ‘œ 지속 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό ν–₯ν•œ, Beyond Code μ €μž₯μ†Œμ˜ μ΄μ•ΌκΈ°μž…λ‹ˆλ‹€.

도메인 주도 섀계와 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

μ£Όμš” κ°œλ…

도메인 주도 μ„€κ³„μ˜ '무엇을 ν‘œν˜„ν• μ§€'와 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 'μ–΄λ–»κ²Œ ν‘œν˜„ν• μ§€'κ°€ λ§Œλ‚˜μ„œ, 변경에 κ°•ν•˜κ³ , ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•˜κ³ , λͺ…ν™•ν•œ μ˜λ„λ₯Ό κ°€μ§„ μ½”λ“œλ₯Ό λ§Œλ“­λ‹ˆλ‹€.

  • 무엇을 ν‘œν˜„ν• μ§€: λ³΅μž‘μ„± 뢄리
    • λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 도메인 λͺ¨λΈ μ€‘μ‹¬μœΌλ‘œ ν’€μ–΄λ‚˜κ°€λŠ” 섀계 λ°©λ²•μž…λ‹ˆλ‹€.
    • 도메인 μ „λ¬Έκ°€μ˜ μ–Έμ–΄(Ubiquitous Language)둜 μ œν’ˆμ„ μ„€κ³„ν•˜λŠ” 것이 ν•΅μ‹¬μž…λ‹ˆλ‹€.
  • μ–΄λ–»κ²Œ ν‘œν˜„ν• μ§€: λΆ€μž‘μš© μ΅œμ†Œν™”
    • ν•¨μˆ˜(μˆ˜ν•™μ μΈ ν•¨μˆ˜)에 κΈ°λ°˜ν•œ ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μž…λ‹ˆλ‹€.
    • μƒνƒœ λ³€κ²½ 없이, μž…λ ₯에 따라 μΌκ΄€λœ 좜λ ₯을 보μž₯ν•©λ‹ˆλ‹€.

κ³΅ν†΅λœ ꢁ극의 λͺ©ν‘œ

  • 변경에 κ°•ν•œ λͺ¨λΈ
    • 도메인 주도 섀계: λ³΅μž‘μ„± 뢄리 (κ΄€μ‹¬μ‚¬μ˜ 뢄리: 도메인과 기술)
    • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°: λΆ€μž‘μš© μ΅œμ†Œν™” (ν•©μ„± ν•¨μˆ˜: λΆ€μž‘μš© μ—†λŠ” 순수 ν•¨μˆ˜ μ—°κ²°)
  • 예츑 κ°€λŠ₯ν•œ λ™μž‘
    • 도메인 주도 섀계: λͺ…ν™•ν•œ 경계 (Bounded Context)
    • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°: 순수 ν•¨μˆ˜ μ§€ν–₯
  • ν’λΆ€ν•œ 도메인 ν‘œν˜„
    • 도메인 주도 섀계: λͺ…ν™•ν•œ 의미 λΆ€μ—¬ (Ubiquitous Language)
    • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°: νƒ€μž… 기반 섀계

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•„ν‚€ν…μ²˜

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

μ•„ν‚€ν…μ²˜ λΆ„λ₯˜

μ•„ν‚€ν…μ²˜λŠ” 마치 μ‹λ¬Όμ²˜λŸΌ 'ν† μ–‘' μœ„μ—μ„œ μžλž€λ‹€

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•„ν‚€ν…μ²˜λŠ” 식물에 λΉ„μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ•„ν‚€ν…μ²˜λŠ” β€˜μ’…μžβ€™μ— λΆˆκ³Όν•˜κ³ , κ·Έ μ’…μžκ°€ 자라기 μœ„ν•΄μ„œλŠ” μ μ ˆν•œ ν† μ–‘(개발 λ¬Έν™”), λ¬Ό(μžλ™ν™”λœ 배포), λΉ›(인프라), μ˜¨λ„(κ°€μΉ˜ 전달 속도)κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • 쒋은 μ’…μžλΌλ„ μ²™λ°•ν•œ 땅에선 μžλž„ 수 μ—†κ³ , 잘 μžλΌλŠ” ꡬ쑰라도 계속 λ°©μΉ˜ν•˜λ©΄ 금방 말라 μ£½μŠ΅λ‹ˆλ‹€.

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

  • μ•„ν‚€ν…μ²˜ 원칙 (Separation of Concerns)
    • 1992λ…„, μ œν’ˆμ„ ꡬ성할 λ•Œ 관심사(μ—­ν• κ³Ό μ±…μž„ 그리고 ν˜‘λ ₯)λ₯Ό κ΅¬λΆ„ν•˜λŠ” κ°œλ…μ΄ μ†Œκ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • λŒ€ν‘œμ μœΌλ‘œ Three-layered Architecture(ν”„λ¦¬μ  ν…Œμ΄μ…˜, λΉ„μ¦ˆλ‹ˆμŠ€, 데이터 계측)와 ECB(Entity-Control-Boundary) λͺ¨λΈμ΄ λ“±μž₯ν•˜μ—¬, λ ˆμ΄μ–΄μ™€ μ—”ν‹°ν‹°λ₯Ό λ‚˜λˆ  μ„€κ³„ν•˜λŠ” 방식이 μ œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • 이둜써 μ½”λ“œμ˜ ꡬ쑰와 μ±…μž„μ΄ λͺ…ν™•ν•΄μ§€κ³ , μœ μ§€λ³΄μˆ˜μ™€ ν™•μž₯이 μ‰¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€.
  • 개발 방법둠 (Development Methodology)
    • 1999λ…„λΆ€ν„°, 개발 방식에도 λ³€ν™”κ°€ μƒκΉλ‹ˆλ‹€.
    • 읡슀트림 ν”„λ‘œκ·Έλž˜λ°(XP)κ³Ό μ• μžμΌ(Agile) 방법둠이 λ“±μž₯ν•˜λ©°, 고객의 μš”κ΅¬μ— λΉ λ₯΄κ²Œ λŒ€μ‘ν•˜κ³  κ°€μΉ˜λ₯Ό λΉ λ₯΄κ²Œ μ „λ‹¬ν•˜λŠ” 것이 μ€‘μš”ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.
    • 2001λ…„ λ°œν‘œλœ μ• μžμΌ μ„ μ–Έ(Agile Manifesto)λŠ” μ§€κΈˆκΉŒμ§€λ„ μ†Œν”„νŠΈμ›¨μ–΄ 개발 철학에 큰 영ν–₯을 미치고 μžˆμŠ΅λ‹ˆλ‹€.
  • 섀계 기술 (Design Techniques)
    • 2002λ…„, μΌ„νŠΈ 벑이 ν…ŒμŠ€νŠΈ 주도 개발(TDD)을 μ†Œκ°œν•˜λ©΄μ„œ, μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° 전에 ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € λ§Œλ“€κ³  μ„€κ³„ν•˜λŠ” μƒˆλ‘œμš΄ 접근이 ν™•μ‚°λ©λ‹ˆλ‹€.
    • 2003λ…„, 에릭 μ—λ°˜μŠ€κ°€ λ°œν‘œν•œ 도메인 주도 섀계(DDD)λŠ” λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ€‘μ‹¬μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜λŠ” κ°•λ ₯ν•œ 섀계 μ „λž΅μœΌλ‘œ μžλ¦¬μž‘μ•˜μŠ΅λ‹ˆλ‹€.
    • 두 κΈ°μˆ μ€ μ§€κΈˆκΉŒμ§€λ„ λ§Žμ€ κ°œλ°œμžλ“€μ΄ μ‚¬μš©ν•˜λŠ” 핡심 섀계 κΈ°λ²•μž…λ‹ˆλ‹€.
  • μ•„ν‚€ν…μ²˜ νŒ¨ν„΄ (Architecture Patterns)
    • 2005λ…„λΆ€ν„°, μ‹€μ œ μ œν’ˆ 섀계에 ν™œμš©ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ μ•„ν‚€ν…μ²˜ νŒ¨ν„΄μ΄ λ“±μž₯ν•©λ‹ˆλ‹€.
      • ν—₯사고날 μ•„ν‚€ν…μ²˜(Ports & Adapters) – μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ μ˜μ‘΄μ„±μ„ 쀄이고, 핡심 도메인을 λ³΄ν˜Έν•˜λŠ” ꡬ쑰.
      • μ–΄λ‹ˆμ–Έ μ•„ν‚€ν…μ²˜ – 도메인 μ€‘μ‹¬μœΌλ‘œ λ ˆμ΄μ–΄λ₯Ό κ°μ‹ΈλŠ” 방식.
      • 클린 μ•„ν‚€ν…μ²˜ – 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ€‘μ‹¬μœΌλ‘œ μ˜μ‘΄μ„±μ„ λ°”κΉ₯ λ°©ν–₯으둜만 ν–₯ν•˜κ²Œ 섀계.
    • 이듀 νŒ¨ν„΄μ€ λͺ¨λ‘ κ΄€μ‹¬μ‚¬μ˜ 뢄리와 μ˜μ‘΄μ„± μ œμ–΄λΌλŠ” 원칙을 기반으둜 λ°œμ „ν•΄ μ™”μŠ΅λ‹ˆλ‹€.
  • 섀계 ν…ŒμŠ€νŠΈ (Design Test)
    • 2009λ…„, ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ κ°œλ…μ΄ μ†Œκ°œλ˜λ©°, μœ λ‹› β†’ 톡합 β†’ E2E(μ—”λ“œνˆ¬μ—”λ“œ) ν…ŒμŠ€νŠΈλ₯Ό κ³„μΈ΅μ μœΌλ‘œ μ„€κ³„ν•˜λŠ” μ „λž΅μ΄ κ°•μ‘°λ©λ‹ˆλ‹€.
    • ν…ŒμŠ€νŠΈ λ˜ν•œ μ„€κ³„μ˜ μΌλΆ€λΆ„μœΌλ‘œ κ°„μ£Όλ˜λ©°, μ•ˆμ •μ„±κ³Ό ν’ˆμ§ˆμ„ 보μž₯ν•˜λŠ” μ€‘μš”ν•œ μˆ˜λ‹¨μ΄ λ©λ‹ˆλ‹€.

μ•„ν‚€ν…μ²˜ 기술 λ§΅

  • μ•„ν‚€ν…μ²˜λŠ” 도메인 주도 섀계와 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ 기반으둜 λ ˆμ΄μ–΄λ₯Ό λͺ…ν™•νžˆ κ΅¬λΆ„ν•˜κ³ , 각 λ ˆμ΄μ–΄μ˜ μ—­ν• κ³Ό μš”μ²­Β·μ‘λ‹΅ 방식을 ν†΅μΌν•˜λŠ” κ²ƒμ—μ„œ μ‹œμž‘λ©λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ κ΄€μ‹¬μ‚¬μ˜ 뢄리(λ ˆμ΄μ–΄)λŠ” ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ ꡬ쑰λ₯Ό μ μš©ν•œ μžλ™ν™” ν…ŒμŠ€νŠΈλ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•˜κ³ , 각 λ ˆμ΄μ–΄μ—μ„œ μƒμ„±λ˜λŠ” 둜그, μ§€ν‘œ, 좔적 데이터λ₯Ό 일관성 있게 μˆ˜μ§‘Β·κ΄€λ¦¬ν•  수 μžˆλŠ” κΈ°λ°˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • 특히 λ‘œκ·ΈλŠ” 운영 ν™˜κ²½μ—μ„œ ν•„μˆ˜μ μΈ μš”κ΅¬μ‚¬ν•­μœΌλ‘œ, 예츑 κ°€λŠ₯ν•œ μ‹€νŒ¨(Validation Error λ“±)와 예츑 λΆˆκ°€λŠ₯ν•œ μ‹€νŒ¨(Exception λ“±)λ₯Ό κ΅¬λΆ„ν•˜κ³ , 이듀을 λ‹¨μΌν™”λœ μ—λŸ¬ νƒ€μž…μœΌλ‘œ 톡합해 λ‹€μ–‘ν•œ ν™˜κ²½μ—μ„œλ„ μΌκ΄€λœ 였λ₯˜ 뢄석과 운영 ν’ˆμ§ˆ κ°œμ„ μ΄ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.
  • μˆ˜μ§‘λœ λ‘œκ·ΈΒ·μ§€ν‘œΒ·μΆ”μ  λ°μ΄ν„°λŠ” μ œν’ˆ 병λͺ© ꡬ간을 νŒŒμ•…ν•˜κ³ , 처리 속도 κ°œμ„ κ³Ό μž₯μ•  원인 λΆ„μ„μ˜ 핡심 μžλ£Œκ°€ λ©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 ν…ŒμŠ€νŠΈ β†’ CI/CD β†’ κ΄€μ°° κ°€λŠ₯μ„±(Observability) β†’ μ•„ν‚€ν…μ²˜ ν”Όλ“œλ°±μœΌλ‘œ μ΄μ–΄μ§€λŠ” 지속적 ν’ˆμ§ˆ κ°œμ„  사이클이 ν˜•μ„±λ©λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• μ•„ν‚€ν…μ²˜ (Internal μ•„ν‚€ν…μ²˜)

ν•¨μˆ˜ν˜• μ•„ν‚€ν…μ²˜ ν…ŒμŠ€νŠΈ

ν•¨μˆ˜ν˜• μ•„ν‚€ν…μ²˜ 좔적

ν•¨μˆ˜ν˜• μ•„ν‚€ν…μ²˜ 예제

  • Fin<T> 였λ₯˜λ₯Ό ν¬ν•¨ν•œ κ²°κ³Ό ν‘œν˜„
    • Fin<T>λŠ” 성곡(Succ) λ˜λŠ” μ‹€νŒ¨(Fail) μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°’μž…λ‹ˆλ‹€. μ΄λŠ” Either<Error, T>와 μœ μ‚¬ν•˜μ§€λ§Œ, 였λ₯˜ 처리λ₯Ό 보닀 κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
      • 성곡: Succ(value) ν˜•νƒœλ‘œ 값을 ν¬ν•¨ν•©λ‹ˆλ‹€.
      • μ‹€νŒ¨: Fail(error) ν˜•νƒœλ‘œ 였λ₯˜ 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
    • μ΄λŸ¬ν•œ κ΅¬μ‘°λŠ” μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ 였λ₯˜λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  • FinT<M, T>: λͺ¨λ‚˜λ“œ λ³€ν™˜κΈ°(Monad Transformer)
    • FinT<M, T>λŠ” Fin<T>λ₯Ό λ‹€λ₯Έ λͺ¨λ‚˜λ“œ Mκ³Ό κ²°ν•©ν•˜μ—¬ 볡합적인 효과λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•˜λŠ” λͺ¨λ‚˜λ“œ λ³€ν™˜κΈ°μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, FinT<IO, T>λŠ” 동기 및 비동기 IO μž‘μ—… 쀑 λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό Fin을 톡해 λͺ…μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•  수 있게 ν•©λ‹ˆλ‹€.
    • μ΄λŸ¬ν•œ κ΅¬μ‘°λŠ” μ—¬λŸ¬ λͺ¨λ‚˜λ“œλ₯Ό κ²°ν•©ν•˜μ—¬ λ³΅μž‘ν•œ 효과λ₯Ό μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•˜λ©°, 였λ₯˜ 처리λ₯Ό λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

Microservices μ•„ν‚€ν…μ²˜ (External μ•„ν‚€ν…μ²˜)

TODO

κΈ€μ“°κΈ° μ§€μΉ¨

κΈ€μ“°κΈ° Hands-on Labs

1. 도메인 νƒ€μž… (κ°’ 객체)

λ‹¨μˆœν•œ Divide κ΅¬ν˜„μ„ 좜발점으둜 μ‚Όμ•„, λΆ€μž‘μš© 없이 예츑 κ°€λŠ₯ν•œ 순수 ν•¨μˆ˜(Pure Function)둜 κ°œμ„ ν•˜κ³ , 이λ₯Ό 톡해 μœ νš¨ν•œ κ°’λ§Œ ν‘œν˜„ν•  수 μžˆλŠ” 도메인 νƒ€μž…(Value Object)을 μ μ§„μ μœΌλ‘œ 섀계해 λ‚˜κ°€λŠ” 과정을 톡해 도메인 주도 섀계와 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°€μΉ˜λ₯Ό ν•¨κ»˜ μ΅νž™λ‹ˆλ‹€.

// κ°œμ„  μ „
int Divide(int x, int y)
{
  return x / y;
}

// κ°œμ„  ν›„
int Divide(int x, NonZeroInt y)
{
  return x / y;
}

이 과정은 의미 μžˆλŠ” νƒ€μž… 섀계, μž…λ ₯ μœ νš¨μ„± 보μž₯, 였λ₯˜ 처리의 λͺ…ν™•ν™”, 도메인 μ–Έμ–΄ κ°•ν™” 등을 μ•„μš°λ₯΄λ©°, μœ μ§€λ³΄μˆ˜μ„±κ³Ό μ•ˆμ •μ„±μ΄ 높은 μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λŠ” κΈ°λ°˜μ„ λ§ˆλ ¨ν•©λ‹ˆλ‹€.

2. 도메인 νƒ€μž… (μ—”ν‹°ν‹°)

Scott Wlaschin "Designing with types" F# μ½”λ“œλ₯Ό C# 기반으둜 μž¬κ΅¬μ„±ν•˜λŠ” κΈ€μž…λ‹ˆλ‹€.

  • TODO

3. ν”„λ‘œμ νŠΈ Clean Architecture

Amichai Mantinband "Clean Architecture" ν…œν”Œλ¦Ώμ„ ν•¨μˆ˜ν˜• 기반의 도메인 주도 섀계와 μ•„ν‚€ν…μ²˜λ‘œ μž¬κ΅¬μ„±ν•˜λŠ” κΈ€μž…λ‹ˆλ‹€.

  • TODO

4. ν”„λ‘œμ νŠΈ DddGym Monolithic

"Getting Started: Domain-Driven Design" κ°•μ˜ 예제λ₯Ό ν•¨μˆ˜ν˜• 기반의 도메인 주도 섀계와 μ•„ν‚€ν…μ²˜λ‘œ μž¬κ΅¬μ„±ν•˜λŠ” κΈ€μž…λ‹ˆλ‹€.

  • Part 1. Hexagonal μ•„ν‚€ν…μ²˜ (도메인 λ ˆμ΄μ–΄: 도메인 νƒ€μž…)
    • Chapter 01. 도메인 νƒν—˜
    • Chapter 02. 도메인 ꡬ쑰화
    • Chapter 03. 도메인 ν•¨μˆ˜ν˜•ν™”
    • Chapter 04. 도메인 Entity Id μ†ŒμŠ€ 생성기
    • Chapter 05. 도메인 μ‹œλ‚˜λ¦¬μ˜€ ν…ŒμŠ€νŠΈ (BDD: Cucumber)
  • Part 2. Hexagonal μ•„ν‚€ν…μ²˜ (μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ ˆμ΄μ–΄: μœ μŠ€μΌ€μ΄μŠ€)
    • Chapter 06. μœ μŠ€μΌ€μ΄μŠ€ CQRS & Event
    • Chapter 07. μœ μŠ€μΌ€μ΄μŠ€ 미듀웨어
    • Chapter 08. μœ μŠ€μΌ€μ΄μŠ€ μ‹œλ‚˜λ¦¬μ˜€ ν…ŒμŠ€νŠΈ (BDD: Cucumber)
  • Part 3. Hexagonal μ•„ν‚€ν…μ²˜ (μ–΄λŒ‘ν„° λ ˆμ΄μ–΄)
    • Chapter 09. Web API
    • Chapter 10. IAdapter μΈν„°νŽ˜μ΄μŠ€ μ†ŒμŠ€ 생성기
    • Chapter 11. μ €μž₯μ†Œ CQRS (Command: EF Core, Query: Dapper)
    • Chapter 12. μ»¨ν…Œμ΄λ„ˆν™”
    • Chapter 13. 톡합 ν…ŒμŠ€νŠΈ
    • Chapter 14. λΆ€ν•˜ ν…ŒμŠ€νŠΈ

5. ν”„λ‘œμ νŠΈ DddGym Microservices

  • Part 1. Microservices μ•„ν‚€ν…μ²˜
    • Chapter 01. Aspire
    • Chapter 02. RabbitMQ
    • Chapter 03. Resilience
    • Chapter 04. Reverse Proxy
    • Chapter 05. Chaos Engineering
  • Part 2. 운영
    • Chapter 06. OpenFeature (Feature Flag 관리)
    • Chapter 07. OpenSearch (Observability)
    • Chapter 08. Ansible (Infrastructure as Code)
    • Chapter 09. Backstage (Building Developer Portals)

6. ν”„λ‘œμ νŠΈ

  • TODO: "eShop"을 Functional 도메인 주도 섀계와 μ•„ν‚€ν…μ²˜λ‘œ μž¬κ΅¬μ„±ν•˜λŠ” κΈ€μž…λ‹ˆλ‹€.
  • TODO: "DevBetterWeb"을 Functional 도메인 주도 섀계와 μ•„ν‚€ν…μ²˜λ‘œ μž¬κ΅¬μ„±ν•˜λŠ” κΈ€μž…λ‹ˆλ‹€.

기술 μŠ€νƒ

ν…ŒμŠ€νŠΈ μžλ™ν™”

  • xUnit: ν…ŒμŠ€νŠΈ
  • TngTech.ArchUnitNET: μ•„ν‚€ν…μ²˜ ν…ŒμŠ€νŠΈ
  • coverlet: μ½”λ“œ 컀버리지
  • Shouldly: Fluent ν…ŒμŠ€νŠΈ 검증
  • NSubstitute: μΈν„°νŽ˜μ΄μŠ€ Mocking
  • Bogus: Fake 데이터 생성기
  • Verify: μŠ€λƒ…μƒ· ν…ŒμŠ€νŠΈ
  • Testcontainers: μ»¨ν…Œμ΄λ„ˆ ν…ŒμŠ€νŠΈ
  • NBomber: λΆ€ν•˜ ν…ŒμŠ€νŠΈ

도메인 관심사

  • LanguageExt.Core: ν•¨μˆ˜ν˜•
  • Dapr: μ•‘ν„° λͺ¨λΈ
  • MediatR: 기술 관심사와 도메인 관심사 κ°„μ˜ λŠμŠ¨ν•œ κ²°ν•© (Mediator νŒ¨ν„΄)
  • FluentValidation: μœ νš¨μ„± 검사
  • Ardalis.SmartEnum: μ—΄κ±°ν˜• 도메인 νƒ€μž…
  • Ulid: Entity Id

기술 관심사

  • OpenTelemetry: κ΄€μ°° κ°€λŠ₯μ„± (Observability)
  • Aspire: λΆ„μ‚° ν΄λΌμš°λ“œ λ„€μ΄ν‹°λΈŒ
  • FastEndpoints: Web API
  • ZiggyCreatures.FusionCache: λ©”λͺ¨λ¦¬ μΊμ‹œ
  • Wolverine: RabbitMQ
  • Entity Framework Core: Command ORM
  • Dapper: Query ORM
  • Polly: Resilience
  • Docker: μ»¨ν…Œμ΄λ„ˆ
  • RabbitMQ: λ©”μ‹œμ§€ 큐
  • OpenSearch: κ΄€μ°° κ°€λŠ₯μ„± μ‹œμŠ€ν…œ