νλ‘μ νΈ μ’ λ£ μ΄ν, κ°μΈ νμ΅ λ° ν¬νΈν΄λ¦¬μ€ μ 리λ₯Ό λͺ©μ μΌλ‘ μ½λ 리ν©ν λ§μ μ§ννμ΅λλ€. νμ¬ default λΈλμΉλ κ°μΈ 리ν©ν λ§ κ²°κ³Όλ₯Ό λ°μν
refactorλΈλμΉμ λλ€.
Coworkersλ ν νμ
μ μν ν μΌ κ΄λ¦¬ μλΉμ€μ
λλ€.
νμλ€κ³Ό ν¨κ» ν μΌ λͺ©λ‘μ μμ±νκ³ , μμ
μ κ΄λ¦¬νλ©°, μ§ν μν©μ μΆμ ν μ μμ΅λλ€.
- π₯ ν κ΄λ¦¬: ν μμ±, λ©€λ² μ΄λ, μν κ΄λ¦¬
- β ν μΌ κ΄λ¦¬: ν μΌ λͺ©λ‘ μμ±, μμ μΆκ°/μμ /μμ
- π μ§νλ₯ μΆμ : μ€μκ° μμ μ§ν μν© λͺ¨λν°λ§
- π¬ μμ κ²μν: νμλ€κ³Ό μν΅ν μ μλ κ²μν
- π± λ°μν λμμΈ: PC-first μ€κ³λ‘ λ°μ€ν¬ν± νκ²½μ μ΅μ ν
- π OAuth λ‘κ·ΈμΈ: μΉ΄μΉ΄μ€ κ°νΈ λ‘κ·ΈμΈ μ§μ
- π μ±λ₯ λͺ¨λν°λ§: Vercel Analytics λ° Speed Insights μ μ©
- CSS νλ μμν¬: Tailwind CSS 4
- μ μ μν κ΄λ¦¬: Zustand
- μλ² μν κ΄λ¦¬: React Query + fetch
- νΌ κ΄λ¦¬: React Hook Form
- μ€ν€λ§ κ²μ¦: Zod
- λ¦°ν°: ESLint 9
- ν¬λ§€ν°: Prettier
- Git Hooks: Husky + lint-staged
- μ»€λ° μ»¨λ²€μ : Commitlint
- AI μ½λ 리뷰: CodeRabbit
- λΆμ: Vercel Analytics
- μ±λ₯ μΆμ : Vercel Speed Insights
- κ΄μ°°μ±: OpenTelemetry (Vercel OTEL)
- μλ²μ¬μ΄λ λ λλ§ μ±λ₯ μΈ‘μ
- API νΈμΆ λ° λ°μ΄ν° νμΉ μΆμ
- μ±λ₯ λ³λͺ© μ§μ μ€μκ° λͺ¨λν°λ§
- 컀μ€ν SpanμΌλ‘ μΈλΆ λμ μΆμ
- μ΄μ κ΄λ¦¬: GitHub Backlog
- AI PR 리뷰: CodeRabbit
- λ μ§ μ ν: React Datepicker
- μμ΄μ½: SVG with SVGR
- μ νΈλ¦¬ν°: clsx (μ‘°κ±΄λΆ ν΄λμ€λͺ )
- λΆμ: PC-first (λ°μ€ν¬ν± μ°μ μ€κ³)
- λ²μ : 1.1.1
- λΌμ΄μΌμ€: Private
coworkers/
βββ .github/ # PR, ISSUE ν
νλ¦Ώ μ€μ
βββ .husky/ # husky λΌμ΄λΈλ¬λ¦¬ μ€μ
βββ docs/ # λ¬Έμ
β βββ CODE_CONVENTION.md
β βββ OPENTELEMETRY.md
β βββ PROJECT_SETTING.md
βββ public/ # png μ΄λ―Έμ§ ν΄λ
βββ src/
β βββ app/ # Next.js App Router
β β βββ (route)/ # λΌμ°νΈ κ·Έλ£Ή
β β β βββ [teamid]/ # ν νμ΄μ§
β β β βββ addteam/ # ν μμ±
β β β βββ boards/ # μμ κ²μν
β β β βββ jointeam/ # ν μ°Έμ¬
β β β βββ login/ # λ‘κ·ΈμΈ
β β β βββ myhistory/ # λμ νμ€ν 리
β β β βββ mypage/ # λ§μ΄νμ΄μ§
β β β βββ oauth/ # OAuth μ½λ°±
β β β βββ reset-password/ # λΉλ°λ²νΈ μ¬μ€μ
β β β βββ signup/ # νμκ°μ
β β β βββ teamlist/ # ν 리μ€νΈ
β β βββ favicon.ico # μμ΄μ½
β β βββ globals.css # μ μ μ€νμΌ
β β βββ layout.tsx # λ£¨νΈ λ μ΄μμ (SEO λ©νλ°μ΄ν°)
β β βββ opengraph-image.png # opengraph μ΄λ―Έμ§
β β βββ page.tsx # λ©μΈ νμ΄μ§
β βββ assets/ # svg μμ΄μ½ ν΄λ
β βββ components/ # μ»΄ν¬λνΈ
β β βββ Boards/ # μμ κ²μν νμ΄μ§ μ»΄ν¬λνΈ
β β βββ Common/ # κ³΅ν΅ μ»΄ν¬λνΈ
β β βββ Tasklist/ # Tasklist νμ΄μ§ μ»΄ν¬λνΈ
β β βββ Team/ # ν νμ΄μ§ μ»΄ν¬λνΈ
β βββ constants/ # μμ
β βββ containers/ # 컨ν
μ΄λ (ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈ)
β βββ hooks/ # 컀μ€ν
ν
β βββ lib/ # λΌμ΄λΈλ¬λ¦¬ (API, νμ
λ±)
β βββ mocks/ # Mock λ°μ΄ν°
β βββ store/ # μ μ μν κ΄λ¦¬ (Zustand)
β βββ types/ # TypeScript νμ
β βββ utils/ # μ νΈλ¦¬ν° ν¨μ
β βββ instrumentation.ts # OpenTelemetry μ§μ
μ
β βββ instrumentation.node.ts # OpenTelemetry Node.js μ€μ
β βββ proxy.ts # κ°λ° μλ² νλ‘μ μ€μ
βββ .coderabbit.yaml # coderabbit AI PR 리뷰 μ μ©
βββ .commitlintrc.json # μ»€λ° λ©μμ§ μ»¨λ²€μ
μ€μ
βββ .gitignore # Git 무μ νμΌ λͺ©λ‘
βββ .prettierignore # Prettier 무μ νμΌ λͺ©λ‘
βββ .prettierrc.json # Prettier ν¬λ§€ν° μ€μ
βββ eslint.config.mjs # ESLint λ¦°ν° μ€μ
βββ next.config.ts # Next.js μ€μ
βββ package-lock.json # ν¨ν€μ§ μ κΈ νμΌ
βββ package.json # νλ‘μ νΈ μμ‘΄μ± λ° μ€ν¬λ¦½νΈ
βββ postcss.config.mjs # PostCSS μ€μ
βββ README.md # νλ‘μ νΈ μ€λͺ
λ¬Έμ
βββ tsconfig.json # TypeScript μ»΄νμΌλ¬ μ€μ
- Node.js 20 μ΄μ
- npm λλ yarn
# μμ‘΄μ± μ€μΉ
npm install
# κ°λ° μλ² μ€ν
npm run dev
# νλ‘λμ
λΉλ
npm run build
# νλ‘λμ
μλ² μ€ν
npm startνλ‘μ νΈ λ£¨νΈμ .env.local νμΌμ μμ±νκ³ νμν νκ²½ λ³μλ₯Ό μ€μ νμΈμ:
NEXT_PUBLIC_APP_URL=your-app-url
NEXT_PUBLIC_BASE_URL=your-api-base-url
# μΆκ° νκ²½ λ³μ...# ESLint κ²μ¬
npm run lint
# ESLint μλ μμ
npm run lint:fix
# Prettier κ²μ¬
npm run format:check
# Prettier μλ ν¬λ§·ν
npm run formatνλ‘μ νΈλ Conventional Commits κ·μΉμ λ°λ¦ λλ€.
feat: μλ‘μ΄ κΈ°λ₯ μΆκ°
fix: λ²κ·Έ μμ
docs: λ¬Έμ μμ
style: μ½λ ν¬λ§·ν
, μΈλ―Έμ½λ‘ λλ½ λ±
refactor: μ½λ 리ν©ν λ§
test: ν
μ€νΈ μ½λ μΆκ°
chore: λΉλ μ
무, ν¨ν€μ§ λ§€λμ μμ λ±Huskyκ° μλμΌλ‘ μ»€λ° λ©μμ§λ₯Ό κ²μ¦νκ³ , lint-stagedκ° λ³κ²½λ νμΌμ λν΄ λ¦°ν κ³Ό ν¬λ§·ν μ μ€νν©λλ€.
μ΄ νλ‘μ νΈλ OpenTelemetryλ₯Ό ν΅ν΄ μλ²μ¬μ΄λ λ λλ§ μ±λ₯κ³Ό API νΈμΆμ μΆμ ν©λλ€.
- π νμ΄μ§ λ λλ§ μ±λ₯: κ° νμ΄μ§μ μλ² λ λλ§ μκ° μΈ‘μ
- π API νΈμΆ μΆμ : μΈλΆ API νΈμΆ μκ° λ° μ±λ₯ λΆμ
- π λ°μ΄ν° νμΉ: Next.js fetch μμ² μλ μΆμ
- β‘ λ³λͺ© μ§μ νμ : μ±λ₯ μ ν κ΅¬κ° μ€μκ° λͺ¨λν°λ§
import { trace } from "@opentelemetry/api";
const tracer = trace.getTracer("team-page");
const span = tracer.startSpan("fetch-team-data");
// ... μμ
μν
span.end();Vercel λ°°ν¬ νκ²½μμ μλμΌλ‘ μμ§λλ©°, Vercel Dashboardμ Speed Insights νμμ νμΈν μ μμ΅λλ€.
μμΈν λ΄μ©μ OpenTelemetry μ€μ λ¬Έμλ₯Ό μ°Έκ³ νμΈμ.
μ΄ νλ‘μ νΈλ CodeRabbitμ μ¬μ©νμ¬ PRμ λν μλ AI μ½λ 리뷰λ₯Ό μ 곡ν©λλ€.
.coderabbit.yaml νμΌμμ 리뷰 μ€μ μ νμΈν μ μμ΅λλ€.
This project is private.
Made by codeit-19κΈ°-2team π