Skip to content

TeamKoHong/teamitaka-type

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

183 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

TEAMITAKA ํƒ€์ž… ํ…Œ์ŠคํŠธ

1๋ถ„ ๋งŒ์— ์•Œ์•„๋ณด๋Š” ๋‚˜์˜ ํ˜‘์—… ์Šคํƒ€์ผ โ€” ์žฌ๋ฏธ์žˆ๋Š” ๊ณต์œ ํ˜• ์„ฑํ–ฅ ํ…Œ์ŠคํŠธ

TEAMITAKA ํƒ€์ž… ํ…Œ์ŠคํŠธ

๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

TEAMITAKA ํƒ€์ž… ํ…Œ์ŠคํŠธ๋Š” MBTI์‹ ๊ฐ€๋ฒผ์šด ํ˜‘์—… ์„ฑํ–ฅ ํ…Œ์ŠคํŠธ๋กœ, 15๊ฐœ ์งˆ๋ฌธ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ํŒ€์›Œํฌ ์Šคํƒ€์ผ์„ ๋ถ„์„ํ•˜๊ณ  ๋ฐ”์ด๋Ÿด ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ ์นด๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • โšก 1๋ถ„ ์™„๋ฃŒ: 15๋ฌธํ•ญ์œผ๋กœ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ
  • ๐ŸŽจ ๊ฒฐ๊ณผ ์นด๋“œ: ๋ผ์ดํŠธ/๋‹คํฌ ํ…Œ๋งˆ ์ง€์›ํ•˜๋Š” ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ์นด๋“œ
  • ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”: ๋ฐ˜์‘ํ˜• ๋””์ž์ธ๊ณผ ํ„ฐ์น˜ ์นœํ™”์  UX
  • โ™ฟ ์ ‘๊ทผ์„ฑ ์ง€์›: ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜, ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ง€์›
  • ๐Ÿ”’ ๊ฐœ์ธ์ •๋ณด ์•ˆ์ „: ๊ฐœ์ธ์ •๋ณด ์ˆ˜์ง‘ ์—†๋Š” ๋กœ์ปฌ ์ฒ˜๋ฆฌ

ํ•ต์‹ฌ KPI

  1. ์™„๋ฃŒ์œจ: ํ€ด์ฆˆ ์‹œ์ž‘ โ†’ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ๋„๋‹ฌ
  2. ์นด๋“œ ์ €์žฅ๋ฅ : ๊ฒฐ๊ณผ ์นด๋“œ ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ
  3. ๊ณต์œ  ํด๋ฆญ๋ฅ : ์นด๋“œ ๊ณต์œ /๋งํฌ ๋ณต์‚ฌ

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

  • Framework: Next.js 15 (App Router)
  • Language: TypeScript
  • Styling: Tailwind CSS
  • Testing: Vitest (Unit), Playwright (E2E)
  • Image Capture: html2canvas
  • Deployment: Vercel (๊ถŒ์žฅ)

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

teamitaka-type/
โ”œโ”€โ”€ app/                    # Next.js App Router
โ”‚   โ”œโ”€โ”€ layout.tsx         # ๊ธ€๋กœ๋ฒŒ ๋ ˆ์ด์•„์›ƒ
โ”‚   โ”œโ”€โ”€ page.tsx           # ์ธํŠธ๋กœ ํŽ˜์ด์ง€ (/)
โ”‚   โ”œโ”€โ”€ quiz/
โ”‚   โ”‚   โ””โ”€โ”€ page.tsx       # ํ€ด์ฆˆ ์ง„ํ–‰ (/quiz)
โ”‚   โ””โ”€โ”€ result/[type]/
โ”‚       โ””โ”€โ”€ page.tsx       # ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ (/result/[type])
โ”œโ”€โ”€ components/            # React ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ ProgressBar.tsx
โ”‚   โ”œโ”€โ”€ QuestionCard.tsx
โ”‚   โ”œโ”€โ”€ ChoiceButton.tsx
โ”‚   โ”œโ”€โ”€ ResultCard.tsx     # ์บก์ณ์šฉ ๊ฒฐ๊ณผ ์นด๋“œ
โ”‚   โ””โ”€โ”€ ShareBar.tsx       # ๊ณต์œ /์ €์žฅ ์•ก์…˜๋ฐ”
โ”œโ”€โ”€ lib/                   # ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
โ”‚   โ”œโ”€โ”€ questions.ts       # 15๋ฌธํ•ญ ๋ฐ์ดํ„ฐ
โ”‚   โ”œโ”€โ”€ scoring.ts         # MBTI ์Šค์ฝ”์–ด๋ง ๋กœ์ง
โ”‚   โ”œโ”€โ”€ types.ts          # 16๊ฐœ ํƒ€์ž… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
โ”‚   โ”œโ”€โ”€ theme.ts          # ๋””์ž์ธ ํ† ํฐ
โ”‚   โ””โ”€โ”€ og.ts             # OG ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
โ”œโ”€โ”€ public/
โ”‚   โ””โ”€โ”€ og/               # OG ์ด๋ฏธ์ง€
โ””โ”€โ”€ e2e/                  # E2E ํ…Œ์ŠคํŠธ

๐Ÿš€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

1. ์ €์žฅ์†Œ ํด๋ก  ๋ฐ ์˜์กด์„ฑ ์„ค์น˜

git clone https://github.com/your-org/teamitaka-type.git
cd teamitaka-type

# ํŒจํ‚ค์ง€ ์„ค์น˜
npm install

# ๋˜๋Š” yarn
yarn install

2. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

npm run dev

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:3000์œผ๋กœ ์ ‘์†

3. ํ…Œ์ŠคํŠธ ์‹คํ–‰

# ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
npm run test

# ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (watch ๋ชจ๋“œ)
npm run test:watch

# E2E ํ…Œ์ŠคํŠธ
npm run test:e2e

# ํƒ€์ž… ์ฒดํฌ
npm run type-check

๐Ÿ— ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ

๋กœ์ปฌ ๋นŒ๋“œ

# ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
npm run build

# ๋นŒ๋“œ ๊ฒฐ๊ณผ ์‹คํ–‰
npm run start

Vercel ๋ฐฐํฌ

  1. Vercel ํ”„๋กœ์ ํŠธ ์—ฐ๊ฒฐ

    npm install -g vercel
    vercel login
    vercel --prod
  2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (ํ•„์š”์‹œ)

    • Vercel ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ •
    • Analytics, SEO ๋„๊ตฌ ์—ฐ๋™
  3. ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ

    # type.teamitaka.com CNAME ์„ค์ •
    vercel domains add type.teamitaka.com

๊ธฐํƒ€ ํ”Œ๋žซํผ ๋ฐฐํฌ

Netlify

npm run build
# dist ํด๋”๋ฅผ Netlify์— ์—…๋กœ๋“œ

AWS S3 + CloudFront

npm run build
aws s3 sync out/ s3://your-bucket --delete

๐Ÿ”ง ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

์งˆ๋ฌธ ์ˆ˜์ •

lib/questions.ts์—์„œ ์งˆ๋ฌธ ํ…์ŠคํŠธ์™€ ๊ฐ€์ค‘์น˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

export const questions: Question[] = [
  {
    id: 1,
    text: "์ƒˆ๋กœ์šด ์งˆ๋ฌธ ๋‚ด์šฉ",
    choices: ["์˜ˆ", "์•„๋‹ˆ์˜ค"]
  },
  // ...
];

ํƒ€์ž… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ˆ˜์ •

lib/types.ts์—์„œ ๊ฐ MBTI ํƒ€์ž…์˜ ์„ค๋ช…, ๊ฐ•์ , ํŒ์„ ์ˆ˜์ •:

export const TYPE_METADATA: Record<string, TypeMeta> = {
  ENFP: {
    nickname: '์—ด์ •ํ‹ฐ๋ฏธ',
    oneLiner: '๋„˜์น˜๋Š” ์—๋„ˆ์ง€๋กœ ํŒ€์„ ์ด๋„๋Š” ์•„์ด๋””์–ด ๋ฐœ์ „์†Œ',
    description: '์ฐฝ์˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•˜๊ณ ...',
    strengths: ['์ฐฝ์˜์  ์•„์ด๋””์–ด ๋ฐœ๊ตด', 'ํŒ€ ๋™๊ธฐ๋ถ€์—ฌ', '์œ ์—ฐํ•œ ์‚ฌ๊ณ '],
    bestMatches: ['์ฒด๊ณ„ํ‹ฐ๋ฏธ (INTJ)', '์‹คํ–‰ํ‹ฐ๋ฏธ (ESTJ)'],
    tips: ['๊ตฌ์ฒด์ ์ธ ์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝํ•˜๊ธฐ', '...']
  }
};

์Šคํƒ€์ผ๋ง ํ…Œ๋งˆ

lib/theme.ts์™€ tailwind.config.js์—์„œ ์ƒ‰์ƒ, ํฐํŠธ, ๊ฐ„๊ฒฉ ๋“ฑ์„ ์กฐ์ •:

export const theme = {
  colors: {
    primary: '#F76241',  // TEAMITAKA ์˜ค๋ Œ์ง€
    // ...
  }
};

๊ฐ€์ค‘์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

lib/scoring.ts์˜ SCORING_WEIGHTS์—์„œ ๊ฐ ์งˆ๋ฌธ์˜ ์˜ํ–ฅ๋„ ์กฐ์ •:

export const SCORING_WEIGHTS = {
  EI: {
    1: { axis: 'E', weight: 1.0 },  // ๊ฐ€์ค‘์น˜ ์กฐ์ • ๊ฐ€๋Šฅ
  }
};

๐Ÿ“Š ๋ถ„์„ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

Plausible Analytics ์—ฐ๋™

// app/layout.tsx์— ์ถ”๊ฐ€
<script defer data-domain="type.teamitaka.com" src="https://plausible.io/js/script.js"></script>

์ฃผ์š” ์ถ”์  ์ด๋ฒคํŠธ

  • Test Started: ํ…Œ์ŠคํŠธ ์‹œ์ž‘
  • Quiz Completed: ํ€ด์ฆˆ ์™„๋ฃŒ
  • Result Generated: ๊ฒฐ๊ณผ ์ƒ์„ฑ (ํƒ€์ž…๋ณ„)
  • Result Viewed: ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ์กฐํšŒ
  • Card Saved: ์นด๋“œ ์ด๋ฏธ์ง€ ์ €์žฅ
  • Card Shared: ์นด๋“œ ๊ณต์œ 
  • Retest Started: ์žฌํ…Œ์ŠคํŠธ

Google Analytics 4 ์—ฐ๋™

// gtag ์„ค์ • ๋ฐ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ์ „์†ก
gtag('event', 'quiz_completed', {
  custom_parameter: 'value'
});

โ™ฟ ์ ‘๊ทผ์„ฑ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

โœ… ์™„๋ฃŒ๋œ ์ ‘๊ทผ์„ฑ ๊ธฐ๋Šฅ

  • ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜: ๋ชจ๋“  ์ธํ„ฐ๋ž™์…˜ ์š”์†Œ Tab/Enter ์ง€์›
  • ํ„ฐ์น˜ ๋Œ€์ƒ: ์ตœ์†Œ 44pxร—44px ํ„ฐ์น˜ ์˜์—ญ
  • ์ƒ‰์ƒ ๋Œ€๋น„: WCAG AA ๊ธฐ์ค€ 4.5:1 ์ด์ƒ
  • ํฌ์ปค์Šค ํ‘œ์‹œ: ๋ช…ํ™•ํ•œ ํฌ์ปค์Šค ๋ง ํ‘œ์‹œ
  • ์Šคํฌ๋ฆฐ ๋ฆฌ๋”: semantic HTML๊ณผ ARIA ๋ ˆ์ด๋ธ”
  • ๋Œ€์ฒด ํ…์ŠคํŠธ: ์˜๋ฏธ์žˆ๋Š” ์ด๋ฏธ์ง€ alt ์†์„ฑ
  • ํ…์ŠคํŠธ ํฌ๊ธฐ: ๋ธŒ๋ผ์šฐ์ € ํ™•๋Œ€/์ถ•์†Œ ์ง€์›

๐Ÿ”„ ๊ฐœ์„  ์˜ˆ์ • ์‚ฌํ•ญ

  • ๊ณ ๋Œ€๋น„ ๋ชจ๋“œ ์ง€์›
  • ๋ชจ์…˜ ๊ฐ์†Œ ์˜ต์…˜ (prefers-reduced-motion)
  • ๋‹ค๊ตญ์–ด ์ง€์› (์˜์–ด, ์ผ๋ณธ์–ด)
  • ์Œ์„ฑ ์•ˆ๋‚ด ๊ธฐ๋Šฅ

๐Ÿ“ฑ ๋ฐ˜์‘ํ˜• ๋””์ž์ธ

๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ

  • Mobile: 360px - 430px (๊ธฐ๋ณธ ์ตœ์ ํ™”)
  • Tablet: 431px - 768px (์ค‘์•™ ์ •๋ ฌ ์นด๋“œ)
  • Desktop: 769px+ (์ตœ๋Œ€ ๋„ˆ๋น„ ์ œํ•œ)

์ฃผ์š” ๋ฐ˜์‘ํ˜• ์ฒ˜๋ฆฌ

  • ํ€ด์ฆˆ ์นด๋“œ: ๋ชจ๋ฐ”์ผ์—์„œ ์ „์ฒด ๋„ˆ๋น„, ๋ฐ์Šคํฌํ†ฑ์—์„œ ๊ณ ์ • ๋„ˆ๋น„
  • ๊ฒฐ๊ณผ ์นด๋“œ: ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ํŒจ๋”ฉ๊ณผ ํฐํŠธ ํฌ๊ธฐ ์กฐ์ •
  • ๊ณต์œ  ๋ฐ”: ๋ชจ๋ฐ”์ผ์—์„œ ํ•˜๋‹จ ๊ณ ์ •, ๋ฐ์Šคํฌํ†ฑ์—์„œ ์ธ๋ผ์ธ
  • ํ„ฐ์น˜ ์ œ์Šค์ฒ˜: ์Šค์™€์ดํ”„์™€ ํƒญ ์ตœ์ ํ™”

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”

Core Web Vitals ๋ชฉํ‘œ

  • LCP (Largest Contentful Paint): < 2.5s
  • FID (First Input Delay): < 100ms
  • CLS (Cumulative Layout Shift): < 0.1

์ ์šฉ๋œ ์ตœ์ ํ™”

  • ํฐํŠธ ์ตœ์ ํ™”: font-display: swap์œผ๋กœ FOUT ๋ฐฉ์ง€
  • ์ด๋ฏธ์ง€ ์ตœ์ ํ™”: Next.js Image ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
  • ์ฝ”๋“œ ๋ถ„ํ• : ํŽ˜์ด์ง€๋ณ„ ์ž๋™ ์ฝ”๋“œ ๋ถ„ํ• 
  • ์บ์‹ฑ: ์ •์  assets CDN ์บ์‹ฑ
  • ์••์ถ•: Gzip/Brotli ์••์ถ•

๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๋ชฉํ‘œ

  • Initial Bundle: < 150KB (gzipped)
  • Total Bundle: < 500KB (gzipped)
  • ์ด๋ฏธ์ง€ ์บก์ณ: html2canvas ๋™์  ๋กœ๋”ฉ

๐Ÿ”’ ๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ์ •๋ณด

๊ฐœ์ธ์ •๋ณด ์ •์ฑ…

  • ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์—†์Œ: ์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ ๊ฐœ์ธ์ •๋ณด ๋ฏธ์ˆ˜์ง‘
  • ๋กœ์ปฌ ์ฒ˜๋ฆฌ: ๋ชจ๋“  ๋‹ต๋ณ€๊ณผ ๊ฒฐ๊ณผ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์ฒ˜๋ฆฌ
  • ์„ธ์…˜ ๊ด€๋ฆฌ: ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”
  • ์ฟ ํ‚ค ์‚ฌ์šฉ ์•ˆํ•จ: ๋ถ„์„ ๋„๊ตฌ ์ œ์™ธ ์ฟ ํ‚ค ๋ฏธ์‚ฌ์šฉ

๋ณด์•ˆ ํ—ค๋”

// next.config.js
headers: [
  {
    key: 'X-Content-Type-Options',
    value: 'nosniff',
  },
  {
    key: 'X-Frame-Options', 
    value: 'DENY',
  },
  {
    key: 'X-XSS-Protection',
    value: '1; mode=block',
  }
]

๐Ÿ› ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

1. ์ด๋ฏธ์ง€ ์บก์ณ๊ฐ€ ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ

# html2canvas ๊ด€๋ จ ์ด์Šˆ
npm install html2canvas@latest

# ํฐํŠธ ๋กœ๋”ฉ ์™„๋ฃŒ ํ›„ ์บก์ณ๋˜๋„๋ก ์ˆ˜์ •๋จ
await document.fonts.ready;

2. ๋ชจ๋ฐ”์ผ์—์„œ ๊ณต์œ  ๋ฒ„ํŠผ์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ

// Web Share API ์ง€์› ์—ฌ๋ถ€ ํ™•์ธ ํ›„ ํด๋ฐฑ
if (navigator.share && navigator.canShare) {
  await navigator.share(shareData);
} else {
  // ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ ํด๋ฐฑ
  await navigator.clipboard.writeText(url);
}

3. ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ์ง์ ‘ ์ ‘๊ทผ ์‹œ 404

// [type] ๋‹ค์ด๋‚˜๋ฏน ๋ผ์šฐํŒ… ํ™•์ธ
// ์œ ํšจํ•œ MBTI ํƒ€์ž…(16๊ฐ€์ง€)๋งŒ ํ—ˆ์šฉ
if (!TYPE_METADATA[typeCode?.toUpperCase()]) {
  notFound();
}

๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ™œ์šฉ

# Next.js ๋ฒˆ๋“ค ๋ถ„์„
npm run build
npx @next/bundle-analyzer

# ๋ผ์ดํŠธํ•˜์šฐ์Šค ์„ฑ๋Šฅ ์ธก์ •  
npm run build && npm run start
# Chrome DevTools > Lighthouse ์‹คํ–‰

# ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ
npm install -g @axe-core/cli
axe http://localhost:3000

๐Ÿค ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ

๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ

  1. ์ด์Šˆ ์ƒ์„ฑ: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ
  2. ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ: feature/feature-name ๋˜๋Š” fix/bug-name
  3. ๊ฐœ๋ฐœ ์ง„ํ–‰: ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ
  4. ํ…Œ์ŠคํŠธ ์‹คํ–‰: npm run test && npm run test:e2e
  5. PR ์ƒ์„ฑ: ๋ช…ํ™•ํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ Pull Request
  6. ์ฝ”๋“œ ๋ฆฌ๋ทฐ: ํŒ€ ๋ฆฌ๋ทฐ ํ›„ ๋จธ์ง€

์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
fix: ๋ฒ„๊ทธ ์ˆ˜์ •  
docs: ๋ฌธ์„œ ์ˆ˜์ •
style: ์ฝ”๋“œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
refactor: ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
test: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€/์ˆ˜์ •
chore: ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ณด์กฐ ๋„๊ตฌ ๋ณ€๊ฒฝ

์ฝ”๋”ฉ ์Šคํƒ€์ผ

  • ESLint: Next.js ๊ถŒ์žฅ ์„ค์ • ์‚ฌ์šฉ
  • Prettier: ์ฝ”๋“œ ํฌ๋งทํŒ… ์ž๋™ํ™”
  • TypeScript: ์—„๊ฒฉํ•œ ํƒ€์ž… ์ฒดํฌ ํ™œ์„ฑํ™”
  • ์ ‘๊ทผ์„ฑ: WCAG 2.1 AA ๊ธฐ์ค€ ์ค€์ˆ˜

๐Ÿ“„ ๋ผ์ด์„ ์Šค

MIT License - ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿ“ž ์—ฐ๋ฝ์ฒ˜

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ


Made with โค๏ธ by TEAMITAKA | Website | Blog

Releases

No releases published

Packages

 
 
 

Contributors