Skip to content

k0nghaa/coworkers

Β 
Β 

Repository files navigation

🀝 Coworkers

⚠️ 이 μ €μž₯μ†ŒλŠ” νŒ€ ν”„λ‘œμ νŠΈλ₯Ό 개인 κ³„μ •μœΌλ‘œ forkν•œ μ €μž₯μ†Œμž…λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ μ’…λ£Œ 이후, 개인 ν•™μŠ΅ 및 포트폴리였 정리λ₯Ό λͺ©μ μœΌλ‘œ μ½”λ“œ λ¦¬νŒ©ν† λ§μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ default λΈŒλžœμΉ˜λŠ” 개인 λ¦¬νŒ©ν† λ§ κ²°κ³Όλ₯Ό λ°˜μ˜ν•œ refactor λΈŒλžœμΉ˜μž…λ‹ˆλ‹€.

πŸ“– ν”„λ‘œμ νŠΈ μ†Œκ°œ

CoworkersλŠ” νŒ€ ν˜‘μ—…μ„ μœ„ν•œ ν•  일 관리 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.
νŒ€μ›λ“€κ³Ό ν•¨κ»˜ ν•  일 λͺ©λ‘μ„ μƒμ„±ν•˜κ³ , μž‘μ—…μ„ κ΄€λ¦¬ν•˜λ©°, μ§„ν–‰ 상황을 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.

✨ μ£Όμš” κΈ°λŠ₯

  • πŸ‘₯ νŒ€ 관리: νŒ€ 생성, 멀버 μ΄ˆλŒ€, μ—­ν•  관리
  • βœ… ν•  일 관리: ν•  일 λͺ©λ‘ 생성, μž‘μ—… μΆ”κ°€/μˆ˜μ •/μ‚­μ œ
  • πŸ“Š μ§„ν–‰λ₯  좔적: μ‹€μ‹œκ°„ μž‘μ—… μ§„ν–‰ 상황 λͺ¨λ‹ˆν„°λ§
  • πŸ’¬ μžμœ κ²Œμ‹œνŒ: νŒ€μ›λ“€κ³Ό μ†Œν†΅ν•  수 μžˆλŠ” κ²Œμ‹œνŒ
  • πŸ“± λ°˜μ‘ν˜• λ””μžμΈ: PC-first μ„€κ³„λ‘œ λ°μŠ€ν¬ν†± ν™˜κ²½μ— μ΅œμ ν™”
  • πŸ” OAuth 둜그인: 카카였 κ°„νŽΈ 둜그인 지원
  • πŸ“ˆ μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§: Vercel Analytics 및 Speed Insights 적용

πŸš€ 기술 μŠ€νƒ

Core

Next.js TypeScript React

  • μ–Έμ–΄: TypeScript
  • ν”„λ ˆμž„μ›Œν¬: Next.js 16.1.0 (App Router)
  • 배포: Vercel

μŠ€νƒ€μΌλ§

Tailwind CSS

μƒνƒœ 관리 & 데이터 페칭

  • μ „μ—­ μƒνƒœ 관리: Zustand
  • μ„œλ²„ μƒνƒœ 관리: React Query + fetch

폼 & 검증

μ½”λ“œ ν’ˆμ§ˆ

ESLint Prettier

  • λ¦°ν„°: ESLint 9
  • 포맀터: Prettier
  • Git Hooks: Husky + lint-staged
  • 컀밋 μ»¨λ²€μ…˜: Commitlint
  • AI μ½”λ“œ 리뷰: CodeRabbit

λͺ¨λ‹ˆν„°λ§ & μ„±λŠ₯

Vercel OpenTelemetry

  • 뢄석: Vercel Analytics
  • μ„±λŠ₯ 좔적: Vercel Speed Insights
  • κ΄€μ°°μ„±: OpenTelemetry (Vercel OTEL)
    • μ„œλ²„μ‚¬μ΄λ“œ λ Œλ”λ§ μ„±λŠ₯ μΈ‘μ •
    • API 호좜 및 데이터 페칭 좔적
    • μ„±λŠ₯ 병λͺ© 지점 μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§
    • μ»€μŠ€ν…€ Span으둜 μ„ΈλΆ€ λ™μž‘ 좔적

ν˜‘μ—… 도ꡬ

CodeRabbit

  • 이슈 관리: GitHub Backlog
  • AI PR 리뷰: CodeRabbit

UI μ»΄ν¬λ„ŒνŠΈ

  • λ‚ μ§œ 선택: 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

Git Commit

ν”„λ‘œμ νŠΈλŠ” Conventional Commits κ·œμΉ™μ„ λ”°λ¦…λ‹ˆλ‹€.

feat: μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
fix: 버그 μˆ˜μ •
docs: λ¬Έμ„œ μˆ˜μ •
style: μ½”λ“œ ν¬λ§·νŒ…, μ„Έλ―Έμ½œλ‘  λˆ„λ½ λ“±
refactor: μ½”λ“œ λ¦¬νŒ©ν† λ§
test: ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
chore: λΉŒλ“œ 업무, νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € μˆ˜μ • λ“±

Huskyκ°€ μžλ™μœΌλ‘œ 컀밋 λ©”μ‹œμ§€λ₯Ό κ²€μ¦ν•˜κ³ , lint-stagedκ°€ λ³€κ²½λœ νŒŒμΌμ— λŒ€ν•΄ λ¦°νŒ…κ³Ό ν¬λ§·νŒ…μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.

πŸ“š λ¬Έμ„œ

πŸ“Š OpenTelemetry λͺ¨λ‹ˆν„°λ§

이 ν”„λ‘œμ νŠΈλŠ” OpenTelemetryλ₯Ό 톡해 μ„œλ²„μ‚¬μ΄λ“œ λ Œλ”λ§ μ„±λŠ₯κ³Ό API ν˜ΈμΆœμ„ μΆ”μ ν•©λ‹ˆλ‹€.

μ£Όμš” 좔적 ν•­λͺ©

  • πŸ” νŽ˜μ΄μ§€ λ Œλ”λ§ μ„±λŠ₯: 각 νŽ˜μ΄μ§€μ˜ μ„œλ²„ λ Œλ”λ§ μ‹œκ°„ μΈ‘μ •
  • 🌐 API 호좜 좔적: μ™ΈλΆ€ API 호좜 μ‹œκ°„ 및 μ„±λŠ₯ 뢄석
  • πŸ“ˆ 데이터 페칭: Next.js fetch μš”μ²­ μžλ™ 좔적
  • ⚑ 병λͺ© 지점 νŒŒμ•…: μ„±λŠ₯ μ €ν•˜ ꡬ간 μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§

μ»€μŠ€ν…€ Span μ˜ˆμ‹œ

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 μ„€μ • λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

πŸ€– AI μ½”λ“œ 리뷰

이 ν”„λ‘œμ νŠΈλŠ” CodeRabbit을 μ‚¬μš©ν•˜μ—¬ PR에 λŒ€ν•œ μžλ™ AI μ½”λ“œ 리뷰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
.coderabbit.yaml νŒŒμΌμ—μ„œ 리뷰 섀정을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“„ λΌμ΄μ„ΌμŠ€

This project is private.


Made by codeit-19κΈ°-2team πŸš€

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 97.7%
  • CSS 2.2%
  • Other 0.1%