FSD ν¨ν΄
κΈ°λ₯ λΆν μ€κ³(Feature-sliced Design, FSD)λ λͺ¨λ κ°μ λμ¨ν κ²°ν©κ³Ό λμ μμ§λ ₯μ μ 곡ν μ μμΌλ©°, μ½κ² νμ₯ν μ μλ μν€ν
μ²μ΄λ€.
μ΄λ¬ν ν¨ν΄μ μΈ κ°μ§ κ΅¬λΆ κ°λ
μ΄ μλ€.
μ΄λ¬ν μΈ κ°μ§ κ΅¬λΆ κ°λ
μ΄ κ³§ depthλ₯Ό μλ―ΈνκΈ° λλ¬Έμ μ΄λ κ³§ λλ ν 리μ depthλ 3μΌλ‘ μ νλ¨μ μλ―Ένλ€.
κ·Έλ λ€λ©΄ μ΄ κ°μ₯ μμμ λλ ν 리λ€μ μ€μ¬μΌλ‘ μ΄λ»κ² μ ν리μΌμ΄μ
μ΄ κ΅¬μ±λ κΉ?
μ΄μ μ κ°μ₯ μ΅μμμ layerλΆν° μμ보μ
Layer
- app
- μ ν리μΌμ΄μ λ‘μ§μ΄ μ΄κΈ°νλλ κ³³
- νλ‘λ°μ΄λ, λΌμ°ν°, μ μ μ€νμΌ, μ μ νμ μ μΈ λ±
- μ ν리μΌμ΄μ μ μ§μ μ μν
- processes(depricated)
- μ΄ λ μ΄μ΄λ μ¬λ¬ λ¨κ³λ‘ μ΄λ£¨μ΄μ§ λ±λ‘κ³Ό κ°μ΄ μ¬λ¬ νμ΄μ§μ κ±Έμ³ μλ νλ‘μΈμ€λ₯Ό μ²λ¦¬
- μ΄ λ μ΄μ΄λ λ μ΄μ μ¬μ©λμ§ μλ κ²μΌλ‘ κ°μ£Όλμ§λ§ μ¬μ ν κ°λμ© λ§μ£Όν μ μμ΅λλ€. μ νμ λ μ΄μ΄μ λλ€.
- pages
- μ ν리μΌμ΄μ κ°κ°μ νμ΄μ§
- widgets
- νμ΄μ§μ μ¬μ©λλ λ 립μ μΈ UI μ»΄ν¬λνΈ
- entitiesκ° λͺ¨μΈ κ²λ€
- features
- μ΄ λ μ΄μ΄λ λΉμ¦λμ€ κ°μΉλ₯Ό μ λ¬νλ μ¬μ©μ μλ리μ€μ κΈ°λ₯
- κ° μ΄λ²€νΈλ€μ λ΄λΉνλ λ‘μ§
- μ νμ λ μ΄μ΄
- entities
- λΉμ¦λμ€ μν°ν°
- μ¬μ©μ, 리뷰, λκΈ λ±κ³Ό κ°μ΄ λΆλ¦¬ν μ μλ μ»΄ν¬λνΈ
- ν΅μ¬ λλ©μΈ λͺ¨λΈκ³Ό λΉμ¦λμ€ λ‘μ§μ λ΄κ³ μμ
- shared
- μ΄ λ μ΄μ΄μλ νΉμ λΉμ¦λμ€ λ‘μ§μ μ’ μλμ§ μμ μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈμ μ νΈλ¦¬ν°
- μ¬κΈ°μλ UI ν€νΈ, axios μ€μ , μ ν리μΌμ΄μ μ€μ , λΉμ¦λμ€ λ‘μ§μ λ¬Άμ΄μ§ μμ ν¬νΌ λ±
κ°κ° 7κ°μ λλ ν 리λ€μ κΈ°λ₯μ μΌλ‘ μΈλΆνλμ΄ κ°μμ μν μ λ΄λΉνκ³ , μ΄λ¬ν μμλ€μ΄ κ³μΈ΅μ μΈ κ΅¬μ‘°λ₯Ό κ°μ§κΈ° λλ¬Έμ ν λ°©ν₯μΌλ‘λ§ νλ₯΄λ linear flowλ₯Ό μ μ§νλ€. μ¦, μμ μ¬μ§μμ νλμ layerλ μκΈ° μμ μ κ°λ¦¬ν€λ layer μλμ layerλ€λ§ μ°Έμ‘° κ°λ₯νλ€.
μ΄λ¬ν μ¬λ¬ layerλ€μ΄ κ³μΈ΅ ꡬ쑰λ₯Ό μ μ§νλ©΄μ μλ‘ μ½ν μμ‘΄ κ΄κ³λ₯Ό κ°μ§ μνλ‘νλλ‘ μ μ ν©μ³μ Έ νλμ appμ΄ μμ±λλ ꡬ쑰μΈλ°, μ΄ μ μ΄ FSDμ ν΅μ¬μ΄μ κ°μ₯ μ€μν λ²μΉμ΄λ€
μΆμννλ€λ©΄ μμ μ¬μ§κ³Ό κ°μ΄
shared(μ¬μ¬μ©ν μ»΄ν¬λνΈλ€)
β entities(λ
립λ μ»΄ν¬λνΈλ€)
β features(κ° μ»΄ν¬λνΈμ κΈ°λ₯μ λͺ
μν script)
β widgets(μ»΄ν¬λνΈλ€μ΄ λͺ¨μ¬ λ§λ νλμ ν° μ»΄ν¬λνΈ λ¨μ)
β pages(ν° μ»΄ν¬λνΈλ€μ΄ λͺ¨μ¬ λ§λ νλμ νμ΄μ§)
β app(entry point)
μ μμλ‘ νλμ ν° μ ν리μΌμ΄μ
μ μν΄ κ³μΈ΅μ μΌλ‘ μ¬λΌκ°λ©΄μ κ²°κ΅ λ§μ§λ§μ μ΄ λͺ¨λ κ²μ΄ ν©μ³μ§ νλμ μ ν리μΌμ΄μ
μ΄ μμ±λλ ꡬ쑰μ΄λ€.
Slices
κ°μ λ μ΄μ΄λ€ μμλ μλΈ λλ ν λ¦¬κ° μ‘΄μ¬νλλ°, μ΄λ₯Ό sliceλΌκ³ νλ€.
sliceλ μ£Όλ‘ λλ©μΈ λ³λ‘ λλλ€.
μ¬λΌμ΄μ€λ νΉμ μν°ν°μ λν΄μ μ½λλ₯Ό κ·Έλ£Ήν νλλ°, μΆμμ μΈ κ²μ λν μ°κ²°μ΄ μλ λͺ
νν λΉμ¦λμ€ κ°μ²΄μ λν μ°κ²°μ΄ μ‘΄μ¬νκ³ μ΄λ₯Ό μ½λμ κ°μΉμ λ°λΌ κ·Έλ£Ήννλ€.
μ΄μ κ°μ΄ νμν κ°μ λν΄μ λ
립μ μΌλ‘ λ€λ£° μ μλ λλ ν 리λ₯Ό μμ±νλ€.
Segment
κ° μ¬λΌμ΄μ€λ μΈκ·Έλ¨ΌνΈλ‘ ꡬμ±λλ©° λͺ©μ μ λ°λΌ μ¬λΌμ΄μ€ λ΄μ μ½λλ₯Ό λλλλ° λμμ΄ λ μ μλ€.
- api - νμν μλ² μμ² λ° λ°μ΄ν° νμ , mapper λ±
- UI - μ¬λΌμ΄μ€μ UI μ»΄ν¬λνΈ.
- model - λΉμ¦λμ€ λ‘μ§, μ¦ μνμμ μνΈ μμ©. actions λ° selectorsκ° μ΄μ ν΄λΉ
- lib - μ¬λΌμ΄μ€ λ΄μμ μ¬μ©λλ 보쑰 κΈ°λ₯(μ νΈν¨μλ€)
- config - μ¬λΌμ΄μ€μ νμν ꡬμ±κ°μ΄μ§λ§ κ΅¬μ± μΈκ·Έλ¨ΌνΈλ κ±°μ νμνμ§ μμ.
- consants - νμν μμ.
μ΄μ κ°μ΄ κ³μΈ΅μ μΈ λλ ν 리 ꡬ쑰μμ privateν μ»΄ν¬λνΈλ€μ μ μ§νκΈ° μν΄ μ€μν μ μ΄ μλλ°, index.jsμ νμ©μ΄λ€. κ° layerλ°λ‘ μλμ λλ ν 리λ€μλ index.jsλ₯Ό λκ³ , μ΄λ₯Ό νμ ν΄λλ€μ κ²λ€μμ μ λΆ importν΄μ€κ³ , μμ κ³μΈ΅μμ μ΄ index.jsλ₯Ό Import ν΄μμ μ¬μ©νλ λ°©μμ΄λ€. μ΄λ°μμΌλ‘ μΊ‘μνλ₯Ό μ΄λ£¨μ΄λΌ μ μλ€.
μ μ’μκΉ?
- λμ μμ§λ: μ½λλ μν₯λ ₯μ λ²μ(layer), λλ©μΈ(slice), κ·Έλ¦¬κ³ κΈ°μ μ λͺ©μ (segement)μ λ°λΌ κ΄λ¦¬κ° λμ΄, μλ‘κ² μ νλ μ¬λλ€μκ² μ΄ν΄νκΈ° μ¬μ΄ μ ννλ μν€ν μ³λ₯Ό μ 곡νλ€.
- λ‘μ§ μ¬μ¬μ© ν΅μ : κ° μν€ν μ³μ μ»΄ν¬λνΈλ λͺ©μ κ³Ό μμ κ°λ₯ν μμ‘΄μ± (dependency)μ μ§λλ€. μ΄λ κ³§ μ½λμμ μ§μμ μΌλ‘ μ¬μ©ν κ²κ³Ό μ μμ μΌλ‘ μ¬μ©ν κ²μ μ격νκ² κ΅¬λΆνλ€λ λ»μ΄κΈ°λ νλ€. λ°λΌμ, DRY μμΉκ³Ό μ μ κ°λ₯μ±κ°μ κ· νμ μ‘μμ€λ€.
- λ³κ²½μ΄λ 리ν©ν λ§μ μμ μ μ: νΉμ layerμ λͺ¨λμ κ°μ layerμ λ€λ₯Έ λͺ¨λμμ μ¬μ© λΆκ°λ₯νλ€. λ€λ₯Έ μμ layerμμλ λ§μ°¬κ°μ§λ‘ μ¬μ© λΆκ°λ₯νλ€. λ°λΌμ λ 립μ μΈ λ³κ²½μ΄ κ°λ₯νμ¬ μμμΉ λͺ»ν κ²°κ³Όλ₯Ό λ°©μ§ν μ μλ€
- κ· μΌμ±: λ¬λ컀λΈκ° λκΈ°λ νμ§λ§ νμ€νλ ꡬ쑰λμ μ μ νμλ νλ‘μ νΈκ° λ³΄λ€ μμνκ² κ΅΄λ¬κ°