Skip to content
@catchtable-clone

catchtable-clone

CatchEAT

맛집 예약 / 빈자리 알림 / AI 챗봇


대표 이미지

Catchtable Clone Coding Project




📖 Table of Contents


📣 Introduction

소개

본 프로젝트는 레스토랑 예약 플랫폼 캐치테이블을 클론 코딩하며 매장 검색, 예약, 선착순 쿠폰, 실시간 빈자리 알림, AI 챗봇 서비스를 구현하고 가상 트래픽이 몰리는 상황에서 아키텍처적 결함을 확인하고 개선한 백엔드 엔지니어링 프로젝트입니다.

문서

📦 Backend Repo: catchtable-clone/backend

📦 Frontend Repo: catchtable-clone/frontend


  • 맛집을 검색하고 실시간 잔여 좌석을 예약하는 레스토랑 예약 플랫폼
  • 원하는 매장의 빈자리가 생기면 실시간으로 알림 (Vacancy 구독 + Kafka)
  • 선착순 쿠폰 발급 — Redis Lua + 분산 락으로 대량 트래픽에도 정확한 재고 관리
  • PortOne(카카오페이) 연동 예약금 결제
  • 위치 기반 매장 검색 (PostGIS) — 내 주변 맛집 탐색
  • AI 챗봇(Google Gemini)으로 간편하게, 매장 추천/예약 도우미
  • 북마크로 나만의 맛집 리스트 관리

🕺🏻 Demo

메인 / 매장 탐색

카테고리 / 지역 / 위치 기반으로 맛집들을 둘러보는 화면입니다.


메인 화면



로그인 / 마이페이지

Google 간편 로그인과 사용자의 예약 내역 /리뷰 /쿠폰 관리, 관리자(매장/메뉴/쿠폰) 화면입니다.


로그인 화면



매장 상세 / 예약 / 결제

매장 정보 / 메뉴를 확인하고 원하는 시간의 잔여 좌석을 예약합니다. 결제 화면은 PortOne 연동 카카오페이 서비스입니다.


예약 화면



빈자리 알림

마감된 시간대의 빈자리를 구독하고, 자리가 나면 알림을 받습니다.


빈자리 알림 화면



쿠폰

선착순 쿠폰을 발급받는 화면입니다.


쿠폰 화면



AI 챗봇

Google Gemini 기반 챗봇과 대화하며 예약을 진행합니다.


AI 챗봇 화면




📗 API

API Swagger 이미지


🛠️ System Architecture

System Architecture


🔑 ERD

ERD


💻 Tech Stack

Field Technology of Use
Frontend
Backend
Messaging / Cache
Database
AI
External API
DevOps
Monitoring
Load Test
ETC


📊 Monitoring

Monitoring image 1 Monitoring image 2

📂 Directory Structure

CatchEAT

🗂️ catchtable-clone
┣ 📂 backend                         # Spring Boot 4 (Java 21) REST API
┃ ┣ 📂 src/main/java/com/catchtable
┃ ┃ ┣ 📂 bookmark                    # 북마크 / 즐겨찾기 폴더
┃ ┃ ┣ 📂 chatbot                     # AI 챗봇 (Spring AI + Gemini)
┃ ┃ ┣ 📂 coupon                      # 선착순 쿠폰 (Redis Lua + 분산 락)
┃ ┃ ┣ 📂 file                        # 파일 업로드
┃ ┃ ┣ 📂 menu                        # 메뉴
┃ ┃ ┣ 📂 notification                # 알림 (Kafka)
┃ ┃ ┣ 📂 payment                     # 결제 (PortOne)
┃ ┃ ┣ 📂 remain                      # 잔여 좌석 슬롯
┃ ┃ ┣ 📂 reservation                 # 예약
┃ ┃ ┣ 📂 review                      # 리뷰 / 평점
┃ ┃ ┣ 📂 store                       # 매장 (PostGIS 위치 검색)
┃ ┃ ┣ 📂 user                        # 회원 / 인증
┃ ┃ ┣ 📂 vacancy                     # 빈자리 알림 구독
┃ ┃ ┗ 📂 global                      # config, security, lock, common, exception
┃ ┣ 📂 data                          # 시드 SQL & CSV
┃ ┣ 📂 k6                            # 부하 테스트 시나리오
┃ ┣ 📂 grafana / monitoring / nginx  # 인프라 설정
┃ ┣ 📃 docker-compose.dev.yml
┃ ┣ 📃 docker-compose.prod.yml
┃ ┣ 📃 Dockerfile
┃ ┗ 📃 build.gradle
┗ 📂 frontend                        # Next.js 16 (React 19, TypeScript)
  ┗ 📂 src
    ┣ 📂 app                         # App Router 페이지
    ┣ 📂 components                  # 공통 / 매장 컴포넌트
    ┣ 📂 hooks
    ┣ 📂 lib/api                     # API 클라이언트
    ┣ 📂 stores                      # Zustand 스토어
    ┗ 📂 types


🧐 How to Start

Prerequisites

  • Java 21
  • Docker / Docker Compose
  • Node.js 20+

1. Clone

git clone images/catchtable-clone/backend.git
git clone images/catchtable-clone/frontend.git

2. env setting

  • backend/.env
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_PORT=

GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_PLACES_API_KEY=

JWT_SECRET=
FRONTEND_URL=

GEMINI_API_KEY=
PORTONE_SECRET_KEY=

GRAFANA_USER=
GRAFANA_PASSWORD=
  • frontend/.env
NEXT_PUBLIC_API_URL=
NEXT_PUBLIC_GOOGLE_CLIENT_ID=
NEXT_PUBLIC_KAKAO_MAP_KEY=
NEXT_PUBLIC_PORTONE_STORE_ID=
NEXT_PUBLIC_PORTONE_CHANNEL_KEY=
NEXT_PUBLIC_USE_MOCK=

3. Run Infra & Backend

cd backend
docker compose -f docker-compose.dev.yml up -d   # PostgreSQL · Redis · Kafka
./gradlew bootRun                                # http://localhost:8080

4. Frontend Start

cd frontend
npm install
npm run dev                                       # http://localhost:3000

5. 로컬 환경에서 접속

  • Web: http://localhost:3000
  • Swagger: http://localhost:8080/swagger-ui.html

👨‍👩‍👧‍👦 Team Members

Name 김재범 김동안 이상진 이주희
Profile
Role Backend Backend Backend Backend
GitHub


Popular repositories Loading

  1. backend backend Public

    Java

  2. frontend frontend Public

    TypeScript

  3. .github .github Public

    README.md

Repositories

Showing 3 of 3 repositories

People

This organization has no public members. You must be a member to see who’s a part of this organization.

Top languages

Loading…

Most used topics

Loading…