Skip to content

Latest commit

ย 

History

351 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

FlipFlick-FE (๋ณธ README๋Š” ์•„์ง ์™„์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค)

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

FlipFlick-FE๋Š” React + TypeScript ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. Vite๋กœ ๊ตฌ์„ฑ๋œ ๋น ๋ฅธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์œ„์— ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ, ์œ ์—ฐํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ๊ตฌ์กฐ๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.

ํŒ€์› ๊ฐ€์ด๋“œ

  1. ์ด README ์ „์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ํ›‘์–ด๋ณด์„ธ์š”.
  2. src/App.tsx์—์„œ ์ „์ฒด ๊ตฌ์กฐ ํ™•์ธ - router/index.tsx์—์„œ ๋ผ์šฐํŒ… ํ๋ฆ„ ์ดํ•ด
  3. pages/ - components/ - services/ ์ˆœ์œผ๋กœ ๊ธฐ๋Šฅ ํ๋ฆ„ ๋”ฐ๋ผ๊ฐ€๊ธฐ
  4. ์ „์—ญ ์Šคํƒ€์ผ(styles/)๊ณผ ์ „์—ญ ์ƒํƒœ(context/)๋Š” ๊ตฌ์กฐ ํŒŒ์•… ํ›„ ์ฐธ์กฐ
  5. ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ผ์ธ - ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ (๊ถŒ์žฅ) โญ ํ•„๋… โญ

๊ธฐ์ˆ  ์Šคํƒ

ํ•ต์‹ฌ ๊ธฐ์ˆ 

  • 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)
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

๊ธฐ์—ฌ ๋ฐฉ๋ฒ•

  1. ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ๋Šฅ ์š”์ฒญ ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒ์„ฑํ•œ ์ด์Šˆ ์ข…๋ฅ˜์™€ ์ด์Šˆ ๋ฒˆํ˜ธ๋กœ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
  3. ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค: Conventional Commits์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  4. ๋ธŒ๋žœ์น˜๋ฅผ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค: git push origin feature/amazing-feature
  5. 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 ์ ๊ทน ์‚ฌ์šฉ
  • ๋ฐ˜๋ณต ๊ตฌ์กฐ๋Š” ์ œ๋„ค๋ฆญ ์œ ํ‹ธ ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฆฌ

API ์š”์ฒญ ๊ตฌ์กฐ (์„œ๋น„์Šค or component ๋‚ด๋ถ€)

// 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 ์ปดํฌ๋„ŒํŠธ

๊ธฐ๋Šฅ์ถ”๊ฐ€/๋ฆฌํŒฉํ† ๋ง/๋ฒ„๊ทธํ”ฝ์Šค ์‹œ ํŒŒ์ผ ์œ„์น˜ ํŒ๋‹จ ๊ธฐ์ค€

1. ์žฌ์‚ฌ์šฉ ๋ชฉ์  ์—ฌ๋ถ€

  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉด common ๋˜๋Š” hooks, ๋„๋ฉ”์ธ ํŠนํ™”๋ฉด feature๋กœ
  • (ui, hooks, ๋“ฑ)

2. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

  • API ๋กœ์ง์€ services์ „์—ญ ์ƒํƒœ ๋กœ์ง์€ context, UI ๋กœ์ง์€ components๋กœ ๋ถ„๋ฆฌ
  • ํŽ˜์ด์ง€ ๋‹จ์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” pages, ui ์ปดํฌ๋„ŒํŠธ๋Š” components๋กœ ๋ถ„๋ฆฌ
  • ํ˜น์€, components/feature/{๊ธฐ๋Šฅ/๋„๋ฉ”์ธ ์ด๋ฆ„}/, page/{๊ธฐ๋Šฅ/๋„๋ฉ”์ธ ์ด๋ฆ„} ์— ์ž‘์„ฑ

3. ๋ผ์šฐํŠธ ๋‹จ์œ„ or ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„

  • ๋ผ์šฐํŒ… UI๋ฉด pages, ์กฐ๋ฆฝ UI๋ฉด components

4. ์ •์  vs ๋™์  ์ž์‚ฐ

  • .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์— ์ž‘์„ฑํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋žœ๋”๋ง ๋ฐ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
    • (์ž๋™ ๋ฌธ์„œํ™” ๋ฐ ํ…Œ์ŠคํŠธ ์šฉ์ด)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages