# 🍽️ 모임자리 (MoimJari) 실전 프로덕트 기획서
> **"5인 이상 모임 장소, 10초 만에 찾고 공유까지"**  
> 1인 개발자가 실제로 개발·배포하고 운영까지 굴릴 수 있도록 구체화한 실전 실행 기획서

---

## 1. 📋 서비스 개요 (Overview)

### 1.1 서비스 기본 정보 및 정체성
- **서비스명**: **모임자리 (MoimJari)**
- **한 줄 슬로건**: *"5인 이상 모임 장소, 10초 만에 찾고 공유까지"*
- **서비스 정의 및 정체성 (Identity)**:
  - 5~15인 규모의 회식, 동아리 뒤풀이, 청첩장 모임 주최자를 위한 **단체 맞춤형 식당 탐색 및 의사결정 워크플로우 웹 툴**

### 1.2 주요 타깃 (Target Audience)
- **1차 타깃 (Core)**: 
  - 팀 회식 장소를 섭외하고 상사에게 보고해야 하는 **2030 직장인 막내 및 팀 총무**
- **2차 타깃 (Sub)**: 
  - 동아리 뒤풀이, 청첩장 모임, 동문회, 스터디 등 **5~15인 규모 단체 모임을 조율하는 주최자**

### 1.3 초기 타깃 권역
- **서울 3대 핵심 오피스 권역 (초기 검증된 100개 매장)**:
  - **강남/역삼 (40곳)**: IT·스타트업 및 대기업 회식의 중심지
  - **여의도 (30곳)**: 금융권 및 프라이빗 룸/콜키지 프리 수요 집중지
  - **광화문/종로 (30곳)**: 전통적인 공공기관·대기업 관통 회식 상권

---

## 2. 💎 4대 핵심 가치 (Core Values)

| 핵심 가치 | 해결하는 문제 (Problem) | 유저 체감 효용 (Benefit) |
| :--- | :--- | :--- |
| **초정밀 조건 매칭** | 대형 지도 앱에 없는 "룸 문 닫힘 여부", "콜키지 규정"의 부재 | **검색 필터 3번 클릭으로 원하는 조건 100% 충족** |
| **조율 리소스 제로** | 단톡방에서 "다들 어디 가고 싶어?" 물어보고 하염없이 기다리는 고통 | **1초 만에 익명 투표 링크 생성, 3분 안에 다수결 종결** |
| **보고 피로도 제거** | 식당 3곳 링크 일일이 복사해서 가격/위치 손수 타이핑하는 번거로움 | **[공유 텍스트 복사] 한 번으로 정돈된 메신저 포맷 자동 생성** |
| **예약 실패 방지** | 예약 당일 "룸이 아니라 파티션이었네?"라는 당혹감 | **룸 형태(밀폐형/오픈형)와 최소 주문 금액 명확 표기로 검증 완료** |

---

## 3. 📱 구체적인 화면 흐름 및 UX 설계 (User Flow)

사용자가 사이트에 접속해 단톡방에 공유하기까지의 과정은 **3번의 화면 전환 이내**로 완료됩니다.

```
[1. 메인 검색 홈]
   │  - 지역 선택 (강남 / 여의도 / 광화문)
   │  - 인원수 칩 선택 (6인, 8인, 10인, 15인 이상)
   │  - 핵심 필터 토글 ([✓ 단독 룸] [✓ 콜키지 프리] [✓ 주차 가능])
   ▼
[2. 검색 결과 피드 & 멀티 셀렉트]
   │  - 매장 카드 목록 노출 (룸 형태 태그, 1인 예상 가격대 표시)
   │  - 식당 카드 우측 상단 체크박스(☑)로 최대 3곳 선택
   │  - 하단 플로팅 바 활성화: "2곳 선택됨"
   ▼
[3. 액션 (선택)]
   ├─▶ [📋 보고서 복사]: 클릭 즉시 메신저용 포맷 클립보드 복사 (토스트 알림 노출)
   └─▶ [🗳️ 투표 링크 만들기]: 1초 만에 고유 URL 생성 후 단톡방 공유
```

---

## 4. 🛠️ 현실적인 초기 데이터 파이프라인 (병목 해결)

처음부터 1,000개 매장을 채우려 하면 오픈도 못 하고 지칩니다. **검증된 핵심 매장 100개**로 시작하는 것이 정답입니다.

### 4.1 수집 범위 (총 100곳)
- **강남/역삼**: 40곳
- **여의도**: 30곳
- **광화문/종로**: 30곳

### 4.2 데이터 수집 3단계 프로세스
1. **기본 데이터 자동 수집 (카카오 로컬 API)**:
   - 식당명, 도로명 주소, 지번, 위경도 좌표, 전화번호, 대표 카테고리(고기/일식/중식 등)를 자동으로 가져와 DB에 적재합니다.
2. **특화 메타데이터 수동 입력 (구글 스프레드시트 활용)**:
   - 100개 매장에 대해 *룸 여부(문닫힘/파티션)*, *최대 수용 인원*, *콜키지 규정*, *인당 예산대*, *캐치테이블/네이버예약 URL*을 스프레드시트에 직접 기입합니다. (1인 기준 약 3~4시간 소요)
   - 이 시트를 CSV/JSON으로 추출해 DB로 일괄 마이그레이션(Import)합니다.
3. **데이터 유지보수 (크라우드소싱)**:
   - 매장 카드 하단에 작은 글씨로 **[정보 수정 제보]** 버튼을 두어 점주나 사용자가 변경된 콜키지/룸 규정을 1초 만에 제보하도록 유도합니다.

---

## 5. 🗄️ 데이터베이스 테이블 스키마

복잡한 다대다 관계를 피하고 단일 쿼리로 빠르게 필터링할 수 있는 실전형 단일 테이블 구조입니다.

### 5.1 PostgreSQL / Supabase 기준

```sql
-- 1. 식당 기본 및 회식 메타데이터 통합 테이블
CREATE TABLE places (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(100) NOT NULL,
    district VARCHAR(20) NOT NULL,        -- 'GANGNAM', 'YEOUIDO', 'GWANGHWAMUN'
    subway_station VARCHAR(50),           -- 예: '강남역 12번 출구 도보 3분'
    category VARCHAR(50),                 -- '소고기/돼지고기', '일식/숙성회', '중식', '양식/와인'
    address VARCHAR(255) NOT NULL,
    latitude DECIMAL(10, 7),
    longitude DECIMAL(10, 7),
    phone VARCHAR(30),
    
    -- 회식 특화 조건 컬럼
    room_type VARCHAR(20) NOT NULL,       -- 'CLOSED'(완전밀폐형), 'PARTITION'(가벽), 'NONE'(홀 단체석)
    max_room_capacity INT NOT NULL,       -- 최대 룸 수용 인원 (예: 12)
    corkage_type VARCHAR(20) NOT NULL,    -- 'FREE', 'PAID', 'UNAVAILABLE'
    corkage_info VARCHAR(100),            -- 예: '와인 병당 2만 원 / 위스키 불가'
    price_per_person INT NOT NULL,        -- 1인 예상 평균 단가 (예: 65000)
    has_parking BOOLEAN DEFAULT FALSE,
    is_meat_grilled BOOLEAN DEFAULT FALSE,-- 고기 구워주는지 여부
    
    -- 아웃링크
    booking_url VARCHAR(255),             -- 캐치테이블 or 네이버예약 링크
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- 2. 비회원 간이 투표 테이블
CREATE TABLE polls (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- 3. 투표 후보 매장 및 득표수 관리
CREATE TABLE poll_options (
    id SERIAL PRIMARY KEY,
    poll_id UUID REFERENCES polls(id) ON DELETE CASCADE,
    place_id UUID REFERENCES places(id) ON DELETE CASCADE,
    vote_count INT DEFAULT 0
);
```

### 5.2 MariaDB 11.8 (KGT2 서버 호환)

```sql
-- 1. 식당 기본 및 회식 메타데이터 통합 테이블
CREATE TABLE IF NOT EXISTS places (
    id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
    name VARCHAR(100) NOT NULL,
    district VARCHAR(20) NOT NULL,
    subway_station VARCHAR(50),
    category VARCHAR(50),
    address VARCHAR(255) NOT NULL,
    latitude DECIMAL(10, 7),
    longitude DECIMAL(10, 7),
    phone VARCHAR(30),
    room_type VARCHAR(20) NOT NULL,
    max_room_capacity INT NOT NULL,
    corkage_type VARCHAR(20) NOT NULL,
    corkage_info VARCHAR(100),
    price_per_person INT NOT NULL,
    has_parking TINYINT(1) DEFAULT 0,
    is_meat_grilled TINYINT(1) DEFAULT 0,
    booking_url VARCHAR(255),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2. 비회원 간이 투표 테이블
CREATE TABLE IF NOT EXISTS polls (
    id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3. 투표 후보 매장 및 득표수 관리
CREATE TABLE IF NOT EXISTS poll_options (
    id INT AUTO_INCREMENT PRIMARY KEY,
    poll_id CHAR(36) NOT NULL,
    place_id CHAR(36) NOT NULL,
    vote_count INT DEFAULT 0,
    FOREIGN KEY (poll_id) REFERENCES polls(id) ON DELETE CASCADE,
    FOREIGN KEY (place_id) REFERENCES places(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```

---

## 6. 💻 권장 기술 스택 (1인 개발 생산성 극대화)

- **Frontend**: **Next.js (App Router) + Tailwind CSS + shadcn/ui** (또는 Vue 3 + Tailwind CSS)
  - 모바일과 PC 모두 대응하는 반응형 UI를 가장 빠르게 구성 가능.
- **Backend & DB**: **Supabase (PostgreSQL)** 또는 **PHP 8.5 + MariaDB 11.8 (KGT2 환경)**
  - 복잡한 백엔드 API 서버를 따로 구축할 필요 없이 클라이언트/서버 액션 또는 경량 REST API로 처리.
- **배포 & 인프라**: **Vercel** 또는 **Ubuntu Server 26.04 + Nginx (현재 KGT2 라이브 서버)**
  - 커밋 한 번으로 도메인(`moimjari.kr` / `moimjari.com`) 연결 및 무중단 배포.

---

## 7. ⚡ 대형 지도/예약 앱과의 차별화 포인트

| 구분 | 대형 지도/예약 앱 (네이버 지도, 캐치테이블) | **모임자리 (MoimJari)** |
| :--- | :--- | :--- |
| **서비스 초점** | 1~2인 데이트, 핫플 맛집, 실시간 웨이팅 | **5~15인 단체 모임, 회식 의사결정 및 조율** |
| **필터 조건** | 단순 음식 종류, 평점, 위치 위주 | **룸 문 닫힘 여부, 콜키지 규정, 인당 예산, 그릴링/법카 편의** |
| **협업 / 공유** | 개별 링크 1개씩 단독 공유 | **후보 3곳 비교 텍스트 자동 작성 & 간이 투표 링크 지원** |
| **플랫폼 구조** | 자체 POS 예약 수수료 기반 영업 모델 | **가벼운 웹 기반 애그리게이터 & 아웃링크 연결** |
| **유저 경험** | 장소 탐색 후 단톡방에서 수기로 다시 정리 | **탐색부터 팀원 합의까지 한 페이지에서 종결** |

---

## 8. 📅 2주 론칭 마일스톤 (Action Plan)

| 일정 | 목표 작업 | 핵심 산출물 |
| :--- | :--- | :--- |
| **Day 1~3** | **데이터 구축 & DB 세팅** | 강남/여의도/광화문 100개 매장 시트 정리, Supabase/MariaDB 테이블 생성 및 데이터 적재 |
| **Day 4~7** | **프론트엔드 필터 & 검색 구현** | 지역/인원/룸/콜키지 다중 조건 필터링 쿼리 완성, 매장 카드 리스트 뷰 제작 |
| **Day 8~10** | **킬러 기능 구현** | 식당 멀티 셀렉트 기능, 클립보드 보고서 텍스트 생성기, 모달 투표 링크 생성기 |
| **Day 11~12** | **모바일 반응형 최적화 & QA** | 카카오톡 인앱 브라우저 및 스마트폰 화면 비율 점검, 복사 인터랙션 테스트 |
| **Day 13~14** | **배포 & 도메인 연결** | 배포 완료, 도메인 DNS 연결, 블라인드/직장인 오픈채팅방 공유 |

---

## 9. 📣 초기 유저 유입(배포 첫 주) 실행 방안

기능이 완성되면 복잡한 마케팅 대신 **직장인들이 모여 있는 곳에 '해결책' 형태로 배포**합니다.

1. **블라인드(Blind) 이직/회사생활 라운지**:
   - **제목**: *"팀 회식 장소 찾을 때 룸/콜키지 필터링 귀찮아서 직접 만든 사이트 공유함"*
   - **내용**: 30분 동안 찾던 시간 10초로 줄였다는 실제 경험담과 함께 링크 공유 (자연스러운 바이럴 유도).
2. **사내 메신저(슬랙/팀즈) 내 유틸리티 채널**:
   - 본인 회사 및 지인들 회사의 자유게시판/잡담 채널에 투표 링크와 함께 유틸리티로 공유.

---

## 10. 🔭 비전 및 중장기 로드맵 (Vision & Roadmap)

- **Step 1 (초기 론칭)**: 100개 핵심 매장 검증 및 블라인드/사내망 바이럴로 '칼퇴 유틸리티' 포지셔닝.
- **Step 2 (기능 확장)**: 모임 후 결제를 위한 **1/N 정산 계산기 (영수증 OCR 분할)** 탑재 및 식당 상단 스폰서 핀.
- **Step 3 (플랫폼화)**: 전국 주요 광역시 단체 모임 DB 확장 및 기업 사내망 복지 B2B 솔루션 도약.

---
*문서 버전: v0.7 · KGT2 바이브코딩 프로젝트 · 모임자리 (MoimJari)*
