hooks, utils, components ๊ตฌ์กฐ์—์„œ Feature ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ

2026. 3. 3. 11:17ยท๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™/ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + ๋ฆฌํŒฉํ† ๋ง
์—ญํ•  ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์—์„œ ๋ฐœ์ƒํ•œ ์ฝ”๋“œ ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด
Feature ๋‹จ์œ„ ๊ตฌ์กฐ(FSD ์ผ๋ถ€)๋ฅผ ๋„์ž…ํ•œ ๊ฒฝํ—˜์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“ฆ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์—ญํ•  ๊ธฐ๋ฐ˜(hooks, utils, components)์œผ๋กœ
ํด๋”๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ง„ํ–‰ํ–ˆ์—ˆ๋‹ค.

๐Ÿ“ฆsrc 
โ”ฃ ๐Ÿ“‚components 
โ”ฃ ๐Ÿ“‚hooks 
โ”ฃ ๐Ÿ“‚utils 
โ”ฃ ๐Ÿ“‚types 
โ”ฃ ๐Ÿ“‚lib
...

์ด์ „๊นŒ์ง€๋Š” ๊ธฐ์ดˆ, ์ค‘๊ธ‰ ํ”„๋กœ์ ํŠธ์˜€๊ธฐ์— ํŒŒ์ผ ์ˆ˜๋„ ๋งŽ์ง€ ์•Š์•˜๊ณ ,
์—ญํ•  ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์ด ์ง๊ด€์ ์ด๊ณ  ์ต์ˆ™ํ•ด์„œ ํŒ€์› ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

 

๐Ÿค” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๋А๋‚€ ์ 

๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ๊ฒฝํ—˜ํ•ด๋ณด๋ฉด์„œ
์—ญํ•  ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์— ๋ถˆํŽธํ•จ์„ ๋А๋ผ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•  ๋•Œ
UI๋Š” components ํด๋”์—์„œ ์ƒํƒœ์™€ ๋กœ์ง์€ hooks, ํƒ€์ž…์€ types ํด๋”์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ๊ณ 
๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ํด๋”์— ํฉ์–ด์ ธ ์žˆ์–ด์„œ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์œ„์น˜๋ฅผ ๊ณ„์† ํƒ์ƒ‰ํ•ด์•ผ ํ–ˆ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฝ”๋“œ ํ๋ฆ„ ํŒŒ์•…์ด ์–ด๋ ค์›Œ์ง€๊ณ 
์ˆ˜์ • ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ํ•œ ๋ฒˆ์— ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค์–ด์„œ
๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.

 

๐Ÿƒ ๋ถˆํŽธํ•œ ํด๋” ๊ตฌ์กฐ ํƒˆ์ถœํ•˜๊ธฐ

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ๋Š”
์—ญํ•  ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๊ณ 
๊ทธ ๊ณผ์ •์—์„œ FSD(Feature-Sliced Design)๋ฅผ ์ฐธ๊ณ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

https://feature-sliced.design/kr/docs/get-started/overview

๋‹ค๋งŒ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์•ฝ 5์ฃผ๊ฐ„ ์ง„ํ–‰๋˜๋Š” ๋‹จ๊ธฐ ํ”„๋กœ์ ํŠธ์˜€๊ธฐ ๋•Œ๋ฌธ์—
FSD๋ฅผ ์ „์ฒด์ ์œผ๋กœ ๋„์ž…ํ•˜๊ธฐ์—๋Š” ๊ตฌ์กฐ๊ฐ€ ๋‹ค์†Œ ๋ฌด๊ฒ๊ณ 
ํŒ€์› ๋ชจ๋‘๊ฐ€ ์ดํ•ดํ•ด์„œ ์ ์šฉํ•˜๊ธฐ์—๋Š” ์‹œ๊ฐ„์ด ์ด‰๋ฐ•ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ FSD ๊ฐœ๋…์—์„œ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๋ฉด ์ข‹์„ ๋ถ€๋ถ„๋งŒ ๋ฝ‘์•„์„œ
์„ ํƒ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ–ˆ๋‹ค.

 

๐Ÿ’ก ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ

1. pages ๋ ˆ์ด์–ด → app ๋””๋ ‰ํ† ๋ฆฌ

๐Ÿ“ฆsrc
โ”ฃ ๐Ÿ“‚app
โ”ƒ โ”ฃ ๐Ÿ“‚(protected)
โ”ƒ โ”ฃ ๐Ÿ“‚(public)
...

Next.js์˜ App Router๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
FSD์˜ pages ๋ ˆ์ด์–ด๋Š” ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ 
app ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋Œ€์ฒดํ–ˆ๋‹ค.

 

2. ๊ตฌ์กฐ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ

๊ตฌ์กฐ๋Š” shared / features๋กœ ๋‹จ์ˆœํ™”ํ–ˆ๋‹ค.

๐Ÿ“ฆsrc
โ”ฃ ๐Ÿ“‚features  # ๊ธฐ๋Šฅ ๋‹จ์œ„ ์ฝ”๋“œ
โ”ฃ ๐Ÿ“‚shared    # ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ

๋ณต์žกํ•œ ๋ ˆ์ด์–ด๋ฅผ ๋ชจ๋‘ ๋„์ž…ํ•˜๊ธฐ๋ณด๋‹ค๋Š”
ํŒ€์ด ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ๋‹ค.

 

3. shared ๊ธฐ์ค€ ์ •์˜

๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๊ณ ๋ฏผ์ด ๋งŽ์•˜๋˜ ๋ถ€๋ถ„์€
์–ด๋””๊นŒ์ง€๋ฅผ shared๋กœ ๊ด€๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€์˜€๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‘ ๊ณณ ์ด์ƒ์—์„œ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ
shared๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ๋กœ ๊ธฐ์ค€์„ ์„ธ์› ๋‹ค.

๊ธฐ์ค€์„ ์ ์šฉํ•˜๋ฉด์„œ ๋ถˆํ•„์š”ํ•œ ์ถ”์ƒํ™”๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๊ณ ,
shared ๋ ˆ์ด์–ด๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๊ฒƒ๋„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

4. features ๊ตฌ์กฐ ์„ค๊ณ„

features ํด๋”๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ
ํ•œ ๊ณณ์— ๋ชจ์œผ๋Š” ๊ฒƒ์„ ์ค‘์ ์œผ๋กœ ํ–ˆ๋‹ค.

๐Ÿ“ฆfeatures 
โ”ฃ ๐Ÿ“‚activity-detail
โ”ƒ โ”ฃ ๐Ÿ“‚components
โ”ƒ โ”ฃ ๐Ÿ“‚hooks
โ”ƒ โ”ฃ ๐Ÿ“‚queries
โ”ƒ โ”ฃ ๐Ÿ“‚utils
โ”ƒ โ”— ๐Ÿ“‚constants
โ”ฃ ๐Ÿ“‚activity-form 
โ”ฃ ๐Ÿ“‚auth
โ”ฃ ๐Ÿ“‚main
โ”ฃ ๐Ÿ“‚mypage
โ”— ๐Ÿ“‚notification

features๋Š” ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑํ–ˆ๊ณ ,
feature ๋‚ด๋ถ€์—๋Š” ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.

 

๐Ÿ” ๊ตฌ์กฐ ๊ฐœ์„  ๊ฒฐ๊ณผ ๋ฐ ํšŒ๊ณ 

Before vs After

Before (์—ญํ•  ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ) After (Feature ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ)
๊ธฐ๋Šฅ ํ•˜๋‚˜ ์ˆ˜์ • ์‹œ ์—ฌ๋Ÿฌ ํด๋” ์ด๋™ ํ•„์š” ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์˜ feature ๋‚ด๋ถ€์— ๋ชจ์—ฌ ์žˆ์Œ
์ฝ”๋“œ ํ๋ฆ„ ํŒŒ์•… ์–ด๋ ค์›€ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ ์ดํ•ด ๊ฐ€๋Šฅ
ํƒ์ƒ‰ ๋น„์šฉ ์ฆ๊ฐ€ ๋ฆฌํŒฉํ† ๋ง ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„ ํŒŒ์•… ์šฉ์ด

 

ํšŒ๊ณ 

์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๊ตฌ์กฐ ์„ค๊ณ„์—๋Š” ์ •๋‹ต์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๋А๊ผˆ๋‹ค.

 

FSD๋ฅผ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ, ๊ธฐ๊ฐ„, ํŒ€์˜ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•ด์„œ
ํ•„์š”ํ•œ ๋ถ€๋ถ„ ๋งŒํผ๋งŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์ด
๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ํฐ ์˜ํ–ฅ์„ ์ค€๋‹ค๋Š” ๊ฒƒ์„ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!

 

 

728x90
'๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™/ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + ๋ฆฌํŒฉํ† ๋ง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ๐Ÿช ์ƒˆ๋กœ๊ณ ์นจ + ๋’ค๋กœ๊ฐ€๊ธฐ ์ดํƒˆ ๋ชจ๋‹ฌ ๊ตฌํ˜„ ์‚ฝ์งˆ๊ธฐ
  • ๐Ÿš€ Vercel ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ API๊ฐ€ ๋А๋ฆฌ๋‹ค๋ฉด? Region ์„ค์ •์„ ํ™•์ธํ•˜์ž!
  • ๐Ÿšจ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ — ์ด๋ชจ์ง€ ๋ฐ˜์‘ UI ๋ฏธ๋ฐ˜์˜ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  • ๐Ÿšจ PropTypes์—์„œ JSDoc์œผ๋กœ — React 19 ํƒ€์ž… ๊ด€๋ฆฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
_์ด์•Ž
_์ด์•Ž
๊ณต๋ถ€ ๊ธฐ๋ก ๋ธ”๋กœ๊ทธ
  • _์ด์•Ž
    ๊ณต๋ถ€
    _์ด์•Ž
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • โœ๏ธ ๋ชจ๋“  ๊ธ€ (86)
      • ๐Ÿ“š ํ”„๋ก ํŠธ์—”๋“œ (50)
        • Web (6)
        • React (11)
        • Next.js (2)
        • JavaScript (13)
        • TypeScript (2)
        • Dev Setup (1)
        • git+github (5)
        • HTML+CSS (9)
        • ๊ฐ€๋ณ๊ฒŒ ๊ธฐ๋ก (1)
      • ๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™ (29)
        • ์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ 19๊ธฐ (20)
        • ํ”„๋กœ์ ํŠธ (2)
        • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + ๋ฆฌํŒฉํ† ๋ง (6)
        • ๊ธฐํƒ€ (1)
      • ๐Ÿ“ ์ž๋ฃŒ ์ •๋ฆฌ (3)
        • React ๊ณต์‹๋ฌธ์„œ (3)
      • โš™๏ธ etc. (4)
  • ๋งํฌ

    • ๐Ÿ‘‹ GitHub
    • ๐Ÿง ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ธฐ๋ก
    • ๐Ÿ“š ์ฑ…
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
_์ด์•Ž
hooks, utils, components ๊ตฌ์กฐ์—์„œ Feature ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”