ํ๋ด์์ ๋์์ธ ์์คํ ์ค๊ณ์ ๊ธฐ์กด ์ฌ์ฉํ๋ ํด๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ๊ฐ๊ธฐ์๋ ํ๊ณ๊ฐ ์์๋ค.
์๋๋ ๊ธฐ์กด ํด๋ ๊ตฌ์กฐ์ด๋ค.
ํด๋น ๊ตฌ์กฐ๋ ์๋น์ค ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์ ์ง๋ณด์์ฑ์ ๋ถ๋ฆฌํ๊ฒ ๋์๋ค.
์ด ๊ตฌ์กฐ์ ๋จ์ ์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
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 ํจํด, ์ฆ ๊ธฐ๋ฅ๋ณ ๋์์ธ ์ํคํ ์ณ๊ฐ ํ์์ ์ด๋ผ๊ณ ์๊ฐํ๋ ์์ฆ์ด๋ค!