DND 14κΈ° 3ν νλ‘ νΈμλ νλ‘μ νΈ (TypeScript κΈ°λ°)
- React 18.3.1 - UI λΌμ΄λΈλ¬λ¦¬
- TypeScript 5.9.3 - νμ μμ μ±
- Vite 7.2.4 - λΉλ λꡬ
- Zustand 5.0.10 - μ μ μν κ΄λ¦¬
- TanStack React Query 5.90.20 - μλ² μν κ΄λ¦¬
- Tailwind CSS 4.1.18 - μ νΈλ¦¬ν° CSS νλ μμν¬
- Zod 3.25.76 - λ°νμ νμ κ²μ¦
- Vitest 4.0.18 - μ λ ν μ€νΈ
- React Testing Library 16.3.2 - μ»΄ν¬λνΈ ν μ€νΈ
- Playwright 1.58.0 - E2E ν μ€νΈ
- react-kakao-maps-sdk 1.2.0 - μΉ΄μΉ΄μ€λ§΅ API
- ESLint - μ½λ λ¦°ν
- Prettier 3.8.1 - μ½λ ν¬λ§·ν
- EditorConfig - μλν° μ€μ ν΅μΌ
npm install# κ°λ° μλ² μμ (ν« λ¦¬λ‘λ μ§μ)
npm run dev
# β http://localhost:5173 μμ κ°λ° μλ² μ€ν
# β νμΌ λ³κ²½ μ μλμΌλ‘ λΈλΌμ°μ μλ‘κ³ μΉ¨# νλ‘λμ
λΉλ (μ΅μ νλ λ²λ€ μμ±)
npm run build
# β dist/ ν΄λμ λΉλ κ²°κ³Όλ¬Ό μμ±
# β μμΆ, μ΅μ ν, νΈλ¦¬μμ΄νΉ μ μ©
# λΉλ κ²°κ³Ό 미리보기
npm run preview
# β νλ‘λμ
λΉλλ₯Ό λ‘컬μμ ν
μ€νΈ
# β μ€μ λ°°ν¬ νκ²½κ³Ό λμΌν λ°©μμΌλ‘ μ€ν# ESLintλ‘ μ½λ κ²μ¬
npm run lint
# β JavaScript/TypeScript μ½λ μ€νμΌ λ° μ μ¬μ μ€λ₯ κ²μ¬
# β eslint.config.js κ·μΉ μ μ©
# Prettierλ‘ μ½λ μλ ν¬λ§·ν
npm run format
# β src/ ν΄λμ λͺ¨λ μ½λ νμΌ μλ μ 리
# β .prettierrc μ€μ μ λ°λΌ ν¬λ§·ν
# Prettier ν¬λ§·ν
κ²μ¬ (CI/CDμ©)
npm run format:check
# β ν¬λ§·ν
μ΄ μ¬λ°λ₯Έμ§ κ²μ¬λ§ μν (μμ νμ§ μμ)
# β CI νμ΄νλΌμΈμμ μ¬μ©# ν
μ€νΈ Watch λͺ¨λ (κ°λ° μ€ μ¬μ©)
npm run test
# β νμΌ λ³κ²½ μ κ΄λ ¨ ν
μ€νΈ μλ μ¬μ€ν
# β μΈν°λν°λΈ CLI μ 곡
# ν
μ€νΈ UI λͺ¨λ
npm run test:ui
# β λΈλΌμ°μ μμ ν
μ€νΈ κ²°κ³Ό μκ°ν
# β κ° ν
μ€νΈ μμΈ μ 보 νμΈ κ°λ₯
# ν
μ€νΈ ν λ²λ§ μ€ν (CI/CDμ©)
npm run test:run
# β Watch λͺ¨λ μμ΄ λͺ¨λ ν
μ€νΈ 1ν μ€ν
# β λΉλ νμ΄νλΌμΈμμ μ¬μ©
# ν
μ€νΈ 컀λ²λ¦¬μ§ 리ν¬νΈ μμ±
npm run test:coverage
# β coverage/ ν΄λμ HTML 리ν¬νΈ μμ±
# β μ½λ 컀λ²λ¦¬μ§ νμΈ κ°λ₯# E2E ν
μ€νΈ μ€ν (ν€λλ¦¬μ€ λͺ¨λ)
npm run test:e2e
# β λͺ¨λ λΈλΌμ°μ μμ E2E ν
μ€νΈ μ€ν
# β CI νκ²½μμ μ¬μ©νκΈ° μ’μ
# Playwright UI λͺ¨λ
npm run test:e2e:ui
# β ν
μ€νΈλ₯Ό λ¨κ³λ³λ‘ νμΈνκ³ λλ²κΉ
# β νμ νΈλλΈ κΈ°λ₯μΌλ‘ κ° λ¨κ³ μ¬μ κ°λ₯
# λΈλΌμ°μ νμ λͺ¨λ (ν€λν)
npm run test:e2e:headed
# β μ€μ λΈλΌμ°μ λ₯Ό λμμ ν
μ€νΈ μ€ν
# β ν
μ€νΈ κ³Όμ μ λμΌλ‘ νμΈ κ°λ₯νμΌλͺ , import μμ λ± νλ‘μ νΈ μ»¨λ²€μ μ νλ‘ νΈμλ_μ½λ© 컨벀μ λ₯Ό μ°Έκ³ νμΈμ.
βββ src/
β βββ components/ # μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈ
β β βββ shared/ # κ³΅ν΅ μ»΄ν¬λνΈ (Button, Input λ±)
β β βββ layout/ # λ μ΄μμ μ»΄ν¬λνΈ (Header, Footer λ±)
β β βββ domain/ # λλ©μΈλ³ μ»΄ν¬λνΈ
β βββ hooks/ # 컀μ€ν
React ν
β βββ constants/ # μμ (λλ©μΈλ³: on-board/intro λ±)
β βββ api/ # API ν΅μ ν¨μ (μμ API νΈμΆ)
β βββ queries/ # React Query ν
& Query Key κ΄λ¦¬
β βββ services/ # λΉμ¦λμ€ λ‘μ§
β βββ lib/ # μμ μ νΈλ¦¬ν° ν¨μ
β βββ store/ # Zustand μ μ μν κ΄λ¦¬
β βββ pages/ # λΌμ°νΈλ³ νμ΄μ§ μ»΄ν¬λνΈ
β βββ router/ # React Router μ€μ
β β βββ guards/ # λΌμ°νΈ κ°λ
β βββ types/ # TypeScript νμ
μ μ
β βββ assets/ # μ΄λ―Έμ§, μμ΄μ½ λ± μ μ 리μμ€
β βββ test/ # ν
μ€νΈ μ νΈλ¦¬ν°
β β βββ setup.ts # Vitest μ€μ
β βββ App.tsx # λ©μΈ μ± μ»΄ν¬λνΈ
β βββ main.tsx # μνΈλ¦¬ ν¬μΈνΈ
β βββ index.css # μ μ μ€νμΌ
β βββ vite-env.d.ts # Vite νμ
μ μ
βββ e2e/ # Playwright E2E ν
μ€νΈ
βββ public/ # μ μ νμΌ (favicon λ±)
βββ vite.config.ts # Vite μ€μ
βββ vitest.config.ts # Vitest μ€μ
βββ playwright.config.ts # Playwright μ€μ
βββ tsconfig.json # TypeScript λ©μΈ μ€μ
βββ tsconfig.app.json # μ± μ½λ TypeScript μ€μ
βββ tsconfig.node.json # λΉλ λꡬ TypeScript μ€μ
βββ eslint.config.js # ESLint μ€μ
βββ .prettierrc # Prettier μ€μ
βββ .editorconfig # EditorConfig μ€μ
βββ .coderabbit.yaml # CodeRabbit AI 리뷰 μ€μ
βββ .env.example # νκ²½ λ³μ μμ
βββ README.md # νλ‘μ νΈ λ¬Έμ
TypeScriptμ Viteμμ λ€μ κ²½λ‘ λ³μΉμ μ¬μ©ν μ μμ΅λλ€:
import { User } from "@/types/user";
import { formatDate } from "@/lib/format";
import { userApi } from "@/api/user.api";// νμ κ³μΈ΅ (λ
립μ )
import type { User } from "@/types";
import { formatDate } from "@/lib/format";
import { INTRO_STEPS } from "@/constants/on-board";
// μ€κ° κ³μΈ΅
import { userApi } from "@/api/user.api";
import { userService } from "@/services/user.service";
import { useAuthStore } from "@/store/auth.store";
// μμ κ³μΈ΅
import { useAuth } from "@/hooks/useAuth";
import { useUser } from "@/queries/user.query";
// UI κ³μΈ΅
import Button from "@/components/common/Button";
import HomePage from "@/pages/Home/HomePage";
import { ROUTES } from "@/router/routes";
// μ μ 리μμ€
import logo from "@/assets/logo.png";
import logo2 from "@assets/logo.png"; // μΆμ½νλ κ°λ₯
import icon from "@public/icon.svg";μμ‘΄μ± κ³μΈ΅ μμλλ‘ μλ μ λ ¬λ©λλ€:
- React ν΅μ¬ β 2. μΈλΆ λΌμ΄λΈλ¬λ¦¬ β 3. types β 4. lib β 5. api β 6. services β 7. store β 8. hooks β 9. queries β 10. components β 11. pages β 12. router β 13. assets
Playwright λΈλΌμ°μ λ₯Ό μ²μ μ¬μ©νλ κ²½μ° μ€μΉκ° νμν©λλ€:
npx playwright installμ΄ νλ‘μ νΈλ CodeRabbitμ μ¬μ©νμ¬ PRμ λν μλ μ½λ 리뷰λ₯Ό μ 곡ν©λλ€.
리뷰 μ€μ μ .coderabbit.yamlμμ νμΈν μ μμ΅λλ€.
MIT