์น ๊ธฐ๋ฐ ์ค์๊ฐ ๋ฉํฐํ๋ ์ด ์์ด์ค๋ธ๋ ์ดํน ํ๋ซํผ
Xingu๋ ๋์๋ฆฌ, ์ํฌ์ต, ํ ๋น๋ฉ ๋ฑ์์ ์ฌ์ฉํ ์ ์๋ ์น ๊ธฐ๋ฐ ์์ด์ค๋ธ๋ ์ดํน ํ๋ซํผ์ ๋๋ค.
- ๐ ์ค์น ๋ถํ์: ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ์คํ
- ๐ฅ ์ญํ ๋ถ๋ฆฌ: ํธ์คํธ๋ ๊ด๋ฆฌ, ํ๋ ์ด์ด๋ ์ฐธ์ฌ
- โก ์ค์๊ฐ ๋๊ธฐํ: WebSocket ๊ธฐ๋ฐ ์ฆ๊ฐ ๋ฐ์ (์์ )
- ๐ฎ ๋ค์ํ ๊ฒ์: ์ด์ฑ, ๋ฐธ๋ฐ์ค, ๋ผ์ด์ด ๋ฑ 7๊ฐ ๊ฒ์
- ๐ ๊ฒ์ ์ ์ฅ ๊ธฐ๋ฅ: ๋ด๊ธฐ/๋ฐ๋ก ์์ ๋ ๊ฐ์ง ์ต์ โญ
- ๐ ์นด์นด์ค ๋ก๊ทธ์ธ: ๊ฐํธํ ์์ ๋ก๊ทธ์ธ
- 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 (ํ๋ก๋์ ์์ )
- 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์์ ์คํ๋ฉ๋๋ค.
- PIN ์ฝ๋ ์ ๋ ฅ์ผ๋ก ์ฆ์ ๊ฒ์ ์ฐธ์ฌ
- ํ์๊ฐ์ ์์ด ๋ฐ๋ก ์์
- ๋นํ์: "๋ฐ๋ก ์์" โ ์ฆ์ ๋ฐฉ ์์ฑ
- ๋ก๊ทธ์ธ ํ์: "๋ด๊ธฐ" โ ๋์ค์ ๋์๋ณด๋์์ ์ฌ์ฌ์ฉ
- ์ ์ฅ๋ ๊ฒ์ ํ ํ๋ฆฟ ๊ด๋ฆฌ
- ํ ๋ฒ ์ค์ ํ ๊ฒ์์ ๋ฐ๋ณต ์ฌ์ฉ
- ํ ํ๋ฆฟ ์ด๋ฆ ์ง์ (์: "MT์ฉ ์ด์ฑ๊ฒ์")
- ๊ฐํธํ ์์ ๋ก๊ทธ์ธ
- ๊ฒ์ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ
- Next.js 15 ํ๋ก์ ํธ ์ด๊ธฐ ์ค์
- Shadcn UI ์ค์ ๋ฐ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ
- TypeScript ํ์ ์ ์
- ๊ธฐ๋ณธ ๋ ์ด์์ (Navbar, Footer)
- ๋๋ฉ ํ์ด์ง (PIN ์ ๋ ฅ)
- ๊ฒ์ ์ ํ ํ์ด์ง (์นด๋, ํํฐ, ๊ทธ๋ฆฌ๋)
- ์นด์นด์ค ๋ก๊ทธ์ธ ์ฐ๋ โญ
- ๊ฒ์ ๋ด๊ธฐ/๋ฐ๋ก ์์ ๊ธฐ๋ฅ โญ
- ๋์๋ณด๋ ํ์ด์ง โญ
- Prisma + SQLite DB ์ค์ โญ
- ๋ฐฉ ์์ฑ API
- ํธ์คํธ ๋๊ธฐ์ค
- ํ๋ ์ด์ด ๋๊ธฐ์ค
- WebSocket ์๋ฒ ๊ตฌํ
- ๊ฒ์ ๋ก์ง ๊ตฌํ
- ์ด์ฑ ๊ฒ์ โญโญ - ์ ์๋ ์ด์ฑ์ผ๋ก ๋จ์ด ๋ง์ถ๊ธฐ (์ถ์ฒ)
- ๋ฐธ๋ฐ์ค ๊ฒ์ โญ - A vs B ์์ํ์ผ (์ถ์ฒ)
- ๋๋ค ์ง๋ฌธ ๋ฃฐ๋ โญ - ๋ฃฐ๋ ์ผ๋ก ์๊ธฐ์๊ฐ (์ถ์ฒ)
- ์คํผ๋ ํด์ฆ โญ - OX ํด์ฆ ๋๋ 4์ง์ ๋ค
- ๋ผ์ด์ด ๊ฒ์ โญโญโญ - ๋ผ์ด์ด ์ฐพ๊ธฐ
- ๊ณตํต์ ์ฐพ๊ธฐ โญโญ - ํ์ ๊ณตํต์ ์ฐพ๊ธฐ (์ถ์ ์์ )
- ๊ทธ๋ฆผ ํด์ฆ โญโญ - ๊ทธ๋ฆผ์ผ๋ก ํํํ๊ธฐ (๋ฒ ํ)
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- ๋ฐฉ ์ฝ๋ ์
๋ ฅ:
DEMO12(๊ฐ๋ฐ ์ค ํ ์คํธ์ฉ) - ๋นํ์์ผ๋ก ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- 7๊ฐ์ ๊ฒ์ ์ค ์ ํ
- ์นดํ ๊ณ ๋ฆฌ, ๋์ด๋๋ณ ํํฐ๋ง
- ๋ด๊ธฐ ๋๋ ๋ฐ๋ก ์์ ์ ํ
- ์นด์นด์ค ๋ก๊ทธ์ธ
- ๋นํ์์ผ๋ก ๊ณ์ํ๊ธฐ ์ต์
- ์ ์ฅ๋ ๊ฒ์ ํ ํ๋ฆฟ ๋ชฉ๋ก
- ํ ํ๋ฆฟ์ผ๋ก ๋น ๋ฅธ ๊ฒ์ ์์
- ํ ํ๋ฆฟ ๊ด๋ฆฌ (์ญ์ , ์์ )
- Kakao Developers ์ ์
- ์ ํ๋ฆฌ์ผ์ด์ ์ถ๊ฐ
- ํ๋ซํผ ์ค์ โ Web ํ๋ซํผ ์ถ๊ฐ
- ์ฌ์ดํธ ๋๋ฉ์ธ:
http://localhost:3000
- ์ฌ์ดํธ ๋๋ฉ์ธ:
- ์ ํ ์ค์ โ ์นด์นด์ค ๋ก๊ทธ์ธ
- ํ์ฑํ ์ค์ ON
- Redirect URI:
http://localhost:3000/api/auth/callback/kakao
- ๋์ํญ๋ชฉ ์ค์
- ๋๋ค์, ํ๋กํ ์ฌ์ง ํ์ ๋์
- 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 - ๊ฒ์ ์์ด๋์ด ๋ชฉ๋ก
- Next.js 15 ํ๋ก์ ํธ ์ค์
- ๊ธฐ๋ณธ UI ์ปดํฌ๋ํธ
- ๊ฒ์ ์ ํ ์์คํ
- ์นด์นด์ค ๋ก๊ทธ์ธ ์ฐ๋
- ๊ฒ์ ํ ํ๋ฆฟ ์ ์ฅ
- ๋์๋ณด๋
- ๋ฐฉ ์์คํ (์์ฑ/์ฐธ์ฌ)
- WebSocket ์ค์๊ฐ ํต์
- ๋๊ธฐ์ค ๊ตฌํ
- ์ด์ฑ ๊ฒ์
- ๋ฐธ๋ฐ์ค ๊ฒ์
- ๊ฒฐ๊ณผ ํ๋ฉด
- ์ถ๊ฐ ๊ฒ์
- ํต๊ณ ๋ฐ ๋ถ์
- ํ ํ๋ฆฟ ๊ณต์ ๊ธฐ๋ฅ
-
๊ฒ์ ๋ด๊ธฐ/๋ฐ๋ก ์์
- ๋นํ์: ๋ฐ๋ก ์์์ผ๋ก ์ฆ์ ๊ฒ์
- ํ์: ๋ด๊ธฐ๋ก ํ ํ๋ฆฟ ์ ์ฅ
-
๋์๋ณด๋
- ์ ์ฅ๋ ๊ฒ์ ํ ํ๋ฆฟ ๊ด๋ฆฌ
- ๋น ๋ฅธ ๊ฒ์ ์์
-
์นด์นด์ค ๋ก๊ทธ์ธ
- Next-auth + Kakao OAuth
- ๊ฐํธํ ์์ ๋ก๊ทธ์ธ
-
Prisma + SQLite
- ์ ์ ๋ฐ ํ ํ๋ฆฟ ๋ฐ์ดํฐ ์ ์ฅ
- ํ๋ก๋์ ์ PostgreSQL ์ฌ์ฉ ์์
ยฉ 2025 Xingu. All rights reserved.
๊ฐ๋ฐ ์์์ผ: 2025.10.11
ํ์ฌ ๋ฒ์ : 0.2.0 (ํ
ํ๋ฆฟ ์์คํ
์ถ๊ฐ)
์ต์ข
์
๋ฐ์ดํธ: 2025.10.11