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μ—μ„œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ μ‚¬μš© λΆˆκ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ 독립적인 변경이 κ°€λŠ₯ν•˜μ—¬ μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όλ₯Ό λ°©μ§€ν•  수 μžˆλ‹€
  • 균일성: λŸ¬λ‹μ»€λΈŒκ°€ λ†’κΈ°λŠ” ν•˜μ§€λ§Œ ν‘œμ€€ν™”λœ ꡬ쑰덕에 적응 ν›„μ—λŠ” ν”„λ‘œμ νŠΈκ°€ 보닀 μˆ˜μ›”ν•˜κ²Œ ꡴러감