ํŒ€๋‚ด์—์„œ ๋””์ž์ธ ์‹œ์Šคํ…œ ์„ค๊ณ„์‹œ ๊ธฐ์กด ์‚ฌ์šฉํ•˜๋˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—‡๋‹ค.

 

์•„๋ž˜๋Š” ๊ธฐ์กด ํด๋” ๊ตฌ์กฐ์ด๋‹ค.

React์—์„œ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ฐ„๋‹จํ•œ ํด๋” ๊ตฌ์กฐ ํ˜•ํƒœ

 

 

ํ•ด๋‹น ๊ตฌ์กฐ๋Š” ์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ๋ถˆ๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ด ๊ตฌ์กฐ์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. ๊ด€์‹ฌ์‚ฌ ํ˜ผํ•ฉ

components์™€ pages ํด๋”์˜ ํŒŒ์ผ์ด ๊ฑฐ์˜ 1:1๋กœ ๋งคํ•‘๋˜๋‹ค ๋ณด๋‹ˆ, ๋งˆ์น˜ ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด user๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ๋„ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฐ๊ตญ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์—ด์–ด ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

 

2. ํ™•์žฅ ์‹œ ์Šค์ผ€์ผ ๋ฌธ์ œ

  • ๊ธฐ๋Šฅ๋ณ„๋กœ ํด๋”๊ฐ€ ์•„๋‹ˆ๋ผ ๋ ˆ์ด์–ด๋ณ„(components, pages, utils)๋กœ๋งŒ ๋‚˜๋ˆ ์ ธ ์žˆ์–ด์„œ,
    ํŽ˜์ด์ง€๋‚˜ ๊ธฐ๋Šฅ์ด ๋งŽ์•„์ง€๋ฉด components/ ํด๋” ์•ˆ์ด ๋„ˆ๋ฌด ์ปค์ง€๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ๋กœ components๋‚ด์˜ ํŒŒ์ผ ๊ฐœ์ˆ˜๋Š” 1000๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์ƒํ™ฉ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ํ˜น์€ ๊ธฐ์กด ๊ธฐ๋Šฅ ๊ณ ๋„ํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ ๊ธฐ๋Šฅ์—๋งŒ ๊ด€๋ จ๋œ ํŒŒ์ผ๋งŒ ๋ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์–ด๋–ค ๊ฒƒ์ด ์—ฐ๊ด€์ด ์žˆ๋Š”์ง€ ์ง์ ‘ ์ฐพ์•„๊ฐ€๋ฉฐ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค.

3. ํŽ˜์ด์ง€์™€ ์ปดํฌ๋„ŒํŠธ ๊ฒฐํ•ฉ๋„ ๋ฌธ์ œ

 

  • pages/์™€ components/๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์Œ → ์œ ์ง€๋ณด์ˆ˜ ์‹œ ํŽ˜์ด์ง€-์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋งฅ๋ฝ ํŒŒ์•… ์–ด๋ ต๋‹ค.
  • ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ํŽ˜์ด์ง€์™€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋”์—์„œ ์ฐพ์•„์•ผ ํ•œ๋‹ค. → ์“ฐ์ด๋Š” ๊ณณ์„ ์ฐพ์•„๊ฐ€๋ฉฐ ๊ฒฝ๋กœ๋ฅผ ์ด๋™ํ•˜๋‹ค ๊ธธ์„ ์žƒ์„ ์ˆ˜ ์žˆ๋‹ค (;;)

 

 

 

์ด๋Ÿฌํ•œ ๋‹จ์ ๋“ค๋กœ ์ธํ•ด ์šฐ๋ฆฌ ํŒ€ ๋‚ด์—์„œ๋Š” ๊ฐœ์„ ๋ฐฉํ–ฅ์œผ๋กœ ํ”„๋กœ์ ํŠธ์— FSD ์•„ํ‚คํ…์ณ๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

 

๋‹จ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์›Œ๋‚™ ํฌ๋‹ค๋ณด๋‹ˆ FSD(Feature-Sliced Design) ์•„ํ‚คํ…์ณ๋ฅผ ํ•œ ๋ฒˆ์— ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ๋””์ž์ธ ์‹œ์Šคํ…œ ์ •๋ฆฝ์ด ์ƒˆ๋กœ ์ง„ํ–‰๋˜๊ณ  ์žˆ์—ˆ์œผ๋ฏ€๋กœ ๋””์ž์ธ ์‹œ์Šคํ…œ์— ์ด ์•„ํ‚คํ…์ณ๋ฅผ ๋„์ž…ํ•ด ๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค. 

 

๊ธฐ๋ณธ ๊ณจ์ž๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

 

 

๐Ÿ“‚ shared/

ํ”„๋กœ์ ํŠธ ์ „์—ญ์—์„œ ๊ณต์šฉ์œผ๋กœ ์“ฐ์ด๋Š” ์š”์†Œ ๋ชจ์Œ

  • tokens/
    • ์ƒ‰์ƒ, ํฐํŠธ, spacing, z-index ๋“ฑ ๋””์ž์ธ ํ† ํฐ
    • ex) colors.ts, typography.ts, spacing.ts
  • hooks/
    • ํ”„๋กœ์ ํŠธ ์ „์—ญ ๊ณต์šฉ ํ›…
    • ex) useMediaQuery, useTheme
  • utils/
    • ํฌ๋งทํ„ฐ, ํ—ฌํผ ํ•จ์ˆ˜ ๋“ฑ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋กœ์ง
    • ex) formatDate, debounce, clsx

 

๐Ÿ“‚ entities/

ํ•˜๋‚˜์˜ ๋…๋ฆฝ์ ์ธ UI ์—”ํ‹ฐํ‹ฐ(์ปดํฌ๋„ŒํŠธ) ๋‹จ์œ„

  • ex) button/, input/, avatar/
  • ๊ฐ ์—”ํ‹ฐํ‹ฐ๋Š” ์ž๊ธฐ ์™„๊ฒฐ์ 
    • ui/ → ์‹ค์ œ UI ์ปดํฌ๋„ŒํŠธ (styled-components + variant ์Šคํƒ€์ผ ์ •์˜ ํฌํ•จ)
    • model/ → ํƒ€์ž… ์ •์˜, ์ƒํƒœ ๊ด€๋ฆฌ, ๋‚ด๋ถ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
    • index.ts → ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์˜ ์ง„์ž…์  (์™ธ๋ถ€์— ๋…ธ์ถœํ•  API)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋ฒ„ํŠผ์„ ์“ธ ๋•Œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ import { Button } from '@/entities/button' ์‹์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ.

 

๐Ÿ“‚ widgets/ (์„ ํƒ์ )

์—”ํ‹ฐํ‹ฐ๋“ค์„ ์กฐํ•ฉํ•ด ๋งŒ๋“  ๋ณตํ•ฉ UI ์ปดํฌ๋„ŒํŠธ (๋‹จ, ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํด๋” ์ถ•์†Œํ™”๋ฅผ ์œ„ํ•ด entities์— ๋ณตํ•ฉ ui๋ฅผ ํฌํ•จํ•˜๊ธฐ๋„ ํ•˜์˜€๋‹ค.)

  • ์˜ˆ: Form, Navbar, Sidebar
  • ํŽ˜์ด์ง€๋‚˜ ๊ธฐ๋Šฅ์— ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ ๋‹จ์œ„
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฑฐ์˜ ์—†๊ณ  UI ๊ฒฐํ•ฉ ์ค‘์‹ฌ

 

๐Ÿ“‚ app/

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ํ™˜๊ฒฝ๊ณผ ๋ฐ๋ชจ ํŽ˜์ด์ง€

  • ๋””์ž์ธ ์‹œ์Šคํ…œ Storybook, ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ ๋“ฑ
  • ๋ผ์šฐํŒ…, ์ „์—ญ Provider, App-level ์„ค์ • ํฌํ•จ ๊ฐ€๋Šฅ
  • ex) storybook/, App.tsx, global.css

 

์ด ๊ตฌ์กฐ์˜ ํŠน์ง•์„ ์‚ดํŽด๋ณด์ž.

 

1. ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ
๋””์ž์ธ ํ† ํฐ, ๊ณต์šฉ ์œ ํ‹ธ, UI ์—”ํ‹ฐํ‹ฐ, ๋ณตํ•ฉ UI, ์•ฑ ํ™˜๊ฒฝ์ด ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ
2. ์Šค์ผ€์ผ ํ™•์žฅ์— ๊ฐ•ํ•จ
์ƒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ ํด๋”๋งŒ ์ƒ์„ฑํ•˜๋ฉด ๋จ → ํด๋”๊ฐ€ ๊ธฐ๋Šฅ ์ค‘์‹ฌ์œผ๋กœ ๋Š˜์–ด๋‚จ.
3. Storybook/TDD ์นœํ™”์ 
๊ฐ ์—”ํ‹ฐํ‹ฐ/์œ„์ ฏ ์•ˆ์—์„œ ๋ฐ”๋กœ ์Šคํ† ๋ฆฌ๋ถ๊ณผ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๊ฐ€๋Šฅ.
4. ์žฌ์‚ฌ์šฉ์„ฑ ๊ทน๋Œ€ํ™”
์œ„์ ฏ·์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์‰ฌ์›€.

 

 

 

ํ˜„์žฌ๊นŒ์ง€ ์ž‘์—…์€ ๊ณ„์† ์ง„ํ–‰์ค‘์ด๋‹ค. ํ•˜๋ฃจ ๋นจ๋ฆฌ ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ฐ FSD ์•„ํ‚คํ…์ฒ˜ ๋„์ž…์ด ์ •์ƒํ™”๋˜์–ด ์ผ์˜ ํšจ์œจ์ด ๋†’์•„์ง€๋ฉด ์ข‹๊ฒ ๋‹ค.

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” FSD ํŒจํ„ด, ์ฆ‰ ๊ธฐ๋Šฅ๋ณ„ ๋””์ž์ธ ์•„ํ‚คํ…์ณ๊ฐ€ ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์š”์ฆ˜์ด๋‹ค!

 

 

 

+ Recent posts