尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
서울시 25개 자치구 공공 테니스장 예약 현황을 실시간으로 확인하고, 바로 예약할 수 있는 서비스 서울시에는 많은 공공 테니스장이 있지만, 예약 정보가 여러 곳에 흩어져 있어 원하는 시간에 예약 가능한 코트를 찾기가 어렵습니다. 서울 테니스는 이 정보를 한곳에 모아, 누구나 쉽게 빈 코트를 찾고 예약할 수 있도록 만들었습니다. • 실시간 예약 상태 -- 접수중/마감 등 상태 확인 후 바로 예약 페이지 이동 • 이용 후기 & 별점 -- 실제 이용자의 리뷰와 사진으로 코트 선택 참고 • 실시간 날씨 -- 코트 위치 기반 기온/강수 정보, 실외 코트 우천 주의 • 실시간 미세먼지 -- PM2.5/PM10 등급과 수치, 나쁨 시 실내 코트 안내 • 비슷한 테니스장 추천 -- 같은 장소/인근 지역의 대안 코트 자동 추천 • 길찾기 -- T맵·네이버 지도·카카오맵으로 테니스장까지 길찾기 • 전화번호 바로 연결 -- 시설 연락처 탭 한 번으로 전화查看完整 README ↗
서울시 25개 자치구 공공 테니스장 예약 현황을 실시간으로 확인하고, 바로 예약할 수 있는 서비스
서울시에는 많은 공공 테니스장이 있지만, 예약 정보가 여러 곳에 흩어져 있어 원하는 시간에 예약 가능한 코트를 찾기가 어렵습니다. 서울 테니스는 이 정보를 한곳에 모아, 누구나 쉽게 빈 코트를 찾고 예약할 수 있도록 만들었습니다.
| 페이지 | 설명 |
|---|---|
| 홈 | 25개 자치구별 테니스장 목록, 인기 랭킹 TOP 5, 즐겨찾기 현황, 날씨/미세먼지 요약 |
| 오늘 예약 | 오늘 바로 예약 가능한 테니스장만 모아서 보기 |
| 구별 비교 | 자치구별 코트 수/예약률/무료 코트/경쟁률/평점 비교 |
| 경쟁률 | 시간대/요일별 예약 경쟁률 추이 분석 |
| 캘린더 | 날짜별 예약 현황을 달력 뷰로 확인 |
| 경기 기록 | 테니스 경기 기록 관리 (승패, 스코어, 상대, 코트, 비용, 사진) |
| 매칭 | 같이 테니스 칠 파트너를 모집하거나 참여하는 오픈 매칭 게시판 |
| 래더 | ELO 기반 랭킹 시스템으로 실력 증명 및 순위 경쟁 |
| 양도 마켓 | 코트 예약을 양도하거나 원하는 시간대의 코트를 구하는 마켓 |
| 대진표 | 동호회 대진표 생성·관리 (단식/복식, 토너먼트/라운드로빈, 실시간 스코어) |
| 영역 | 기술 |
|---|---|
| 프레임워크 | Next.js 16 (App Router) |
| 언어 | TypeScript |
| 스타일링 | Tailwind CSS |
| DB / 인증 | Supabase (Kakao/Google OAuth) |
| 데이터 페칭 | SWR |
| 지도 | Kakao Maps SDK, T맵/네이버 지도/카카오맵 길찾기 연동 |
| PWA | Serwist |
| 테스트 | Vitest + Testing Library |
| 배포 | Vercel (ICN 리전) |
| 애니메이션 | Framer Motion |
| 분석 | Google Analytics, AdSense |
| 데이터 | 출처 |
|---|---|
| 테니스장 예약 현황 | 서울 열린데이터광장 -- 공공서비스예약 API |
| 실시간 대기질 | 서울 열린데이터광장 -- 자치구별 대기환경 API |
| 전국 대기질 | 에어코리아 -- 대기오염 정보 API |
| 실시간 날씨 | 기상청 -- 단기예보 API |
git clone https://github.com/your-username/seoul-tennis-reserve-app.git
cd seoul-tennis-reserve-app
npm install
cp .env.example .env.local
# .env.local 파일에 환경변수 값을 입력하세요
npm run dev
http://localhost:3000 에서 확인할 수 있습니다.
| 변수 | 설명 | 필수 |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | Supabase 프로젝트 URL | O |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase 익명 키 (클라이언트) | O |
SUPABASE_SERVICE_ROLE_KEY | Supabase 서비스 키 (서버) | O |
SEOUL_OPEN_DATA_KEY | 서울 열린데이터 API 키 | O |
SEOUL_AIR_QUALITY_KEY | 서울 대기질 API 키 | O |
WEATHER_API_KEY | 기상청 단기예보 API 키 | O |
AIRKOREA_API_KEY | 에어코리아 대기질 API 키 | O |
LIVING_WEATHER_API_KEY | 생활기상지수 API 키 | O |
NEXT_PUBLIC_KAKAO_MAP_KEY | 카카오 지도 SDK 키 | O |
NEXT_PUBLIC_VAPID_PUBLIC_KEY | Web Push VAPID 공개 키 | O |
VAPID_PRIVATE_KEY | Web Push VAPID 비밀 키 | O |
CRON_SECRET | Cron 엔드포인트 인증 Bearer 토큰 | O |
NEXT_PUBLIC_GA_ID | Google Analytics ID | - |
NEXT_PUBLIC_ADSENSE_CLIENT_ID | Google AdSense 클라이언트 ID | - |
NEXT_PUBLIC_AD_SLOT_HOME_TOP | AdSense 슬롯: 홈 상단 | - |
NEXT_PUBLIC_AD_SLOT_HOME_BOTTOM | AdSense 슬롯: 홈 하단 | - |
NEXT_PUBLIC_AD_SLOT_DISTRICT_TOP | AdSense 슬롯: 자치구 상단 | - |
NEXT_PUBLIC_AD_SLOT_COURT_MIDDLE | AdSense 슬롯: 코트 상세 중간 | - |
NEXT_PUBLIC_AD_SLOT_COURT_BOTTOM | AdSense 슬롯: 코트 상세 하단 | - |
NEXT_PUBLIC_AD_SLOT_SIDEBAR | AdSense 슬롯: 사이드바 | - |
NEXT_PUBLIC_SEARCH_V2_ROLLOUT_PERCENT | v2 검색 랭킹 롤아웃 비율 (0~100, 기본 100) | - |
NEXT_PUBLIC_SEARCH_V2_FORCE |
NEXT_PUBLIC_SEARCH_V2_FORCE가 설정되면 롤아웃 비율보다 우선 적용됩니다.
npm run dev # 개발 서버 (webpack)
npm run build # 프로덕션 빌드 (webpack)
npm run lint # ESLint
npm run test # Vitest 테스트 (watch 모드)
npm run test:run # 테스트 1회 실행
app/
page.tsx # 홈 (자치구 그리드, 인기 코트, 즐겨찾기)
today/ # 오늘 예약 가능 코트
compare/ # 자치구별 비교
trends/ # 경쟁률 추이
calendar/ # 캘린더 뷰
records/ # 경기 기록 (목록, 작성, 상세, 수정)
matching/ # 매칭 (게시판, 글쓰기, 상세)
ladder/ # 래더 (ELO 리더보드)
transfers/ # 양도 마켓 (목록, 등록, 상세)
tournaments/ # 대진표 (목록, 생성, 상세/대진표/실시간 스코어)
[district]/ # 자치구별 코트 목록
[courtId]/ # 코트 상세 (리뷰, 날씨, 지도)
my/ # 마이페이지 (즐겨찾기, 알림, 테니스 프로필)
guide/[district]/ # 자치구 가이드
guide/matching/ # 매칭 기능 가이드
guide/ladder/ # 래더 시스템 가이드
guide/transfers/ # 양도 마켓 가이드
guide/tournaments/ # 대진표 가이드
login/ # 로그인 (Kakao, Google)
about/ # 서비스 소개
api/
tennis/ # 테니스장 데이터 (서울 API 프록시)
weather/ # 실시간 날씨
air-quality/ # 실시간 대기질
records/ # 경기 기록 CRUD + 통계
profile/tennis/ # 테니스 프로필
profile/me/ # 유저 프로필 (닉네임, 아바타)
matching/ # 매칭 게시판 CRUD + 신청
ladder/ # 래더 리더보드 + 프로필 + 히스토리
transfers/ # 양도 마켓 CRUD + 관심 표시
tournaments/ # 대진표 CRUD + 대진 추첨 + 경기 관리
reviews/ # 리뷰 CRUD
favorites/ # 즐겨찾기 CRUD
trends/ # 경쟁률 데이터
popular-courts/ # 인기 코트 랭킹
push/ # 푸시 알림 구독
alerts/ # 알림 설정
feedback/ # 피드백 제출
cron/ # 스케줄 작업 (스냅샷, 랭킹, 알림, 정리, 양도 만료)
components/ # React 컴포넌트
layout/ # Header, Footer, BottomNav
home/ # 홈페이지 (검색, 인기 코트)
court-detail/ # 코트 상세 (지도, 요금, 유사 코트)
weather/ # 날씨, 미세먼지
review/ # 리뷰 폼, 목록
favorite/ # 즐겨찾기 버튼, 섹션
alert/ # 알림 설정
records/ # 경기 기록 (폼, 카드, 상세, 통계)
matching/ # 매칭 (게시판, 카드, 폼, 상세)
ladder/ # 래더 (리더보드, 랭크 카드, ELO 차트)
transfers/ # 양도 (목록, 카드, 폼, 상세)
tournament/ # 대진표 (목록, 카드, 폼, 상세, 대진표 뷰, 실시간 스코어)
profile/ # 프로필 (테니스, 유저, 아바타, ProfileGate)
seasonal/ # 시즌 테마 (벚꽃 배너, 사쿠라 오버레이)
ui/ # 공통 UI (Toast, Spinner, ShareButton 등)
pwa/ # PWA 설치 프롬프트
lib/ # 유틸리티
seoulApi.ts # 서울 API 클라이언트
supabase.ts # Supabase 브라우저 클라이언트
supabaseServer.ts # Supabase 서버 클라이언트
hooks/ # 커스텀 훅 (즐겨찾기, 기록, 프로필 등)
constants/ # 상수 (자치구, 테니스, 매칭, 래더, 양도, 프로필, 대진표)
utils/ # 유틸리티 (상태, 통계, 날씨 등)
contexts/ # React Context (Auth, Theme, TennisData, Toast, Seasonal)
supabase/
schema.sql # DB 스키마
migrations/ # 마이그레이션
Vercel에 배포됩니다. 자세한 가이드는 DEPLOY.md를 참고하세요.
이 프로젝트는 비공개 프로젝트입니다.
검색 변형 강제 (v2 또는 legacy) |
| - |
NEXT_PUBLIC_SEARCH_V2_PROFILE | v2 랭킹 프로파일 (balanced/precision/recall) | - |