κΈΈκ³ μμ΄ μΌμ΄ν μ΄μ»€λ€μ μν μ’ ν© λλ΄ μΌμ§ μλΉμ€μ νλ‘ νΈμλ λ ν¬μ§ν 리
π μλΉμ€ μ 체 μκ°: Meow.zip organization README.md μ°Έκ³
- Framework: Next.js 14 (App Router)
- Language: TypeScript
- Styling: TailwindCSS + shadcn/ui
- State Management: Jotai
- Data Fetching: TanStack Query (React Query)
- Authentication: NextAuth.js
- Package Manager: pnpm
- Code Quality: Prettier, ESLint
src/
βββ app/ # Next.js App Router
β βββ @modal/ # λͺ¨λ¬ μΈν°μ
ν
λΌμ°νΈ
β βββ api/ # API λΌμ°νΈ νΈλ€λ¬
β βββ community/ # /community
β β βββ page.tsx
β βββ profile/ # /profile
β β βββ [id]/
β β βββ page.tsx # /profile/[id]
β βββ zip/ # /zip
β βββ layout.tsx # λ£¨νΈ λ μ΄μμ
β βββ page.tsx #
β βββ loading.tsx # μ μ λ‘λ© UI
β βββ error.tsx # μ μ μλ¬ UI
βββ components/ # μ¬μ¬μ© μ»΄ν¬λνΈ
β βββ ui/ # κΈ°λ³Έ UI μ»΄ν¬λνΈ (shadcn/ui)
β βββ common/ # κ³΅ν΅ μ»΄ν¬λνΈ
β βββ [domain]/ # λλ©μΈλ³ μ»΄ν¬λνΈ
βββ hooks/ # 컀μ€ν
ν
βββ services/ # API μλΉμ€ λ μ΄μ΄
βββ store/ # Jotai μ μ μν κ΄λ¦¬
βββ types/ # Types
βββ utils/ # μ νΈλ¦¬ν° ν¨μ
- Node.js: 18.17 μ΄μ
- pnpm: 9.8.0 μ΄μ
# 1. μ μ₯μ ν΄λ‘
git clone https://github.com/meowzip/meowzip-front.git
cd meowzip-front
# 2. μμ‘΄μ± μ€μΉ
pnpm install
# 3. νκ²½ λ³μ μ€μ
cp .env.example .env.local
# .env.local νμΌ νΈμ§ νμ
# 4. κ°λ° μλ² μ€ν
pnpm dev# κ°λ° μλ² μ€ν
pnpm dev
# νλ‘λμ
λΉλ
pnpm build
# νλ‘λμ
μλ² μ€ν
pnpm start
-
λλ ν 리 ꡬ쑰
components/ βββ ui/ # μ¬μ¬μ© κ°λ₯ν κΈ°λ³Έ μ»΄ν¬λνΈ βββ common/ # λλ©μΈ 무κ΄ν κ³΅ν΅ μ»΄ν¬λνΈ βββ [domain]/ # νΉμ λλ©μΈ μ μ© μ»΄ν¬λνΈ -
νμΌλͺ κ·μΉ
- μ»΄ν¬λνΈ:
PascalCase.tsx - ν
:
use(prefix) + camelCase.ts or tsx - μ νΈ:
camelCase.ts - νμ
:
camelCaseType.ts
- μ»΄ν¬λνΈ:
-
μ»΄ν¬λνΈ κ΅¬μ‘°
// νμ μ μ interface ComponentProps { // props νμ } // μ»΄ν¬λνΈ μ μ export default function Component({ ...props }: ComponentProps) { // λ‘μ§ return ( // JSX ); }
- μ μ μν: Jotai atoms (
src/store/) - μλ² μν: TanStack Query (
src/hooks/) - λ‘컬 μν: React useState
// services λ μ΄μ΄ μ¬μ©
import { getUserProfile } from '@/services/profile';
// TanStack Query ν
μ¬μ©
import { useQuery } from '@tanstack/react-query';
const { data, isLoading, error } = useQuery({
queryKey: ['profile', userId],
queryFn: () => getUserProfile(userId)
});-
λΈλμΉ μμ±
git checkout -b feature/your-feature-name
-
μ»€λ° μ»¨λ²€μ
feat: μλ‘μ΄ κΈ°λ₯ μΆκ° fix: λ²κ·Έ μμ docs: λ¬Έμ μμ style: μ½λ ν¬λ§·ν refactor: μ½λ 리ν©ν λ§ test: ν μ€νΈ μΆκ° chore: λΉλ μ 무 μμ