zaewc/kickoff26

★ 0Forks 0TypeScriptGitHub ↗Compare

Project website ↗

README

KICKOFF 26

2026 FIFA 월드컵 경기 현황과 교내 승부예측을 한 화면에서 제공하는 Next.js 서비스입니다.

실행

cp .env.example .env
npm install
npm run db:migrate
npm run dev

http://localhost:3000에서 확인할 수 있습니다. 최초 실행 시 DB가 비어 있으면 데모 경기 5개를 자동으로 넣습니다. 아래 일정 동기화를 한 번 실행하면 openfootball의 실제 2026 월드컵 104경기로 교체됩니다.

DataGSM OAuth 설정

  1. DataGSM Client에서 OAuth 클라이언트를 생성합니다.
  2. 리다이렉트 URI에 http://localhost:3000/api/auth/callback을 정확히 등록합니다.
  3. .env.local에 DATAGSM_CLIENT_ID, DATAGSM_REDIRECT_URI, SESSION_SECRET을 설정합니다.

로그인은 Authorization Code + PKCE(S256) 방식이며 state를 검증합니다. DataGSM 액세스 토큰은 사용자 정보를 조회한 뒤 폐기하며 브라우저에 저장하지 않습니다.

환경 변수

이름 설명
DATAGSM_CLIENT_ID DataGSM OAuth Client ID
DATAGSM_REDIRECT_URI 사전 등록한 OAuth 콜백 URI
SESSION_SECRET 세션 쿠키 서명용 32자 이상 임의 문자열
DATABASE_URL 로컬 SQLite 경로 또는 Turso libsql:// URL
TURSO_AUTH_TOKEN Turso 원격 DB 토큰, Vercel 배포 시 필요
FOOTBALL_DATA_API_KEY football-data.org 무료 결과 갱신 키, 선택
CRON_SECRET 경기 데이터 동기화 API 인증값

무료 경기 일정 적재

openfootball의 CC0 공개 JSON을 사용하므로 API 키나 결제가 필요 없습니다.

curl -X POST http://localhost:3000/api/admin/fixtures/sync \
  -H "Authorization: Bearer $CRON_SECRET"

이 요청은 2026 월드컵 104경기를 DB에 upsert하고 기존 데모 일정을 제거합니다. 일반 페이지 요청은 외부 API를 호출하지 않고 DB만 읽습니다.

무료 결과 갱신

football-data.org에서 무료 키를 발급한 뒤 FOOTBALL_DATA_API_KEY를 설정합니다. 무료 플랜의 결과는 지연될 수 있습니다.

curl -X POST http://localhost:3000/api/admin/fixtures/results \
  -H "Authorization: Bearer $CRON_SECRET"

외부 결과가 늦거나 누락된 경우 관리자가 직접 결과를 확정할 수 있습니다. 확정 즉시 베팅 풀이 정산됩니다.

curl -X PUT http://localhost:3000/api/admin/fixtures/20260001/result \
  -H "Authorization: Bearer $CRON_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"homeScore":2,"awayScore":1}'

DB 구조

  • User: DataGSM 사용자, 학년·반, 포인트 지갑
  • Fixture: 2026 월드컵 일정, 상태, 실제 스코어
  • Prediction: 사용자별 경기 점수 예측, 베팅액, 배당 결과
  • PredictionRevision: 예측 생성·수정·삭제 이력
  • PointTransaction: 베팅 차감·환불·배당 포인트 원장

신규 사용자는 1,000P로 시작하며 경기당 10P부터 500P까지 베팅할 수 있습니다. 경기 시작 후 예측 변경은 서버에서 차단됩니다. 종료 경기 동기화 시 전체 베팅 풀의 70%는 정확한 스코어 적중자, 30%는 승무패만 적중한 사용자에게 각 베팅액 비율대로 분배됩니다. 한 그룹에 적중자가 없으면 해당 몫은 다른 적중 그룹으로 넘어가며, 적중자가 전혀 없으면 전원 환불됩니다.

npm run db:migrate  # 미적용 SQL 마이그레이션 적용
npm run db:studio   # DB 확인
npm run db:generate # Prisma Client 재생성

Vercel 배포

Vercel Functions의 로컬 파일은 영구 저장소가 아니므로 DATABASE_URL=file:... 설정을 프로덕션에서 사용하면 안 됩니다. 무료 Turso DB를 생성하고 Vercel 프로젝트의 Production 환경 변수에 다음 값을 설정합니다.

DATABASE_URL=libsql://your-database.turso.io
TURSO_AUTH_TOKEN=your-token

환경 변수를 로컬 .env에 설정한 뒤 원격 DB 마이그레이션을 한 번 실행합니다.

npm run db:deploy

DataGSM 클라이언트에는 실제 Vercel 도메인의 콜백 주소를 등록하고 DATAGSM_REDIRECT_URI도 같은 값으로 설정해야 합니다.

https://your-project.vercel.app/api/auth/callback

Getting Started

First, run the development server:

npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev

Open http://localhost:3000 with your browser to see the result.

You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.

This project uses next/font to automatically optimize and load Geist, a new font family for Vercel.

Learn More

To learn more about Next.js, take a look at the following resources:

You can check out the Next.js GitHub repository - your feedback and contributions are welcome!

Deploy on Vercel

The easiest way to deploy your Next.js app is to use the Vercel Platform from the creators of Next.js.

Check out our Next.js deployment documentation for more details.

Contributors

zaewc

Issues