내 주변 카페 할인, 가장 빠르게 찾고 가장 똑똑하게 결제하다.
위치 기반 실시간 카페 할인정보 공유 + 최적 결제수단 추천 플랫폼
저렴한 커피 할인 정보 제공 서비스 — 사용자의 현재 위치를 기반으로 주변 저가 카페의 실시간 할인·페이백 정보를 모아 요약해주고, 결제 시점에 가장 유리한 결제수단을 추천한다.
통신사 할인, 카드사 청구할인, 멤버십 적립, 시즌 프로모션, 간편결제 페이백… 카페 할인 정보는 매장 배너 · SNS · 각 앱 공지 등 비정형 채널에 흩어져 있어 소비자가 실시간으로 비교하기 어렵다. 그 결과:
- 소비자는 가장 유리한 결제수단을 놓쳐 불필요한 지출이 발생한다.
- 소규모 개인 카페의 즉흥적 프로모션은 온라인에 노출되지 않는다.
- 카페 운영자는 진행 중인 프로모션의 홍보 효과를 누리지 못한다.
Catch Coffee의 차별점은 사용자 제보 + 관리자 검수 + 자동 크롤링으로 이어지는 3중 데이터 검증 구조로 정보의 신선도와 정확도를 동시에 확보하고, 특정 카드사·플랫폼에 종속되지 않는 전(全) 결제수단 비교·추천을 제공한다는 점이다.
[자동 크롤링] ─┐
[판매자 등록] ─┼─▶ 할인 정보 DB ─▶ 위치/결제수단 기반 추천 ─▶ 사용자
[사용자 제보] ─┘ ▲
[관리자 검수 / 3인 확인 자동등록]
| 역할 | 설명 |
|---|---|
| User | 할인 탐색, 제보 등록, "이 정보 맞아요" 확인, 결제수단 등록, 알림 설정 |
| Seller | 자사 카페 할인 직접 등록/수정/종료, 자사 제보 정보 관리 |
| Admin | 제보 검수(승인/반려), 크롤링 관리, 할인 데이터 관리 |
- 주변 카페 할인 정보 실시간 제공 — 위치 기반 반경 검색(50m~5km), 지도/목록, 카페 상세 할인 정보 (중요도: 높음)
- 자동 이벤트 정보 수집·요약 — 주요 브랜드(메가커피·컴포즈·빽다방 등) 공식 채널 크롤링 → 파싱 → DB 저장 → 일일 스케줄 (중요도: 높음)
- 최적 결제 방법 추천 — 보유 결제수단 × 카페 할인 매칭 → 최대 할인/페이백 결제수단 추천 (중요도: 높음)
- 사용자 맞춤형 알림 — 즐겨찾기 카페 / 특정 결제수단 신규 할인 시 푸시 알림 (중요도: 중간)
- 간편 결제 연동 — 결제수단 등록 → 최종 금액 확인 → 결제 실행 → 성공/실패 안내 (중요도: 낮음 / V1.1+)
- 사용자 제보로 할인 정보 보완 — 영수증·사진 첨부 제보, "이 정보 맞아요" 1인 1회 확인(취소 가능), 3인 확인 시 자동 등록, 사용자 제보 배지 표기 (중요도: 높음)
- 판매자 직접 할인 등록 — 할인명/정률·정액/적용 대상/기간/조건 입력, 수정·조기 종료 (중요도: 높음)
전체 상세 기능명세는
docs/01-기획-요약.md참고.
홈/지도 탐색 → 카페 상세 / 할인 상세 → 결제 추천·진행 · 제보 등록 · 즐겨찾기 → 마이페이지(제보 내역·결제수단·알림) / 판매자 대시보드 / 관리자 검수·크롤링
전체 플로우는 docs/유저플로우.md(Mermaid) 참고.
WARA 모노레포와 동일한 컨벤션을 따른다. 본 스택은 검토용 제안이며 확정 시 업데이트한다. 상세 비교는 docs/02-기술스택-설계.md 참고.
| 영역 | 선택(제안) |
|---|---|
| 모노레포 | pnpm + Turborepo |
| 백엔드 API | NestJS + TypeScript |
| DB / ORM | PostgreSQL + Drizzle ORM |
| 웹 (사용자/판매자/관리자) | Next.js |
| 모바일 | Expo (React Native) |
| 크롤링 워커 | Node + Playwright/Cheerio, 스케줄러 |
| 캐시/큐 | Redis |
| 지도/장소 | Kakao Map + Local API |
| 푸시 | Firebase Cloud Messaging (Expo Notifications) |
| 이미지 저장 | S3 호환 오브젝트 스토리지 (R2 등) |
catch-coffee/
├─ apps/
│ ├─ api/ # NestJS API 서버
│ ├─ web/ # Next.js (사용자/판매자/관리자)
│ ├─ mobile/ # Expo (iOS/Android)
│ └─ crawler/ # 크롤링 + 파싱 워커
├─ packages/
│ ├─ types/ # 공유 타입 (DTO/스키마)
│ ├─ ui/ # 공유 UI
│ ├─ tsconfig/
│ └─ eslint-config/
└─ docs/
| 문서 | 내용 |
|---|---|
docs/01-기획-요약.md |
기획서 + 기능명세서 요약 |
docs/02-기술스택-설계.md |
기술 스택/구조 설계 (옵션 비교) |
docs/03-karpathy-분석.md |
기획 가정·리스크·단순화 분석 |
docs/04-내부-API-목록.md |
서비스 내부 REST API 목록 |
docs/05-외부연동-가이드.md |
외부 API 탐색 + 연동 방법 |
docs/06-S3-R2-설정.md |
R2/S3 영수증 업로드 presign 설정 |
- API:
https://catch-coffeecrawler-production.up.railway.app(GET /api/v1/health) - API 문서(Swagger UI):
/docs· OpenAPI JSON:/docs-json(Zod 스키마 기반 자동 생성) - main 푸시 시 GitHub 연동으로 자동 배포 (
railway.json빌드/실행 설정, branch=main)
전체 키 목록은 .env.example 참고. 핵심 통합별 필요 값:
| 통합 | 필요 env | 미설정 시 동작 |
|---|---|---|
S3 영수증 업로드 (apps/api UploadsService) |
S3_BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, R2 시 S3_ENDPOINT + S3_PUBLIC_BASE_URL 필수 |
presign 요청 시 env 미설정이면 에러. docs/06-S3-R2-설정.md |
Redis 멱등성 (Idempotency-Key) |
REDIS_URL |
인터셉터 no-op 통과 (멱등성 미적용) |
Expo 푸시 (apps/crawler 디스패처) |
EXPO_ACCESS_TOKEN (선택) |
인증 헤더 없이 전송 시도, DeviceNotRegistered 토큰은 자동 soft-delete |
.github/workflows/crawler.yml 는 매시 정각 + 수동 트리거로 수집/알림을 실행한다. 다음을 리포지토리에 등록한다:
- Variables (Settings → Secrets and variables → Actions → Variables)
CRAWLER_ENABLED=true(이 값이true일 때만 잡 실행)
- Secrets (동일 화면 → Secrets)
DATABASE_URL— 운영 DB 접속 문자열EXPO_ACCESS_TOKEN— Expo 푸시 토큰 (선택, 미설정 가능)
CI 테스트(e2e)용 시크릿(
DATABASE_URL,JWT_*,ENCRYPTION_KEY,REDIS_URL)은.github/workflows/ci.yml의 서비스 컨테이너에서 주입된다.
🟢 설계 단계 — 기술 스택 확정(옵션 A: NestJS 모노레포). DB 스키마(packages/db) 작성 완료 (15개 테이블, 초기 migration 생성). API 구현 예정.
- 기획·설계 (4주) — IA, 유저플로우, 기능명세 ✅
- 개발 (10주) — 핵심 탐색·할인·제보, PG 연동, 판매자·관리자 페이지
- 내부 QA (2주)
- 시범운영 (8주) — 파일럿 지역 30~50개점
- 정식출시 — 입점 확대, 지속 운영
본 저장소는 기획 문서(기획서·기능명세서·유저플로우)를 기반으로 작성되었습니다.