FlipFlick-FE๋ React + TypeScript ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋ ํ๋ก ํธ์๋ ํ๋ก์ ํธ์ ๋๋ค. Vite๋ก ๊ตฌ์ฑ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ํ๊ฒฝ ์์ ์ต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ์ฌ, ์ ์ฐํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ์งํฅํฉ๋๋ค.
- ์ด README ์ ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ํ์ด๋ณด์ธ์.
src/App.tsx์์ ์ ์ฒด ๊ตฌ์กฐ ํ์ธ -router/index.tsx์์ ๋ผ์ฐํ ํ๋ฆ ์ดํดpages/-components/-services/์์ผ๋ก ๊ธฐ๋ฅ ํ๋ฆ ๋ฐ๋ผ๊ฐ๊ธฐ- ์ ์ญ ์คํ์ผ(
styles/)๊ณผ ์ ์ญ ์ํ(context/)๋ ๊ตฌ์กฐ ํ์ ํ ์ฐธ์กฐ - ๊ฐ๋ฐ ๊ฐ์ด๋๋ผ์ธ - ์ปดํฌ๋ํธ ๊ฐ๋ฐ (๊ถ์ฅ) โญ ํ๋ โญ
- React 19: ์ต์ ๋ฒ์ ์ React๋ฅผ ์ฌ์ฉํ์ฌ UI ๊ตฌ์ฑ
- TypeScript: ํ์ ์์ ์ฑ์ ์ ๊ณตํ๋ JavaScript ์ํผ์
- Vite: ๋น ๋ฅธ ๊ฐ๋ฐ ์๋ฒ์ ์ต์ ํ๋ ๋น๋๋ฅผ ์ ๊ณตํ๋ ํ๋ก ํธ์๋ ๋๊ตฌ
- React Router DOM: ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ
- Context API: React ๋ด์ฅ ์ํ ๊ด๋ฆฌ (ํ์์ ๋ฐ๋ผ ํ์ฅ ๊ฐ๋ฅ)
- ์ํ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ Zustand ๋๋ Redux ๋ฑ ๋์ ์ ๊ฒํ
- Styled Components: CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- CLSX: ์กฐ๊ฑด๋ถ ํด๋์ค ์ด๋ฆ ๊ด๋ฆฌ
- Axios: HTTP ํด๋ผ์ด์ธํธ
- Dayjs: ๋ ์ง ๋ฐ ์๊ฐ ์ฒ๋ฆฌ
- React-Toastify: ์๋ฆผ ๋ฉ์์ง ํ์
- Storybook: UI ์ปดํฌ๋ํธ ๊ฐ๋ฐ ๋ฐ ๋ฌธ์ํ
- ESLint: ์ฝ๋ ํ์ง ๋ฐ ์คํ์ผ ๊ฒ์ฌ
- Prettier: ์ฝ๋ ํฌ๋งทํ
- Vitest: ํ ์คํธ ํ๋ ์์ํฌ
- Husky & Commitlint: Git ํ ๋ฐ ์ปค๋ฐ ๋ฉ์์ง ๊ฒ์ฆ
- @iconify/react: ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- lucide-react: ์์ด์ฝ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ์ฌ ํ๋ก์ ํธ์์๋ ์์ด์ฝ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค:
- BaseButton.tsx์์๋
@iconify/react์Icon์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ - ExamplePage.tsx์์๋
lucide-react์์ ์ง์ ์์ด์ฝ ์ปดํฌ๋ํธ๋ฅผ importํ์ฌ ์ฌ์ฉ
src/
โโโ App.tsx # ์ต์์ ์ปดํฌ๋ํธ, Router ๋ฐ GlobalStyle ์ฃผ์
โโโ main.tsx # ์ฑ ์ง์
์
โโโ assets/ # ์ด๋ฏธ์ง, ํฐํธ ๋ฑ ์ ์ ์์ฐ
โโโ components/ # UI ์ปดํฌ๋ํธ (๊ณตํต ๋ฐ ๊ธฐ๋ฅ๋ณ)
โ โโโ common/ # ๊ณตํต UI (BaseButton, Modal, Layout ๋ฑ)
โ โโโ feature/ # ๋๋ฉ์ธ/๊ธฐ๋ฅ๋ณ UI (์ ์ ์นด๋, ํซ ๋ทฐ์ด ๋ฑ)
โ โโโ (์์)auth/ # ์ธ์ฆ ๊ด๋ จ ์ปดํฌ๋ํธ (๋ก๊ทธ์ธ, ํ์๊ฐ์
๋ฑ)
โ โโโ (์์)mypage/ # ๋ง์ดํ์ด์ง ๊ด๋ จ ์ปดํฌ๋ํธ
โโโ constants.ts # ์์ ์ ์ (URL, ๋ฉ์์ง, enum ๋ฑ)
โโโ context/ # ๊ธ๋ก๋ฒ ์ํ ๊ด๋ฆฌ (ThemeContext, AuthContext ๋ฑ)
โโโ hooks/ # ์ปค์คํ
React Hook
โโโ pages/ # ๋ผ์ฐํ
๋์ ํ์ด์ง ์ปดํฌ๋ํธ (HomePage, MyPage, LoginPage ๋ฑ)
โโโ router/ # ์ ์ฒด ๋ผ์ฐํ
์ ์
โ โโโ index.tsx # ๋ผ์ฐํ
์ค์
โโโ services/ # API ํธ์ถ ์ ์ (Axios ๊ธฐ๋ฐ)
โโโ stories/ # Storybook ์คํ ๋ฆฌ
โโโ styles/ # reset, globalStyle, theme ๋ฑ ์ ์ญ ์คํ์ผ
โโโ types/ # ๊ณตํต ํ์
, API ์๋ต ํ์
๋ฑ(๊ถ์ฅ, ํ์
์ ์ธ ์์น๋ ๊ฐ์ธ ์ ํ )
โโโ api.ts # API ์๋ต ํ์
์ ์
> ๊ฐ ๋๋ ํ ๋ฆฌ์ ์ฑ
์๊ณผ ํ์ผ ์ถ๊ฐ ๊ธฐ์ค์ ํ๋จ "๋๋ ํ ๋ฆฌ๋ณ ์์ฑ ๊ธฐ์ค" ์ฐธ์กฐ
- Node.js 18.x ์ด์
- npm ๋๋ yarn
# 1. ์ ์ฅ์ ํด๋ก
git clone https://github.com/your-username/flipflick-fe.git
cd flipflick-fe
# 2. ์์กด์ฑ ์ค์น
npm install
# ๋๋
yarn install
# 3. ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run dev
- ๊ฐ๋ฐ ์๋ฒ: http://localhost:5173
# ๊ฐ๋ฐ ์๋ฒ ์คํ (http://localhost:5173)
npm run dev
# ํ๋ก๋์
๋น๋
npm run build
# ๋น๋ ๊ฒฐ๊ณผ๋ฌผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
npm run preview
# ๋ฆฐํธ ๊ฒ์ฌ
npm run lint
# ๋ฆฐํธ ์ค๋ฅ ์๋ ์์
npm run lint:fix
# ์ฝ๋ ํฌ๋งทํ
npm run format
# ํฌ๋งทํ
๊ฒ์ฌ
npm run format:check
# Storybook ์คํ (http://localhost:6006)
npm run storybook
# Storybook ๋น๋
npm run build-storybook
# ํ
์คํธ ์คํ
npm run test- ์ด์๋ฅผ ์์ฑํ์ฌ ๊ธฐ๋ฅ ์์ฒญ ๋๋ ๋ฒ๊ทธ ์์ ์ ์ ์ํฉ๋๋ค.
- ์์ฑํ ์ด์ ์ข ๋ฅ์ ์ด์ ๋ฒํธ๋ก ์ ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค:
- ๋ณ๊ฒฝ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค: Conventional Commits์ ์ฌ์ฉํ๊ฑฐ๋ ํด๋น ๊ท์น์ ๋ฐ๋ฆ ๋๋ค.
- ๋ธ๋์น๋ฅผ ํธ์ํฉ๋๋ค:
git push origin feature/amazing-feature - GitHub์์ Pull Request๋ฅผ ์์ฑํฉ๋๋ค.
- ์ ๋ชฉ์
[FEAT] ๊ธฐ๋ฅ ์ค๋ช๋๋[FIX] ๊ธฐ๋ฅ ์ค๋ชํ์์ ๋ฐ๋ฆ ๋๋ค. - PR ์ค๋ช ์ ๋ณ๊ฒฝ์ฌํญ๊ณผ ๊ด๋ จ๋ ์ด์ ๋ฒํธ๋ฅผ ๋ช ์ํฉ๋๋ค.
- ์:
์ด PR์ #00 ์ด์๋ฅผ ํด๊ฒฐํฉ๋๋ค. - PR ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ํ์ํ ์ ๋ณด๋ฅผ ์์ฑํฉ๋๋ค.
- PR ์ ์ถ์๋ฅผ ๋ณธ์ธ์ผ๋ก ์ง์ ํ๊ณ ๋ฆฌ๋ทฐ์ด๋ฅผ ์ง์ ํฉ๋๋ค.
- PR์ด ์น์ธ๋๋ฉด
main๋ธ๋์น์ ๋ณํฉํฉ๋๋ค.
| ๋๋ ํ ๋ฆฌ | ์ฑ ์ | ํ์ผ ์ถ๊ฐ ๊ธฐ์ค |
|---|---|---|
components/common/ |
๋ฒ์ฉ UI | ๋ฒํผ, ๋ชจ๋ฌ ๋ฑ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ UI |
components/feature/ |
๊ธฐ๋ฅ ์ค์ฌ UI | ํน์ ๊ธฐ๋ฅ ์ ์ฉ UI (ex. ์ ์ ์นด๋) |
constants.ts |
์ ์ญ ์์ | URL, ๋ฉ์์ง, enum, ์ ๊ท์ |
context/ |
์ ์ญ ์ํ | Auth, Modal ๋ฑ App ๋จ์ ์ํ |
hooks/ |
์ปค์คํ ํ | ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง useModal.ts, useFetch.ts ๋ฑ |
pages/ |
๋ผ์ฐํธ ๋จ์ ํ์ด์ง | HomePage.tsx, LoginPage.tsx ๋ฑ |
router/ |
๋ผ์ฐํ ์ค์ | Route, Layout, ProtectedRoute ๋ฑ |
services/ |
API ์์ฒญ | userService.ts, problemService.ts ๋ฑ |
styles/ |
๊ธ๋ก๋ฒ ์คํ์ผ | reset, theme, ๊ธ๋ก๋ฒ CSS |
types/api.ts |
ํ์ ์ ์ | API ์๋ต ํ์ , ์ ์ญ ์ ํธ ํ์ |
| ๋ถ๋ฅ | ์์น | ์ค๋ช |
|---|---|---|
| ์ ์ญ ํ์ | types/api.ts |
๋ชจ๋ API ์๋ต ๋ฐ ๊ณตํต ์ ํธ ํ์ |
| Props ํ์ | ์ปดํฌ๋ํธ ํ์ผ ๋ด๋ถ | ๊ฐ๋จํ props๋ inline ๋๋ ์ปดํฌ๋ํธ ๋ด๋ถ ์ ์ธ |
| ์ ํธ ํ์ | types/api.ts ๋ด ์ ์ |
Pagination, ApiResponse<T> ๋ฑ |
- any ์ฌ์ฉ ๊ธ์ง
- ๋ฐํ ํ์ ๋ช ์ ํ์
- readonly, as const, Omit, Pick ์ ๊ทน ์ฌ์ฉ
- ๋ฐ๋ณต ๊ตฌ์กฐ๋ ์ ๋ค๋ฆญ ์ ํธ ํ์ ์ผ๋ก ๋ถ๋ฆฌ
// services/userService.ts
import AxiosInstance from './axios'
export const getUserInfo = () => {
return AxiosInstance.get('/user/info')
}- ๋ชจ๋ ์ํฌํธ๋ ๋ช ์์ ์ผ๋ก ์์ฑํฉ๋๋ค. (์๋ ์ํฌํธ ์ฌ์ฉ ๊ธ์ง)
- ๊ณตํต ์ปดํฌ๋ํธ๋
components/common๋๋ ํ ๋ฆฌ์ ๋ฐฐ์นํฉ๋๋ค. - ํน์ ๊ธฐ๋ฅ์ ๊ด๋ จ๋ ์ปดํฌ๋ํธ๋
components/feature๋๋ ํ ๋ฆฌ์ ๋ฐฐ์นํฉ๋๋ค. - ์ํ ๊ด๋ฆฌ, api ํธ์ถ, ํ์ ์ ์ธ, ์ปค์คํ ํ ๋ฑ์ ํด๋น ์ปดํฌ๋ํธ์ ๊ฐ๊น์ด ์์น์ ๋ฐฐ์นํฉ๋๋ค.
- ์คํ์ผ์ ์ปดํฌ๋ํธ ๋ด๋ถ์์
styled-components๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํฉ๋๋ค. - ๋ค๋ฅธ ์ฝ๋์ ์ํฅ์ด ์๋ค๋ฉด ์ฑ ์ ๋ฐ ์์น ๋ถ๋ฆฌ๋ฅผ ์๋ฐํ๊ฒ ์ ์ฉํ์ง ์์๋ ๋ฉ๋๋ค.(์ ์ฌํญ๋ค์ ๊ถ์ฅ ์ฌํญ์ ๋๋ค)
- (์ ํ) ์ปดํฌ๋ํธ ๊ฐ๋ฐ ์ Storybook๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ๋ํด ๋ฌธ์ํํ ์ ์์ต๋๋ค.
- Conventional Commits ํ์์ ๋ฐ๋ฆ
๋๋ค:
feat:์๋ก์ด ๊ธฐ๋ฅfix:๋ฒ๊ทธ ์์ docs:๋ฌธ์ ๋ณ๊ฒฝstyle:์ฝ๋ ์คํ์ผ ๋ณ๊ฒฝ (๊ธฐ๋ฅ ๋ณ๊ฒฝ ์์)refactor:๋ฆฌํฉํ ๋ง (๊ธฐ๋ฅ ๋ณ๊ฒฝ ์์)test:ํ ์คํธ ์ถ๊ฐ ๋๋ ์์ chore:๋น๋ ํ๋ก์ธ์ค ๋๋ ๋๊ตฌ ๋ณ๊ฒฝ
Vitest๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ ํ
์คํธ ๋ฐ ํตํฉ ํ
์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ํ
์คํธ ํ์ผ์ ๊ด๋ จ ์ปดํฌ๋ํธ๋ ๊ธฐ๋ฅ ๊ทผ์ฒ์ .test.ts ๋๋ .test.tsx ํ์ฅ์๋ก ๋ฐฐ์นํฉ๋๋ค.
# ๋ชจ๋ ํ
์คํธ ์คํ
npm run test
# ํน์ ํ
์คํธ ํ์ผ ์คํ
npm run test -- path/to/test/file.test.tsํ๋ก์ ํธ ๋ฐฐํฌ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ ์ถ๊ฐ ํ์.
# ํ๋ก๋์
๋น๋ ์์ฑ
npm run build
# ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ dist/ ๋๋ ํ ๋ฆฌ์ ์์ฑ๋ฉ๋๋คํ์ฌ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ๋๋ฉ์ธ ์ค์ฌ + ์ํ ๋ฏน ๊ตฌ์กฐ๊ฐ ํผํฉ๋ React + TypeScript + Vite ํ๋ก์ ํธ์ ๋๋ค. ๊ฐ ๋๋ ํ ๋ฆฌ์ ์ฉ๋์ ๋ฐ๋ผ ๊ธฐ๋ฅ ์ถ๊ฐ, ๋ฆฌํฉํ ๋ง, ๋ฒ๊ทธ ์์ ์ ์ ํ์ผ์ ์์น๋ ๋ค์ ๊ธฐ์ค์ ๋ฐ๋ฆ ๋๋ค:
| ๋๋ ํ ๋ฆฌ | ์ฉ๋ | ์ธ์ /๋ฌด์์ ์ถ๊ฐํ๋? |
|---|---|---|
src/App.tsx, src/main.tsx |
์ฑ ์ง์ ์ | ๊ธ๋ก๋ฒ ๋ ์ด์์, ์ต์์ ๋ผ์ฐํ , Provider ์ฃผ์ ๋ฑ ์ ์ญ ์ค์ ์ ์์ |
src/assets |
์ ์ ์์ฐ (์ด๋ฏธ์ง ๋ฑ) | ์์ด์ฝ, ์ด๋ฏธ์ง, ํฐํธ, ๋ฐฐ๊ฒฝ ๋ฑ ์ถ๊ฐํ ๋ ์ฌ์ฉ - react.svg๋ ์์ - styles/๋ CSS, ๊ธ๋ก๋ฒ ์คํ์ผ ๋๋ ํฐํธ ๋ฑ ๊ฐ๋ฅ |
src/components/common |
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ | ๋ฒํผ, ๋ชจ๋ฌ, ํ ์คํธ, ํญ ๋ฑ ๋ฒ์ฉ์ UI ์ถ๊ฐ |
components/common/layout |
๊ณต์ฉ ๋ ์ด์์ ์ปดํฌ๋ํธ | BasePageLayout, AuthLayout ๋ฑ ํ์ด์ง ๊ตฌ์กฐ๋ฅผ ๋ด๋นํ๋ ๊ณต์ฉ UI |
| src/components/feature | ํน์ ๋๋ฉ์ธ ์ข
์ UI ์ปดํฌ๋ํธ | ์ ์ ์นด๋, ํซ ๋ทฐ์ด, ๊ฒ์ํ ๋ฑ ํน์ ๊ธฐ๋ฅ ์ ์ฉ ์ปดํฌ๋ํธ ์ถ๊ฐ |
| src/constants | ์์ ์ ์ | ์ ์ enum, URL, ๋ฉ์์ง, ์ ๊ท์, ๋ง๋ฒ ์ซ์/๋ฌธ์ ์ ๊ฑฐ์ฉ |
| src/context | ์ ์ญ ์ํ ๊ด๋ฆฌ (React Context) | ์๋ก์ด ์ ์ญ ์ํ ์ถ๊ฐ ์: xxxContext.tsx ์์ฑ
ex)
AuthContext, ThemeContext ๋ฑ |
| src/hooks | ์ ์ญ ์ฌ์ฌ์ฉ ์ปค์คํ
ํ
| useModal.ts, useUserInfo.ts, useFetch.ts ๋ฑ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง ์์ฑ |
| src/pages | ๋ผ์ฐํธ ๋จ์ ํ์ด์ง ์ปดํฌ๋ํธ | ์๋ก์ด ๋ผ์ฐํธ ์์ฑ ์ ์ด ๋๋ ํ ๋ฆฌ์ Page ๋จ์ ์ปดํฌ๋ํธ ์์ฑ
ex) HomePage.tsx,
MyPage.tsx ๋ฑ |
| src/router | ๋ผ์ฐํ
์ค์ | ํ์ด์ง ์ถ๊ฐ/๋ณ๊ฒฝ ์ ๋ผ์ฐํธ๋ ์ฌ๊ธฐ์ ์ ์ ๋๋ ๊ฐฑ์ |
| src/services | ์ธ๋ถ API ํธ์ถ (Axios ๋ฑ) | api/user.ts, api/problem.ts ๋ฑ REST API ์ฐ๊ฒฐ ์๋น์ค
์์ฑ |
| src/stories | Storybook ๊ด๋ จ | ๊ฐ ์ปดํฌ๋ํธ ์คํ ๋ฆฌ ๋ฐ ๋ฐ๋ชจ์ฉ ์์ ํ์ผ ์์ฑ |
| src/styles | ๊ธ๋ก๋ฒ CSS/Styled-component theme ๋ฑ | ํ
๋ง, ๊ณตํต ์คํ์ผ, reset.css ๋ฑ ์์ฑ |
| src/types | ์ ์ญ ํ์
์ ์ | ์ ์ญ ๊ณตํต ํ์
, ์ ํธ ํ์
, API ์๋ต ํ์
๋ฑ์ ์ ์ |
| ๋ชฉ์ | ์ถ๊ฐ ์์น |
|---|---|
| ์๋ก์ด ํ์ด์ง ์์ฑ | src/pages/SomePage.tsx |
| ํ์ด์ง ๋ผ์ฐํ ์ถ๊ฐ | src/router/index.ts |
| ์ ์ญ ์ํ ๊ด๋ฆฌ ์ถ๊ฐ | src/context/SomeContext.tsx |
| ๊ณตํต ๋ฒํผ/์ ๋ ฅ์ฐฝ ์ปดํฌ๋ํธ ์ถ๊ฐ | src/components/common/MyButton.tsx |
| ๋๋ฉ์ธ ํนํ UI ์ปดํฌ๋ํธ ์ถ๊ฐ | src/components/feature/ ๋ด์ UserCard.tsx, PetViewer.tsx ๋ฑ |
| REST API ์ฐ๊ฒฐ | src/services/xxxService.ts |
| ์ปค์คํ ํ ์์ฑ | src/hooks/useXxx.ts |
| ์ ์ ์์/enum | src/constants/xxx.ts |
| ๊ธ๋ก๋ฒ ์คํ์ผ | src/styles/globalStyle.ts |
| ์ด๋ฏธ์ง, ์์ด์ฝ | src/assets/ ๋๋ src/assets/icons/ ๋ฑ์ ์ฌ์ฉ ๋๋ฉ์ธ ์์น์ ํด๋ ๊ตฌ์กฐ ์์ฑ |
| ๋ผ์ฐํธ ์ ์ | src/router/index.tsx์ <Routes> ๋ด๋ถ์ <Route> ์ ์ |
| ๋ผ์ฐํฐ ์ ์ฉ | src/App.tsx <BrowserRouter>๋ก ๊ฐ์ธ๊ธฐ |
| ํ์ด์ง ์ปดํฌ๋ํธ | src/pages/ ๊ฐ๊ฐ์ URL์ ๋์๋๋ UI ์ปดํฌ๋ํธ |
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉด
common๋๋hooks, ๋๋ฉ์ธ ํนํ๋ฉดfeature๋ก - (ui, hooks, ๋ฑ)
- API ๋ก์ง์
services์ ์ญ ์ํ ๋ก์ง์context, UI ๋ก์ง์components๋ก ๋ถ๋ฆฌ - ํ์ด์ง ๋จ์ ์ปดํฌ๋ํธ๋
pages, ui ์ปดํฌ๋ํธ๋components๋ก ๋ถ๋ฆฌ - ํน์,
components/feature/{๊ธฐ๋ฅ/๋๋ฉ์ธ ์ด๋ฆ}/,page/{๊ธฐ๋ฅ/๋๋ฉ์ธ ์ด๋ฆ}์ ์์ฑ
- ๋ผ์ฐํ
UI๋ฉด
pages, ์กฐ๋ฆฝ UI๋ฉดcomponents
.svg,.png๋ฑ์assets/, ์ปดํฌ๋ํธ๋components/- ์ ์ ์์๋
constants.ts์ ์ ์ - ์ ์ ์คํ์ผ์
styles/์ ์์ฑ - ์ ์ญ ํ์
์
types/์ ์์ฑ - API ์๋ต ํ์
์
types/api.ts์ ์์ฑ - ์ปค์คํ
ํ
์
hooks/์ ์์ฑ - ์๋น์ค API ํธ์ถ์
services/์ ์์ฑ - ๋ผ์ฐํ
์ค์ ์
router/์ ์์ฑ - ์ ์ญ ์ํ ๊ด๋ฆฌ๋
context/์ ์์ฑ
- React Router v6 ์ด์์์ ๊ถ์ฅ๋๋ ๋ ์ด์์ ๋ฐ ํ์ด์ง ๊ตฌ์ฑ ๋ฐฉ์์ผ๋ก ๊ณต์ฉ ๋ ์ด์์๊ณผ ๊ฐ๋ณ ํ์ด์ง ๋ฐ ๊ฐ๋ณ ๋ ์ด์์์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํฉ๋๋ค.
<Routes>
{/* ๊ณต์ฉ ๋ ์ด์์ ์ ์ฉ ๊ทธ๋ฃน */}
<Route element={<BasePageLayout/>}>
<Route path="/" element={<HomePage/>}/>
<Route path="/mypage" element={<MyPage/>}/>
<Route path="/about" element={<AboutPage/>}/>
</Route>
{/* ๊ณต์ฉ ๋ ์ด์์์ ์ฌ์ฉํ์ง ์๋ ๊ฐ๋ณ ํ์ด์ง ๋ฐ ๋ณ๋ ๋ ์ด์์ ์กด์ฌ ์*/}
<Route element={<AuthLayout/>}>
<Route path="/login" element={<LoginPage/>}/>
<Route path="/signup" element={<SignupPage/>}/>
</Route>
<Route path="*" element={<NotFoundPage/>}/>
</Routes>- ์ปดํฌ๋ํธ ๋จ์๋ Storybook์ ๋ง๋ค๋ฉด
src/stories์ ์์ฑํ์ฌ ์ปดํฌ๋ํธ ๋จ์๋ก ๋๋๋ง ๋ฐ ํ์ธํ ์ ์์- (์๋ ๋ฌธ์ํ ๋ฐ ํ ์คํธ ์ฉ์ด)