π Good Abstraction, Bad Abstraction (opens in a new tab)
ποΈ λ²μ λ μ§: 2024.08.12
π§ λ²μν ν¬λ£¨: μν(μ΅μμ°)
μλ νμΈμ,
λ²μ¨ 8μμ΄ λ€ λμ΄κ°λ€λ κ² λ―Ώκ²¨μ§μλμ? λ§μ΅λλ€. 1λ μ€ 8λ²μ§Έ λ¬μ΄μ£ . μκ°μ΄ μ΄λ κ² λΉ¨λ¦¬ νλ¬κ°λ€λμ?
μ΄λ² μ£Ό μ΄μμμλ μΆμν, λμμΈ ν¨ν΄, κ·Έλ¦¬κ³ WET μ½λλ² μ΄μ€(λ§μ΅λλ€, wetμ λλ€.)μ λν΄ μ΄μΌκΈ°ν΄ λ³΄κ² μ΅λλ€. λ°λ‘ μμν΄ λ³΄μμ£ .
SOFTWARE DESIGN
μ’μ μΆμν, λμ μΆμν
μ΄μ°½κΈ° κ²½λ ₯ μμ , μ λ μΆμνλ κ·Έμ DRY(λ°λ³΅νμ§ μκΈ°)λ₯Ό μ μ§νλ κ²μ΄λΌκ³ μκ°νμ΅λλ€. λΉμ·ν΄ 보μ΄λ λ κ°μ μ½λ λΈλ‘μ λ³Ό λλ§λ€, λͺ¨λ μ¬μ© μ¬λ‘λ₯Ό μ²λ¦¬ν μ μλ λ¨μΌ ν¨μλ₯Ό λ§λ€μ΄ μ€λ³΅μ μ κ±°νλ €κ³ μ΅μ μ λ€νμ΅λλ€.
νμ§λ§ μ΄ μ κ·Ό λ°©μμλ λ¬Έμ κ° μμ΅λλ€. μ νμ₯λμ§ μλλ€λ κ²μ λλ€.
μꡬμ¬νμ΄ λ³νκ³ μ½λλ² μ΄μ€κ° μ§νν¨μ λ°λΌ, μ΄ λͺ¨λΈμ μ μ°¨ 무λμ§κΈ° μμν©λλ€. λ§μ½ μ°λ¦¬κ° μμ ν λ€λ₯Έ μ¬μ© μ¬λ‘μ λ§μΆκΈ° μν΄ ν¨μλ₯Ό λ³κ²½νκΈ° μμνλ©΄, μ½λ μ¬μ¬μ©μ μν μ°λ¦¬μ μ μμ μλλ λΉ λ₯΄κ² μλͺ»λ μΆμνλ‘ λ³νκ² λ©λλ€.
κ·Έλ λ€λ©΄ μ’μ μΆμνλ₯Ό λ§λλ λΉλ°μ 무μμΌκΉμ? κ°λ¨ν λ§ν΄, μ¬μ¬μ©μ±μ λν κ΄μ¬μ μ€μ΄κ³ μΆμνκ° μ§μ μΌλ‘ νλ μΌ, μ¦ λ³΅μ‘μ±μ κ΄λ¦¬νκ³ μΊ‘μννλ λ° λ μ§μ€νλ κ²μ λλ€. κ·Έλ¦¬κ³ μ΄λ₯Ό μν νλ₯ν λ°©λ²μ μ’μ μΆμνκ° κ°μΆ°μΌ ν μΈ κ°μ§ κΈ°λ³Έμ μΈ νΉμ±μ μ΄ν΄λ³΄λ κ²μ λλ€.
- μ’μ μΆμνλ κΉμ λͺ¨λ(Deep Modules)λ‘ κ΅¬μ±λ©λλ€.
- μ’μ μΆμνλ μ€μνμ§ μμ μΈλΆ μ¬νμ μ¨κΉλλ€.
- μ’μ μΆμνλ λ¨μΌ μμ€(Single Level)μμ μλν©λλ€.
μ΄μ μ΄μ λν΄ μ΄μΌκΈ°ν΄ λ³΄κ² μ΅λλ€.
μ’μ μΆμνλ κΉμ λͺ¨λλ‘ κ΅¬μ±λλ€.
κΉμ λͺ¨λμ κ°λ¨ν μΈν°νμ΄μ€λ₯Ό ν΅ν΄ κ°λ ₯ν κΈ°λ₯μ μ 곡νλ λͺ¨λμ λλ€. μΈν°νμ΄μ€λ₯Ό μΆμνμ λΉμ©, κΈ°λ₯μ κ·Έ μ΄μ μ΄λΌκ³ μκ°ν μ μμ΅λλ€. κΉμ λͺ¨λμ λ μ μ λΉμ©μΌλ‘ λ λ§μ κΈ°λ₯μ μ 곡νκΈ° λλ¬Έμ λ λμ μΆμνλ₯Ό λ§λλλ€.
λ°λ©΄μ, μμ λͺ¨λμ κΈ°λ₯μ λΉν΄ μλμ μΌλ‘ 볡μ‘ν μΈν°νμ΄μ€λ₯Ό κ°μ§ λͺ¨λμ λλ€. ν¨μκ° λ무 μ κ² μννλ κ²½μ°(μ: "pass-through" λ©μλ) μ΄λ μμ μΆμνλ₯Ό λ€λ£¨κ³ μλ€λ κ²μ μλ―Έν μ μμ΅λλ€.
κΉμ λͺ¨λμ μ νΈνλ€κ³ ν΄μ ν° ν¨μλ₯Ό λͺ©νλ‘ ν΄μΌ νλ€λ κ²μ μλλλ€. ν¨μκ° λͺ μ€μ μ½λλ§ κ°μ§κ³ μμ§λ§ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λ ΈμΆνλ κ²λ³΄λ€ λ λ§μ 볡μ‘μ±μ μΊ‘μννλ€λ©΄ μ¬μ ν κΉμ κ²μΌλ‘ κ°μ£Όν©λλ€.
μ΄μ νΈμμ μ΄μΌκΈ°νλ **'μννΈμ¨μ΄ λμμΈμ μ² ν'**μ΄λΌλ μ± μμ κΉμ λͺ¨λ κ°λ μ κΈ°μ΅νμ€ μλ μμ΅λλ€. λμ³€λ€λ©΄ μ¬κΈ° (opens in a new tab)μ μ½μ΄λ³΄μ€ μ μμ΅λλ€.
μ’μ μΆμνλ μ€μνμ§ μμ μΈλΆ μ¬νμ μ¨κΈ΄λ€.
μΆμνλ μ€μνμ§ μμ ꡬν μΈλΆ μ¬νμ μ¨κ²¨μΌ νμ§λ§ μ€μν μΈλΆ μ¬νμ λλ¬λ΄μΌ ν©λλ€.
λ€μμ μμμ λλ€:
μ΄ ν¨μλ axios config κ°μ²΄λ₯Ό 맀κ°λ³μλ‘ λ°λλ€λ κ²μ μ μ μμ΅λλ€. μ΄κ² μ체λ‘λ λ¬Έμ κ° μμ§λ§, μ΄ νΉμ ν κ²½μ°μλ ν¨μκ° λ€νΈμν¬ μμ²μ νκΈ° μν΄ axiosλ₯Ό μ¬μ©νλ€λ μ¬μ€μ μΆμν μ¬μ©μκ° μ κ²½ μΈ νμκ° μλ ꡬν μΈλΆ μ¬νμ λλ€.
λ ν κ°μ§ λμΉμ±μ ¨μ μλ μλ κ²μ μ¬μ©μκ° λ‘κ·ΈμΈλμ΄ μμ λλ λΉλκΈ°μ μΌλ‘ λμνμ§λ§ λ‘κ·ΈμΈλμ΄ μμ§ μμ λλ λκΈ°μ μΌλ‘ λμνλ€λ μ μ λλ€. μ΄κ²λ ꡬν μΈλΆ μ¬νμ΄μ§λ§ μΆμν μ¬μ©μμκ² λ λͺ νν΄μΌ νλ μ€μν μΈλΆ μ¬νμ λλ€.
μ κ·Έ μΈλΆ μ¬νμ΄ μ€μν κΉμ? μ₯λ°κ΅¬λμ νλͺ©μ μΆκ°ν ν λ°λ‘ μ₯λ°κ΅¬λμ μ΄ κΈμ‘μ κ³μ°νλ€κ³ κ°μ ν΄ λ³΄μΈμ. λκΈ° λλ λΉλκΈ° λμμ΄ νΈμΆλμλμ§μ λ°λΌ μμ ν λ€λ₯Έ κ²°κ³Όλ₯Ό μ»κ² λ©λλ€.
κ·Έ ν¨μμ λμ λ²μ μ λ€μκ³Ό κ°μ΄ λ³΄μΌ μ μμ΅λλ€:
μ¬κΈ°μλ λ¨μνλ₯Ό μν΄ λμΌν ν¨μ λ΄μμ axios κ΅¬μ± κ°μ²΄λ₯Ό ꡬμ±νκ³ μμ΅λλ€. μ€μ μ¬μ© μ¬λ‘μμλ μ΄λ₯Ό λ³λλ‘ μ²λ¦¬νκ³ μΆκ² μ§λ§, μμ μ κ·Έκ² μλλλ€.
μ£Όλͺ©ν΄μΌ ν μ€μν μ μ μ¬μ© κ°λ₯ν μ νν κ΅¬μ± μ΅μ μ μ§μ νμ¬ μΆμνμ λμλ₯Ό μμ νλ€λ κ²μ λλ€. μ΄μ μ΄ ν¨μμ ꡬνμ axios λμ fetchλ₯Ό μ¬μ©νλλ‘ λ³κ²½ν΄λ μΈν°νμ΄μ€λ μ ν λ³κ²½λμ§ μμ΅λλ€. λν μ΄μ ν¨μλ νμ λΉλκΈ°μ μΌλ‘ μλνλ―λ‘ μ¬μ©μμκ² λ μΌκ΄λκ³ λͺ νν λμμ μ 곡ν©λλ€.
μ’μ μΆμνλ λ¨μΌ μμ€μμ μλνλ€.
μΆμν μμ€μ νΌν©νλ©΄ λͺ¨λμ΄ λ μμΈ‘νκΈ° μ΄λ ΅κ³ λ€λ£¨κΈ° μ΄λ €μμ§λλ€.
λ°μ΄ν°λ² μ΄μ€λ₯Ό μ λ°μ΄νΈνλ ν¨μλ DOMλ μ λ°μ΄νΈν΄μλ μ λ©λλ€. μ΄λ€μ κ°κ° λΆλ¦¬λμ΄μΌ νλ λ κ°μ§ λ€λ₯Έ μ± μμ λλ€. μ νν νλ μμν¬μμ μ΄ λ κ°μ§ λμμ λμΌν λͺ¨λμ 곡쑴ν μ μλλ‘ νμ©νλλΌλ, λ‘μ§μ λ μκ³ μ§μ€λ ν¨μλ‘ λΆλ¦¬νμ¬ κ° μΆμνμ κ΄μ¬μ¬λ₯Ό λΆλ¦¬νλ κ²μ΄ νμ μ’μ μμ΄λμ΄μ λλ€.
λ¨μΌ μ± μ μμΉλ μΈκΈν κ°μΉκ° μμ΅λλ€. λμΌν μΆμν μμ€μμ μλνλλ‘ λ³΄μ₯νλ μ’μ λ°©λ²μ κ° λͺ¨λμ λ³κ²½ν΄μΌ ν μ΄μ λ₯Ό νλ (opens in a new tab)λ§ μ 곡νλ κ²μ λλ€.
μ΄κ²μ΄ λͺ¨λ ν¨μκ° "μ’μ μΆμν 체ν¬λ¦¬μ€νΈ"μ λͺ¨λ νλͺ©μ 체ν¬ν΄μΌ νλ€λ κ²μ μλ―Έν κΉμ? λ°λμ κ·Έλ μ§λ μμ΅λλ€.
μ΄κ²λ€μ κ·μΉμ΄ μλ μ§μΉ¨μΌλ‘ μ·¨κΈλμ΄μΌ ν©λλ€. κ·Έλ¦¬κ³ μ λ°λμ μ¬λ¬λΆμ΄ μ΄ μ§μΉ¨μ μ¬μ©νμ¬ μΆμνλ₯Ό μλ²½μ΄ μλ λ μ’κ² λ§λλ κ²μ λλ€.
κ²°κ΅ μ°λ¦¬λ μλ²½ν μΆμνλ₯Ό λ§λλ κ²μ΄ μλλΌ λ¬Έμ λ₯Ό ν΄κ²°νλ κ²μ΄ λͺ©μ μ λλ€. κ·Έλ¦¬κ³ κΈ°μ‘΄μ μΆμνκ° κ΄λ¦¬ κ°λ₯ν μμ€μ 볡μ‘μ±μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€λ©΄ μ΄λ―Έ μ€μν μΌμ μ λλ‘ νκ³ μλ κ²μ λλ€.
μμ² λ¦¬μ€νΈ
WET μ½λλ² μ΄μ€
μΆμνμ λν μμΈμ΄λ₯Ό λ§ λ§μΉ κ²μ μκ³ μμΌλ©° μ£Όμ λ₯Ό λ°κΎΈκ³ μΆμ μλ μμ΅λλ€. νμ§λ§ μ‘°κΈλ§ λ κΈ°λ€λ €μ£ΌμΈμ. μ΄λ² μ£Όμ λ κ·Έλ§ν κ°μΉκ° μλ€κ³ μ½μλ립λλ€.
λ μλΈλμ€ν (opens in a new tab)λ 2019λ λμ½μ€νΈ(μμ λ μ μ²λΌ λκ»΄μ§μ§λ§)μμ μ΄ κ°μ°μ νμ§λ§ κ·Έκ° κ³΅μ νλ μμ΄λμ΄λ μ§μ μΌλ‘ μλλ₯Ό μ΄μν©λλ€.
λμ μ°λ¦¬κ° λ§λλ μΆμνκ° μ¬μ ν μλ―Έκ° μλμ§ κ³ λ €νμ§ μκ³ λ무 DRYμλ§ μ§μ€νλ μνμ λν΄ μ΄μΌκΈ°νκ³ , μΆμνλ₯Ό λ€λ£° λ μΌλμ λμ΄μΌ ν λͺ κ°μ§ ν΅μ¬ μμλ₯Ό 곡μ ν©λλ€:
- μΆμνμ μ΄μ : μλμ μ§μ€, μ½λ μ¬μ¬μ©, λ²κ·Έ νΌνκΈ°
- μΆμνμ λΉμ©: μ°μ°ν κ²°ν©, μΆκ° κ°μ μ±, κ΄μ±(νμ μν)
- μ± μκ° μκ² μΆμννλ ν: ꡬ체μ μΈ μ½λ ν μ€νΈ, κ³μΈ΅ μΆκ° μ§μ°, νμν κ²½μ° νμ μΆμν μΈλΌμΈ μ€λΉ
λμ μ΄ μ£Όμ μ λν΄ λ κΉμ΄ νκ³ λ€λ €λ©΄ λ€μμ 무μμ λ΄μΌ νλμ§μ λν μΆμ²μΌλ‘ κ°μ°μ λ§λ¬΄λ¦¬ν©λλ€. μ΄ λͺ¨λ κ°μ°μ μ΄λ ¬ν ν¬μΌλ‘μ λμ μΆμ²μ +1μ λ리며 μ¬λ¬λΆλ μμ² λͺ©λ‘μ μΆκ°νμκΈΈ κΆμ₯ν©λλ€:
- μλ λ©μΈ (opens in a new tab)μ 'λͺ¨λ μμ κ²λ€' (opens in a new tab)
- μΈλ°μ€ν°μ λ§ν¬λ°κ² (opens in a new tab)μ 'μ΅μ API νλ©΄ μμ' (opens in a new tab)
- μ² λ£¨ (opens in a new tab)μ 'μΆμν μ€ννΈλΌ' (opens in a new tab)
μν€ν μ² μ€λ΅
νμΈν΄ λ³Ό λ§ν λ§ν¬
βReact 18μ΄ μ ν리μΌμ΄μ μ±λ₯μ ν₯μνλ λ°©λ² (opens in a new tab)β
β리λμ ν 리β (opens in a new tab)
리λμ ν 리μ μ΄ μλ¦λ΅κ² μ€λͺ λ κΈ°μ¬μμλ Transitions, Suspense, React μλ² μ»΄ν¬λνΈμ κ°μ λμμ± κΈ°λ₯μ΄ μ ν리μΌμ΄μ μ±λ₯μ ν₯μνλ λ°©λ²μ λ°°μλλ€.
βλκ·λͺ¨ μννΈμ¨μ΄ κ°λ°μ μ΄λ€ λͺ¨μ΅μΌκΉμ?β (opens in a new tab)
βμΉ κ°λ° μ½λ (opens in a new tab)β
νΌμ λλ μκ·λͺ¨ νμΌλ‘ μμ νλ λ° μ΅μν κ²½μ° λκ·λͺ¨ κΈ°μ μ μ νμ μΈ μννΈμ¨μ΄ κ°λ° λΌμ΄νμ¬μ΄ν΄(SDLC)μ λν μ΄ κ°μλ λ§€μ° μ μ΅ν©λλ€.
βκ°λ₯ν ν μ§λ£¨ν μν€ν μ²λ₯Ό κ³ μνμΈμβ (opens in a new tab)
βμ λ μ€μ¬λβ (opens in a new tab)
μ΅μ λΌμ΄λΈλ¬λ¦¬μ νλ μμν¬λ‘ μ±μ ꡬμΆνλ κ²μ νμ 맀λ ₯μ μ΄μ§λ§ μ¬μ©μμκ² κ°μΉλ₯Ό μ 곡νλ λ° κ΄μ¬μ΄ μλ€λ©΄ κ²μ¦λκ³ ν μ€νΈλ(μ¦, μ§λ£¨ν) κΈ°μ μ κ³ μνλ κ²μ΄ μ±κ³΅μ κ°μ₯ μ’μ κΈ°νλ₯Ό μ 곡ν©λλ€.
βReactμμ λΌμ°ν κ³μΈ΅μ ꡬμΆνκ³ νμν μ΄μ β (opens in a new tab)
βμν λ¬λ‘ μλλ (opens in a new tab), λ μ 컀μ¨β (opens in a new tab)
React μ±μ ν΄λΌμ΄μΈνΈ μΈ‘ λΌμ°ν λ‘μ§μ΄ κ°λΉν μ μκ² λ κ²½μ° μ΄ κΈ°μ¬λ λΌμ°ν κ³μΈ΅μ μ¬μ©νμ¬ λ³΅μ‘μ±μ κ΄λ¦¬νλ λͺ κ°μ§ μμ΄λμ΄λ₯Ό μ 곡ν μ μμ΅λλ€.
βNuxt μλ² κ΅¬μ± μμ κ°μ΄λβ (opens in a new tab)
βλ€λμ λ‘μ°β (opens in a new tab)
Nuxtλ λ€λ₯Έ νλ μμν¬μλ λ€λ₯Έ μλ² μ»΄ν¬λνΈ λ° μ¬ μν€ν μ² μ κ·Ό λ°©μμ μ·¨ν©λλ€. Vue λ©ννλ μμν¬μμ μ΄λ¬ν κΈ°λ₯μ΄ μ΄λ»κ² μλνλμ§ μ λͺ¨λ₯΄λ κ²½μ° μ΄ κΈ°μ¬λ νλ₯ν κ°μμ λλ€.
μμ¬
μλ°μ€ν¬λ¦½νΈ λμμΈ ν¨ν΄ νμ΅
ν΄κ²°νλ €λ λ¬Έμ μ μ ν©ν μΆμνλ₯Ό μ°Ύλ κ²μ μ’ μ’ μ¬λ°λ₯Έ λμμΈ ν¨ν΄μ μ ννλ κ²κ³Ό κ°μ΅λλ€. νμ§λ§ μ νν μ μλ ν¨ν΄μ΄ λ무 λ§κ³ νλ‘κ·Έλλ° μΈμ΄μ λ°λΌ ꡬν λ°©μμ΄ ν¬κ² λ€λ₯΄κΈ° λλ¬Έμ λ§μ²λΌ μ½μ§ μμ΅λλ€.
κ·Έλμ μ λ μ€μ¬λ (opens in a new tab)μ κ³ μ μ μΈ μ± μΈ 'μλ°μ€ν¬λ¦½νΈ λμμΈ ν¨ν΄ νμ΅' (opens in a new tab)μ κ°μ νμ΄ λμ¨λ€λ μμμ λ£κ³ λ§€μ° κΈ°λ»€μ΅λλ€. μ΄ κ°μ νμ μΈμ΄μ μ΅μ κΈ°λ₯μ μ¬μ©νλλ‘ μ λ°μ΄νΈλμμΌλ©° μ§λ 10λ λμ λ±μ₯ν μλ‘μ΄ ν¨ν΄λ μΌλΆ ν¬ν¨λμ΄ μμ΅λλ€.
260νμ΄μ§ μ λμ λΆλμΌλ‘ λ€μμ μ΄ν΄λ΄ λλ€:
- κ³ μ : Gang of Four μ± μμ μΉμν μ μλ μμ± ν¨ν΄, ꡬ쑰 ν¨ν΄, νλ ν¨ν΄
- μλ‘μ΄ μ λ°μ΄νΈ: λΉλκΈ° μλ°μ€ν¬λ¦½νΈλ₯Ό λ€λ£¨λ ν¨ν΄, MV* λ° λͺ¨λ ν¨ν΄μ λν μ λ°μ΄νΈλ μΉμ
- λ λλ§ λ° React μ μ©: React μ½λλ² μ΄μ€λ₯Ό ꡬμ±νκ³ Islands μν€ν μ² λ° Next.jsμ ν¨κ»νλ React μλ² κ΅¬μ± μμμ κ°μ λͺ¨λ λ λλ§ ν¨ν΄μ ν¬ν¨ν ν¨ν΄
μ€λμ μ¬κΈ°κΉμ§μ λλ€, μ¬λ¬λΆ! λκΉμ§ ν¨κ» ν΄μ£Όμ μ κ°μ¬ν©λλ€. λ΄μ€λ ν°κ° λ§μμ λμ ¨λ€λ©΄ μΉκ΅¬λ λλ£λ€κ³Ό 곡μ ν΄ μ£Όμλ©΄ ν° νμ΄ λ κ²μ λλ€. (λ§μμ λ€μ§ μμλ€λ©΄ μ μκ² κ³΅μ νλ 건 μ΄λ μ κ°μ?)
μ μκ² νΌλλ°±μ΄ μμΌμ κ°μ? νΈμν°λ μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νμ¬ μμ λ‘κ² μ°λ½ν΄ μ£ΌμΈμ. λͺ¨λ λκΈμ μ½κ³ κ°μ¬λ립λλ€.
λκ° μ΄ μ΄λ©μΌμ μ λ¬ν΄ μ£Όμλμ? λ¨Όμ κ·Έλ€μ΄ μΌλ§λ λλ¨νμ§ λ§ν΄μ£Όκ³ , λ€μ νΈλ₯Ό λ°λ‘ λ°μ보μλ €λ©΄ λ΄μ€λ ν° κ΅¬λ μ κ³ λ €ν΄ λ³΄μΈμ.
μ’μ ν μ£Ό 보λ΄μΈμ π
- λ§₯μ€