Skip to content

Latest commit

ย 

History

History
291 lines (224 loc) ยท 7.66 KB

File metadata and controls

291 lines (224 loc) ยท 7.66 KB

๐ŸŽฎ Xingu - ์•„์ด์Šค๋ธŒ๋ ˆ์ดํ‚น ํ”Œ๋žซํผ

์›น ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ์•„์ด์Šค๋ธŒ๋ ˆ์ดํ‚น ํ”Œ๋žซํผ

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

Xingu๋Š” ๋™์•„๋ฆฌ, ์›Œํฌ์ƒต, ํŒ€ ๋นŒ๋”ฉ ๋“ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์›น ๊ธฐ๋ฐ˜ ์•„์ด์Šค๋ธŒ๋ ˆ์ดํ‚น ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

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

  • ๐ŸŒ ์„ค์น˜ ๋ถˆํ•„์š”: ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์‹คํ–‰
  • ๐Ÿ‘ฅ ์—ญํ•  ๋ถ„๋ฆฌ: ํ˜ธ์ŠคํŠธ๋Š” ๊ด€๋ฆฌ, ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฐธ์—ฌ
  • โšก ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”: WebSocket ๊ธฐ๋ฐ˜ ์ฆ‰๊ฐ ๋ฐ˜์‘ (์˜ˆ์ •)
  • ๐ŸŽฎ ๋‹ค์–‘ํ•œ ๊ฒŒ์ž„: ์ดˆ์„ฑ, ๋ฐธ๋Ÿฐ์Šค, ๋ผ์ด์–ด ๋“ฑ 7๊ฐœ ๊ฒŒ์ž„
  • ๐Ÿ“Œ ๊ฒŒ์ž„ ์ €์žฅ ๊ธฐ๋Šฅ: ๋‹ด๊ธฐ/๋ฐ”๋กœ ์‹œ์ž‘ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜ โญ
  • ๐Ÿ”‘ ์นด์นด์˜ค ๋กœ๊ทธ์ธ: ๊ฐ„ํŽธํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ

๊ธฐ์ˆ  ์Šคํƒ

Frontend

  • Framework: Next.js 15 (App Router)
  • Language: TypeScript
  • Styling: Tailwind CSS
  • UI Components: Shadcn UI, Radix UI
  • Authentication: Next-auth v5 + Kakao OAuth
  • Database: Prisma + SQLite (๊ฐœ๋ฐœ), PostgreSQL (ํ”„๋กœ๋•์…˜ ์˜ˆ์ •)

Backend (์˜ˆ์ •)

  • Real-time: Socket.io
  • Cache: Redis

์‹œ์ž‘ํ•˜๊ธฐ

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js 18+
  • npm ๋˜๋Š” yarn

์„ค์น˜

# ์˜์กด์„ฑ ์„ค์น˜
npm install

# Prisma ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ
npx prisma generate

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”
npx prisma db push

# ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
npm run dev

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

.env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์„ธ์š”:

DATABASE_URL="file:./dev.db"
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="your-secret-here"
KAKAO_CLIENT_ID="your-kakao-client-id"
KAKAO_CLIENT_SECRET="your-kakao-client-secret"

๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ http://localhost:3000์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

1. ๋น„ํšŒ์›๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • PIN ์ฝ”๋“œ ์ž…๋ ฅ์œผ๋กœ ์ฆ‰์‹œ ๊ฒŒ์ž„ ์ฐธ์—ฌ
  • ํšŒ์›๊ฐ€์ž… ์—†์ด ๋ฐ”๋กœ ์‹œ์ž‘

2. ๊ฒŒ์ž„ ๋‹ด๊ธฐ & ๋ฐ”๋กœ ์‹œ์ž‘ โญ

  • ๋น„ํšŒ์›: "๋ฐ”๋กœ ์‹œ์ž‘" โ†’ ์ฆ‰์‹œ ๋ฐฉ ์ƒ์„ฑ
  • ๋กœ๊ทธ์ธ ํšŒ์›: "๋‹ด๊ธฐ" โ†’ ๋‚˜์ค‘์— ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์žฌ์‚ฌ์šฉ

3. ๋Œ€์‹œ๋ณด๋“œ

  • ์ €์žฅ๋œ ๊ฒŒ์ž„ ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ
  • ํ•œ ๋ฒˆ ์„ค์ •ํ•œ ๊ฒŒ์ž„์„ ๋ฐ˜๋ณต ์‚ฌ์šฉ
  • ํ…œํ”Œ๋ฆฟ ์ด๋ฆ„ ์ง€์ • (์˜ˆ: "MT์šฉ ์ดˆ์„ฑ๊ฒŒ์ž„")

4. ์นด์นด์˜ค ๋กœ๊ทธ์ธ

  • ๊ฐ„ํŽธํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ
  • ๊ฒŒ์ž„ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ

ํ˜„์žฌ ๊ฐœ๋ฐœ ์ƒํƒœ

โœ… ์™„๋ฃŒ๋œ ๊ธฐ๋Šฅ

  • Next.js 15 ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ •
  • Shadcn UI ์„ค์ • ๋ฐ ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ
  • TypeScript ํƒ€์ž… ์ •์˜
  • ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ (Navbar, Footer)
  • ๋žœ๋”ฉ ํŽ˜์ด์ง€ (PIN ์ž…๋ ฅ)
  • ๊ฒŒ์ž„ ์„ ํƒ ํŽ˜์ด์ง€ (์นด๋“œ, ํ•„ํ„ฐ, ๊ทธ๋ฆฌ๋“œ)
  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์—ฐ๋™ โญ
  • ๊ฒŒ์ž„ ๋‹ด๊ธฐ/๋ฐ”๋กœ ์‹œ์ž‘ ๊ธฐ๋Šฅ โญ
  • ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€ โญ
  • Prisma + SQLite DB ์„ค์ • โญ

๐Ÿšง ์ง„ํ–‰ ์ค‘

  • ๋ฐฉ ์ƒ์„ฑ API
  • ํ˜ธ์ŠคํŠธ ๋Œ€๊ธฐ์‹ค
  • ํ”Œ๋ ˆ์ด์–ด ๋Œ€๊ธฐ์‹ค
  • WebSocket ์„œ๋ฒ„ ๊ตฌํ˜„
  • ๊ฒŒ์ž„ ๋กœ์ง ๊ตฌํ˜„

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒŒ์ž„

  1. ์ดˆ์„ฑ ๊ฒŒ์ž„ โญโญ - ์ œ์‹œ๋œ ์ดˆ์„ฑ์œผ๋กœ ๋‹จ์–ด ๋งž์ถ”๊ธฐ (์ถ”์ฒœ)
  2. ๋ฐธ๋Ÿฐ์Šค ๊ฒŒ์ž„ โญ - A vs B ์–‘์žํƒ์ผ (์ถ”์ฒœ)
  3. ๋žœ๋ค ์งˆ๋ฌธ ๋ฃฐ๋ › โญ - ๋ฃฐ๋ ›์œผ๋กœ ์ž๊ธฐ์†Œ๊ฐœ (์ถ”์ฒœ)
  4. ์Šคํ”ผ๋“œ ํ€ด์ฆˆ โญ - OX ํ€ด์ฆˆ ๋˜๋Š” 4์ง€์„ ๋‹ค
  5. ๋ผ์ด์–ด ๊ฒŒ์ž„ โญโญโญ - ๋ผ์ด์–ด ์ฐพ๊ธฐ
  6. ๊ณตํ†ต์  ์ฐพ๊ธฐ โญโญ - ํŒ€์› ๊ณตํ†ต์  ์ฐพ๊ธฐ (์ถœ์‹œ ์˜ˆ์ •)
  7. ๊ทธ๋ฆผ ํ€ด์ฆˆ โญโญ - ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ (๋ฒ ํƒ€)

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

xingu/
โ”œโ”€โ”€ app/                     # Next.js 15 App Router
โ”‚   โ”œโ”€โ”€ page.tsx            # ๋žœ๋”ฉ ํŽ˜์ด์ง€
โ”‚   โ”œโ”€โ”€ login/              # ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
โ”‚   โ”œโ”€โ”€ dashboard/          # ๋Œ€์‹œ๋ณด๋“œ (์ €์žฅ๋œ ๊ฒŒ์ž„)
โ”‚   โ”œโ”€โ”€ create/             # ๊ฒŒ์ž„ ์„ ํƒ
โ”‚   โ”œโ”€โ”€ api/auth/           # Next-auth API
โ”‚   โ””โ”€โ”€ providers.tsx       # SessionProvider
โ”‚
โ”œโ”€โ”€ components/             # React ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ landing/           # PIN ์ž…๋ ฅ, ๋‹‰๋„ค์ž„ ๋ชจ๋‹ฌ
โ”‚   โ”œโ”€โ”€ create/            # ๊ฒŒ์ž„ ์นด๋“œ, ํ•„ํ„ฐ, ์ €์žฅ ๋ชจ๋‹ฌ
โ”‚   โ”œโ”€โ”€ shared/            # Navbar, Footer
โ”‚   โ””โ”€โ”€ ui/                # Shadcn UI ์ปดํฌ๋„ŒํŠธ
โ”‚
โ”œโ”€โ”€ lib/                    # ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚   โ”œโ”€โ”€ games/             # ๊ฒŒ์ž„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
โ”‚   โ”œโ”€โ”€ prisma.ts          # Prisma ํด๋ผ์ด์–ธํŠธ
โ”‚   โ””โ”€โ”€ auth.ts            # Next-auth ์„ค์ •
โ”‚
โ”œโ”€โ”€ prisma/                 # Prisma ์Šคํ‚ค๋งˆ
โ”‚   โ””โ”€โ”€ schema.prisma      # DB ์Šคํ‚ค๋งˆ
โ”‚
โ””โ”€โ”€ types/                  # TypeScript ํƒ€์ž…
    โ”œโ”€โ”€ game.ts
    โ”œโ”€โ”€ room.ts
    โ”œโ”€โ”€ player.ts
    โ””โ”€โ”€ socket-events.ts

๊ฐœ๋ฐœ ๋ช…๋ น์–ด

# ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
npm run dev

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

# ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„ ์‹คํ–‰
npm start

# ๋ฆฐํŠธ ๊ฒ€์‚ฌ
npm run lint

# Prisma ์ŠคํŠœ๋””์˜ค (DB GUI)
npx prisma studio

๋ฐ๋ชจ

1. ๋žœ๋”ฉ ํŽ˜์ด์ง€

  • ๋ฐฉ ์ฝ”๋“œ ์ž…๋ ฅ: DEMO12 (๊ฐœ๋ฐœ ์ค‘ ํ…Œ์ŠคํŠธ์šฉ)
  • ๋น„ํšŒ์›์œผ๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

2. ๊ฒŒ์ž„ ์„ ํƒ (/create)

  • 7๊ฐœ์˜ ๊ฒŒ์ž„ ์ค‘ ์„ ํƒ
  • ์นดํ…Œ๊ณ ๋ฆฌ, ๋‚œ์ด๋„๋ณ„ ํ•„ํ„ฐ๋ง
  • ๋‹ด๊ธฐ ๋˜๋Š” ๋ฐ”๋กœ ์‹œ์ž‘ ์„ ํƒ

3. ๋กœ๊ทธ์ธ (/login)

  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ
  • ๋น„ํšŒ์›์œผ๋กœ ๊ณ„์†ํ•˜๊ธฐ ์˜ต์…˜

4. ๋Œ€์‹œ๋ณด๋“œ (/dashboard)

  • ์ €์žฅ๋œ ๊ฒŒ์ž„ ํ…œํ”Œ๋ฆฟ ๋ชฉ๋ก
  • ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋น ๋ฅธ ๊ฒŒ์ž„ ์‹œ์ž‘
  • ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ (์‚ญ์ œ, ์ˆ˜์ •)

์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์„ค์ •

  1. Kakao Developers ์ ‘์†
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€
  3. ํ”Œ๋žซํผ ์„ค์ • โ†’ Web ํ”Œ๋žซํผ ์ถ”๊ฐ€
    • ์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ: http://localhost:3000
  4. ์ œํ’ˆ ์„ค์ • โ†’ ์นด์นด์˜ค ๋กœ๊ทธ์ธ
    • ํ™œ์„ฑํ™” ์„ค์ • ON
    • Redirect URI: http://localhost:3000/api/auth/callback/kakao
  5. ๋™์˜ํ•ญ๋ชฉ ์„ค์ •
    • ๋‹‰๋„ค์ž„, ํ”„๋กœํ•„ ์‚ฌ์ง„ ํ•„์ˆ˜ ๋™์˜
  6. REST API ํ‚ค โ†’ .env ํŒŒ์ผ์— ์ถ”๊ฐ€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ

model User {
  id        String   @id @default(cuid())
  email     String?  @unique
  name      String?
  image     String?
  kakaoId   String?  @unique
  templates GameTemplate[]
  rooms     Room[]
}

model GameTemplate {
  id           String   @id @default(cuid())
  userId       String
  gameId       String
  templateName String
  gameSettings String   // JSON
  maxPlayers   Int      @default(20)
  createdAt    DateTime @default(now())
}

๋ฌธ์„œ

  • docs/PLANNING.md - ํ”„๋กœ์ ํŠธ ์ „์ฒด ๊ธฐํš
  • docs/HOST_GUIDE.md - ํ˜ธ์ŠคํŠธ ํ™”๋ฉด ์ƒ์„ธ ์„ค๊ณ„
  • docs/PLAYER_GUIDE.md - ํ”Œ๋ ˆ์ด์–ด ํ™”๋ฉด ์ƒ์„ธ ์„ค๊ณ„
  • docs/GAME_LIST.md - ๊ฒŒ์ž„ ์•„์ด๋””์–ด ๋ชฉ๋ก

๋กœ๋“œ๋งต

Phase 1: ๊ธฐ๋ฐ˜ ๊ตฌ์ถ• โœ…

  • Next.js 15 ํ”„๋กœ์ ํŠธ ์„ค์ •
  • ๊ธฐ๋ณธ UI ์ปดํฌ๋„ŒํŠธ
  • ๊ฒŒ์ž„ ์„ ํƒ ์‹œ์Šคํ…œ

Phase 1.5: ํšŒ์› ์‹œ์Šคํ…œ โœ… (NEW!)

  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์—ฐ๋™
  • ๊ฒŒ์ž„ ํ…œํ”Œ๋ฆฟ ์ €์žฅ
  • ๋Œ€์‹œ๋ณด๋“œ

Phase 2: ํ•ต์‹ฌ ๊ธฐ๋Šฅ (์ง„ํ–‰ ์ค‘)

  • ๋ฐฉ ์‹œ์Šคํ…œ (์ƒ์„ฑ/์ฐธ์—ฌ)
  • WebSocket ์‹ค์‹œ๊ฐ„ ํ†ต์‹ 
  • ๋Œ€๊ธฐ์‹ค ๊ตฌํ˜„

Phase 3: ๊ฒŒ์ž„ ๊ตฌํ˜„

  • ์ดˆ์„ฑ ๊ฒŒ์ž„
  • ๋ฐธ๋Ÿฐ์Šค ๊ฒŒ์ž„
  • ๊ฒฐ๊ณผ ํ™”๋ฉด

Phase 4+: ํ™•์žฅ

  • ์ถ”๊ฐ€ ๊ฒŒ์ž„
  • ํ†ต๊ณ„ ๋ฐ ๋ถ„์„
  • ํ…œํ”Œ๋ฆฟ ๊ณต์œ  ๊ธฐ๋Šฅ

์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ (v0.2.0)

โญ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

  1. ๊ฒŒ์ž„ ๋‹ด๊ธฐ/๋ฐ”๋กœ ์‹œ์ž‘

    • ๋น„ํšŒ์›: ๋ฐ”๋กœ ์‹œ์ž‘์œผ๋กœ ์ฆ‰์‹œ ๊ฒŒ์ž„
    • ํšŒ์›: ๋‹ด๊ธฐ๋กœ ํ…œํ”Œ๋ฆฟ ์ €์žฅ
  2. ๋Œ€์‹œ๋ณด๋“œ

    • ์ €์žฅ๋œ ๊ฒŒ์ž„ ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ
    • ๋น ๋ฅธ ๊ฒŒ์ž„ ์‹œ์ž‘
  3. ์นด์นด์˜ค ๋กœ๊ทธ์ธ

    • Next-auth + Kakao OAuth
    • ๊ฐ„ํŽธํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ
  4. Prisma + SQLite

    • ์œ ์ € ๋ฐ ํ…œํ”Œ๋ฆฟ ๋ฐ์ดํ„ฐ ์ €์žฅ
    • ํ”„๋กœ๋•์…˜์€ PostgreSQL ์‚ฌ์šฉ ์˜ˆ์ •

๋ผ์ด์„ ์Šค

ยฉ 2025 Xingu. All rights reserved.


๊ฐœ๋ฐœ ์‹œ์ž‘์ผ: 2025.10.11
ํ˜„์žฌ ๋ฒ„์ „: 0.2.0 (ํ…œํ”Œ๋ฆฟ ์‹œ์Šคํ…œ ์ถ”๊ฐ€)
์ตœ์ข… ์—…๋ฐ์ดํŠธ: 2025.10.11