Make It Work, Make It Right, Make It Fast
λ―Έμ μ§λ μ ν, λ―Έμ μ§λ ν, λ―Έμ μ§λ μ½λ
μ μ₯μ μκ° μ€λμ€ .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) β μΈλΆ μμ€ν κ³Όμ μμ‘΄μ±μ μ€μ΄κ³ , ν΅μ¬ λλ©μΈμ 보νΈνλ ꡬ쑰.
- μ΄λμΈ μν€ν μ² β λλ©μΈ μ€μ¬μΌλ‘ λ μ΄μ΄λ₯Ό κ°μΈλ λ°©μ.
- ν΄λ¦° μν€ν μ² β ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ μ€μ¬μΌλ‘ μμ‘΄μ±μ λ°κΉ₯ λ°©ν₯μΌλ‘λ§ ν₯νκ² μ€κ³.
- μ΄λ€ ν¨ν΄μ λͺ¨λ κ΄μ¬μ¬μ λΆλ¦¬μ μμ‘΄μ± μ μ΄λΌλ μμΉμ κΈ°λ°μΌλ‘ λ°μ ν΄ μμ΅λλ€.
- 2005λ
λΆν°, μ€μ μ ν μ€κ³μ νμ©ν μ μλ λ€μν μν€ν
μ² ν¨ν΄μ΄ λ±μ₯ν©λλ€.
- μ€κ³ ν
μ€νΈ (Design Test)
- 2009λ , ν μ€νΈ νΌλΌλ―Έλ κ°λ μ΄ μκ°λλ©°, μ λ β ν΅ν© β E2E(μλν¬μλ) ν μ€νΈλ₯Ό κ³μΈ΅μ μΌλ‘ μ€κ³νλ μ λ΅μ΄ κ°μ‘°λ©λλ€.
- ν μ€νΈ λν μ€κ³μ μΌλΆλΆμΌλ‘ κ°μ£Όλλ©°, μμ μ±κ³Ό νμ§μ 보μ₯νλ μ€μν μλ¨μ΄ λ©λλ€.
- μν€ν μ²λ λλ©μΈ μ£Όλ μ€κ³μ ν¨μν νλ‘κ·Έλλ°μ κΈ°λ°μΌλ‘ λ μ΄μ΄λ₯Ό λͺ νν ꡬλΆνκ³ , κ° λ μ΄μ΄μ μν κ³Ό μμ²Β·μλ΅ λ°©μμ ν΅μΌνλ κ²μμ μμλ©λλ€.
- μ΄λ¬ν κ΄μ¬μ¬μ λΆλ¦¬(λ μ΄μ΄)λ ν μ€νΈ νΌλΌλ―Έλ ꡬ쑰λ₯Ό μ μ©ν μλν ν μ€νΈλ₯Ό κ°λ₯νκ² νκ³ , κ° λ μ΄μ΄μμ μμ±λλ λ‘κ·Έ, μ§ν, μΆμ λ°μ΄ν°λ₯Ό μΌκ΄μ± μκ² μμ§Β·κ΄λ¦¬ν μ μλ κΈ°λ°μ μ 곡ν©λλ€.
- νΉν λ‘κ·Έλ μ΄μ νκ²½μμ νμμ μΈ μꡬμ¬νμΌλ‘, μμΈ‘ κ°λ₯ν μ€ν¨(Validation Error λ±)μ μμΈ‘ λΆκ°λ₯ν μ€ν¨(Exception λ±)λ₯Ό ꡬλΆνκ³ , μ΄λ€μ λ¨μΌνλ μλ¬ νμ μΌλ‘ ν΅ν©ν΄ λ€μν νκ²½μμλ μΌκ΄λ μ€λ₯ λΆμκ³Ό μ΄μ νμ§ κ°μ μ΄ κ°λ₯νκ² ν©λλ€.
- μμ§λ λ‘κ·ΈΒ·μ§νΒ·μΆμ λ°μ΄ν°λ μ ν λ³λͺ© ꡬκ°μ νμ νκ³ , μ²λ¦¬ μλ κ°μ κ³Ό μ₯μ μμΈ λΆμμ ν΅μ¬ μλ£κ° λ©λλ€.
- μ΄λ₯Ό ν΅ν΄ ν μ€νΈ β CI/CD β κ΄μ°° κ°λ₯μ±(Observability) β μν€ν μ² νΌλλ°±μΌλ‘ μ΄μ΄μ§λ μ§μμ νμ§ κ°μ μ¬μ΄ν΄μ΄ νμ±λ©λλ€.
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
μ ν΅ν΄ λͺ μμ μΌλ‘ μ²λ¦¬ν μ μκ² ν©λλ€. - μ΄λ¬ν ꡬ쑰λ μ¬λ¬ λͺ¨λλλ₯Ό κ²°ν©νμ¬ λ³΅μ‘ν ν¨κ³Όλ₯Ό μ²λ¦¬ν λ μ μ©νλ©°, μ€λ₯ μ²λ¦¬λ₯Ό λͺ ννκ² ννν μ μκ² ν΄μ€λλ€.
TODO
- 001 | μ루μ | κ΄μ¬μ¬μ λΆλ¦¬ μμΉ (Separation of Concerns Principle)
- 002 | ν μ€νΈ | ν μ€νΈ μλν
- 003 | μ루μ | νλ‘μ νΈ κ΅¬μ±
- 004 | μ루μ | .NET SDK λ²μ (global.json)
- 005 | μ루μ | NuGet μ μ₯μ μμ€ (nuget.config)
- 006 | μ루μ | NuGet ν¨ν€μ§ λ²μ μ€μ κ΄λ¦¬ (Directory.Packages.props)
- 007 | μ루μ | νλ‘μ νΈ μμ± μ€μ κ΄λ¦¬ (Directory.Build.props)
- 008 | μ루μ | μ½λ μ€νμΌ μ€μ κ΄λ¦¬ (.editorconfig)
-
009 | μ루μ | λ²μ μ€μ κ΄λ¦¬ - 010 | ν μ€νΈ | ν μ€νΈ λ²μ£Όν
- 011 | ν μ€νΈ | ν μ€νΈ λ³΄κ³ μ (ReportGenerator, Allure)
- 012 | ν μ€νΈ | μν€ν μ² ν μ€νΈ (ArchUnitNET)
- 013 | ν μ€νΈ | λλ©μΈ κ·μΉ ν μ€νΈ (BDD: Reqnroll)
- 014 | ν μ€νΈ | μ€λ μ· ν μ€νΈ (Verify)
- 015 | ν μ€νΈ | ꡬ쑰μ λ‘κ·Έ ν μ€νΈ (Microsoft.Extensions.Logging -> Serilog)
- 016 | νλ‘μ νΈ | λ μ΄μ΄λ³ μ΄μ λΈλ¦¬ μ μ (AssemblyReference.cs)
- 017 | νλ‘μ νΈ | λ μ΄μ΄λ³ μμ‘΄μ± λ±λ‘
- 018 | νλ‘μ νΈ | ν΄λμ€ κΈ°λ³Έ μ κ·Ό μ μ΄μ (internal sealed)
- 019 | νλ‘μ νΈ | μλ¬ μ²λ¦¬
- 020 | νλ‘μ νΈ | μμ€ μμ±κΈ° (IIncrementalGenerator)
-
021 | λ μ΄μ΄ | λλ©μΈ λ μ΄μ΄ | κ° κ°μ²΄ -
022 | λ μ΄μ΄ | λλ©μΈ λ μ΄μ΄ | μν°ν° - 023 | λ μ΄μ΄ | μ ν리μΌμ΄μ λ μ΄μ΄ | νμ΄νλΌμΈ
- 024 | λ μ΄μ΄ | μ ν리μΌμ΄μ λ μ΄μ΄ | CQRS λ©μμ§
-
025 | λ μ΄μ΄ | μ ν리μΌμ΄μ λ μ΄μ΄ | μ μ€μΌμ΄μ€ - 026 | λ μ΄μ΄ | μ΄λν° λ μ΄μ΄ | μ΅μ μ ν¨μ± κ²μ¬ (appsettings.json)
λ¨μν Divide
ꡬνμ μΆλ°μ μΌλ‘ μΌμ, λΆμμ© μμ΄ μμΈ‘ κ°λ₯ν μμ ν¨μ(Pure Function)λ‘ κ°μ νκ³ , μ΄λ₯Ό ν΅ν΄ μ ν¨ν κ°λ§ ννν μ μλ λλ©μΈ νμ
(Value Object)μ μ μ§μ μΌλ‘ μ€κ³ν΄ λκ°λ κ³Όμ μ ν΅ν΄ λλ©μΈ μ£Όλ μ€κ³μ ν¨μν νλ‘κ·Έλλ°μ ν΅μ¬ κ°μΉλ₯Ό ν¨κ» μ΅νλλ€.
// κ°μ μ
int Divide(int x, int y)
{
return x / y;
}
// κ°μ ν
int Divide(int x, NonZeroInt y)
{
return x / y;
}
μ΄ κ³Όμ μ μλ―Έ μλ νμ μ€κ³, μ λ ₯ μ ν¨μ± 보μ₯, μ€λ₯ μ²λ¦¬μ λͺ νν, λλ©μΈ μΈμ΄ κ°ν λ±μ μμ°λ₯΄λ©°, μ μ§λ³΄μμ±κ³Ό μμ μ±μ΄ λμ μ½λλ₯Ό ꡬμ±νλ κΈ°λ°μ λ§λ ¨ν©λλ€.
- 1. μμμ λ¨μν λλμ μμ
- 2. μμΈλ₯Ό μλ°©νλ €λ μ°λ¦¬μ 첫 μλ
- 3. μ€ν¨λ κ°μ΄λ€
- 4. κ·Έ κ°μ΄ λ¬Έμ λΌλ©΄, μ μ΄μ λ€μ΄μ€μ§ λͺ»νκ² νμ (Always Valid)
- 5. μ½λμ ννλ ₯μ λ νλΆνκ² (μ°μ°μ μ€λ²λ‘λ©)
- 6. κ°μ΄ κ°λ€λ©΄ κ°μ²΄λ κ°μμΌ νλ€ (κ°μ λλ±μ±)
- 7. κ°μ²΄μ μ± μμ λΆλ¦¬νμ (λ¨μΌ μ± μ μμΉ: SRP)
- 8. μ€κ³ κ·μΉμ μλμΌλ‘ κ²μ¦νκΈ°
- 9. νμ μΌλ‘ λ§νλ λλ©μΈ
Scott Wlaschin "Designing with types" F# μ½λλ₯Ό C# κΈ°λ°μΌλ‘ μ¬κ΅¬μ±νλ κΈμ λλ€.
- TODO
Amichai Mantinband "Clean Architecture" ν νλ¦Ώμ ν¨μν κΈ°λ°μ λλ©μΈ μ£Όλ μ€κ³μ μν€ν μ²λ‘ μ¬κ΅¬μ±νλ κΈμ λλ€.
- TODO
"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. λΆν ν μ€νΈ
- 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)
- TODO: "eShop"μ Functional λλ©μΈ μ£Όλ μ€κ³μ μν€ν μ²λ‘ μ¬κ΅¬μ±νλ κΈμ λλ€.
- TODO: "DevBetterWeb"μ Functional λλ©μΈ μ£Όλ μ€κ³μ μν€ν μ²λ‘ μ¬κ΅¬μ±νλ κΈμ λλ€.
xUnit
: ν μ€νΈTngTech.ArchUnitNET
: μν€ν μ² ν μ€νΈcoverlet
: μ½λ 컀λ²λ¦¬μ§Shouldly
: Fluent ν μ€νΈ κ²μ¦NSubstitute
: μΈν°νμ΄μ€ MockingBogus
: Fake λ°μ΄ν° μμ±κΈ°Verify
: μ€λ μ· ν μ€νΈTestcontainers
: 컨ν μ΄λ ν μ€νΈNBomber
: λΆν ν μ€νΈ
LanguageExt.Core
: ν¨μνDapr
: μ‘ν° λͺ¨λΈMediatR
: κΈ°μ κ΄μ¬μ¬μ λλ©μΈ κ΄μ¬μ¬ κ°μ λμ¨ν κ²°ν© (Mediator ν¨ν΄)FluentValidation
: μ ν¨μ± κ²μ¬Ardalis.SmartEnum
: μ΄κ±°ν λλ©μΈ νμUlid
: Entity Id
OpenTelemetry
: κ΄μ°° κ°λ₯μ± (Observability)Aspire
: λΆμ° ν΄λΌμ°λ λ€μ΄ν°λΈFastEndpoints
: Web APIZiggyCreatures.FusionCache
: λ©λͺ¨λ¦¬ μΊμWolverine
: RabbitMQEntity Framework Core
: Command ORMDapper
: Query ORMPolly
: ResilienceDocker
: 컨ν μ΄λRabbitMQ
: λ©μμ§ νOpenSearch
: κ΄μ°° κ°λ₯μ± μμ€ν