μ€μκ° ν΄μ¦ νλ«νΌ β νΈμ€νΈκ° ν΄μ¦λ₯Ό λ§λ€κ³ , μ°Έκ°μκ° PINμΌλ‘ μ μ₯ν΄ μ€μκ°μΌλ‘ μ°Έμ¬ν©λλ€.
| μν | νλ‘μ° |
|---|---|
| νΈμ€νΈ | ν΄μ¦ μμ± β μΈμ κ°μ€ β μ§ν β κ²°κ³Ό νμΈ |
| μ°Έκ°μ | PIN μ λ ₯ β λλ€μ λ±λ‘ β μ€μκ° ν΄μ¦ μ°Έμ¬ β μμ νμΈ |
| μμ | κΈ°μ |
|---|---|
| νλ μμν¬ | Next.js 16 (App Router) |
| μΈμ΄ | TypeScript 5 (strict) |
| μ€νμΌ | Tailwind CSS 4 |
| μλ² μν | TanStack Query v5 |
| ν΄λΌμ΄μΈνΈ μν | Zustand 5 |
| HTTP ν΄λΌμ΄μΈνΈ | Axios |
| μ€μκ° ν΅μ | STOMP over WebSocket (@stomp/stompjs + SockJS fallback) |
| ν¨ν€μ§ λ§€λμ | pnpm |
| λ°νμ | React 19 |
src/
βββ app/ # Next.js App Router (pages, layouts)
β βββ layout.tsx
β βββ providers.tsx # QueryClientProvider λ± μ μ Provider
β βββ page.tsx
β
βββ shared/ # νλ‘μ νΈ μ λ°μμ 곡μ λλ κΈ°λ°
β βββ api/
β β βββ client.ts # Axios μΈμ€ν΄μ€ + μΈν°μ
ν°
β β βββ error.ts # μλ¬ μ²λ¦¬ μ νΈ
β βββ types/
β β βββ api.ts # λͺ¨λ API νμ
μ μ
β βββ constants/
β βββ env.ts # νκ²½λ³μ μμ
β
βββ features/ # λλ©μΈλ³ κΈ°λ₯
βββ auth/ # λ‘κ·ΈμΈ / νμκ°μ
βββ quizzes/ # ν΄μ¦ CRUD
βββ sessions/ # μΈμ
κ°μ€ λ° μ§ν
βββ participants/ # μ°Έκ°μ μ
μ₯ λ° νλ‘μ°
βββ leaderboard/ # μ€μκ° μμ
βββ ai/ # AI ν΄μ¦ μμ±
# ν¨ν€μ§ μ€μΉ
pnpm install
# κ°λ° μλ² μ€ν (localhost:3000)
pnpm dev
# νλ‘λμ
λΉλ
pnpm build
# νμ
체ν¬
pnpm tsc --noEmit
# Lint
pnpm lintmain # νλ‘λμ
λΈλμΉ
feat/<feature> # κΈ°λ₯ κ°λ°
fix/<issue> # λ²κ·Έ μμ
chore/<task> # μ€μ , μμ‘΄μ± λ±
refactor/<area> # 리ν©ν λ§
Conventional Commits κ·μΉμ λ°λ¦ λλ€.
feat(scope): κΈ°λ₯ μΆκ°
fix(scope): λ²κ·Έ μμ
chore(scope): λΉλ/μ€μ /μμ‘΄μ±
refactor(scope): 리ν©ν λ§
docs(scope): λ¬Έμ
style(scope): ν¬λ§·
test(scope): ν
μ€νΈ