Elitechel Media
LGCHL 뉴스·통계·파워 순위, 캘거리 히트맨 소식·생중계·라디오 제공
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗futsal with chat — 풋살 용병 모집부터 참가 신청, 실시간 채팅까지 한 곳에서
용병을 구하는 경기 주최자와 참여하려는 사용자가 바로 대화할 수 있는 풋살 용병 매칭 서비스입니다. 기존 용병 모집 방식에서는 주최자와 소통할 창구가 부족하다는 문제에서 출발했습니다. 모집글, 참가 신청, 1:1 실시간 채팅을 하나의 흐름으로 연결했습니다.
배포 https://chatfutsal.vercel.app · 버전 0.1.0
jsonwebtoken)을 발급해 기존 유저 시스템과 통합N자리 남음 / 마감임박 / 마감 배지closed 처리closed로 갱신
applicantIds)onSnapshot 기반 1:1 실시간 채팅| 구분 | 사용 기술 |
|---|---|
| Framework | Next.js 16 (App Router), React 19 |
| Language | TypeScript |
| Styling | Tailwind CSS 4, shadcn/ui (Radix UI), lucide-react |
| Backend (BaaS) | Firebase Authentication, Cloud Firestore |
| Server | Next.js API Route, jsonwebtoken (Firebase Custom Token 서명) |
| 외부 API | Kakao Login (OAuth), Kakao Maps JavaScript API / Places |
| Test | Vitest |
| Deploy | Vercel |
| 경로 | 설명 |
|---|---|
/ | 모집글 목록 (검색 · 날짜 · 지역 · 레벨 필터) |
/recruit/[postId] | 모집글 상세 · 지도 · 참가 신청 |
/recruit/[postId]/edit | 모집글 수정 |
/create | 모집글 작성 |
/chat | 채팅방 목록 |
/chat/[roomId] | 채팅방 |
/notifications | 알림 목록 |
/mypage | 마이페이지 |
/mypage/recruits | 내가 작성한 모집글 |
/mypage/applications | 내가 신청한 모집 |
/users/[userId] | 사용자 프로필 |
/login, /signup | 로그인 · 회원가입 |
/auth/kakao/callback | 카카오 로그인 콜백 |
src/
├── app/ # 페이지 (App Router)
│ └── api/auth/kakao/ # 카카오 로그인 → Firebase Custom Token 발급
├── components/ # UI 컴포넌트 (Header, SubHeader, RecruitCard, ChatRoom, KakaoMapSearch 등)
│ └── ui/styles.ts # 공통 버튼 · 입력 필드 스타일
├── hooks/ # 실시간 구독 훅 (useRecruitPosts, useMessage, useNotifications 등)
├── lib/
│ ├── firebase/ # Firebase 클라이언트 초기화 · 에러 메시지 처리
│ ├── firebase-admin.ts # Firebase Custom Token 생성 (서버 전용)
│ ├── services/ # Firestore 쓰기 로직 (recruit, application, chat, notification)
│ └── utils/ # 날짜 포맷 · 만료 판별 유틸 (단위 테스트 포함)
└── types/ # 공통 타입 정의
읽기는 hooks에서 onSnapshot으로 실시간 구독하고, 쓰기는 services에 모아 역할을 분리했습니다.
firestore/
├── users/{userId} # 사용자 정보 (provider: email | kakao)
├── recruitPosts/{postId} # 모집글 (status, needCount, acceptedCount, applicantIds, locationCoord)
├── applications/{applicationId} # 참가 신청 (status: pending | accepted | rejected)
├── notifications/{notificationId} # 알림 (recipientId, type, isRead, link)
└── chatRooms/{roomId} # 채팅방 (participants, lastMessage)
└── messages/{messageId} # 메시지 (readBy로 읽음 처리)
KOE320(인가 코드 없음)으로 실패useRef로 막으려 했지만 재마운트 시 ref가 초기화되어 효과가 없었다.Set에 기록해 같은 코드는 한 번만 교환하도록 했다.FUNCTION_INVOCATION_FAILEDfirebase-admin이 의존하는 jose v5가 ESM 전용 패키지라, 서버리스 함수 런타임에서 require()로 불러오다 ERR_REQUIRE_ESM이 발생했다. serverExternalPackages 설정으로도 해결되지 않았다.firebase-admin을 제거하고 jsonwebtoken으로 직접 서명했다. 의존성 크기도 함께 줄었다.onSnapshot 리스너는 종료되고 재시도하지 않는다.permission-denied)는 "데이터 없음"과 구분해 로그인 안내 화면을 보여준다.git clone https://github.com/oldwater0224/chatfutsal.git
cd chatfutsal
npm install
npm run dev
프로젝트 루트에 .env.local을 만들고 아래 값을 채워야 합니다.
# Firebase (Client)
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
# Firebase 서비스 계정 (Server, 카카오 로그인 Custom Token 서명용)
FIREBASE_ADMIN_CLIENT_EMAIL=
FIREBASE_ADMIN_PRIVATE_KEY=
# Kakao
NEXT_PUBLIC_KAKAO_MAP_JS_KEY=
NEXT_PUBLIC_KAKAO_REST_API_KEY=
NEXT_PUBLIC_KAKAO_REDIRECT_URI=
KAKAO_CLIENT_SECRET=
테스트 실행
npm test
카카오맵과 카카오 로그인을 사용하려면 Kakao Developers에 사이트 도메인(
http://localhost:3000등)과 Redirect URI를 등록해야 합니다.