취향 기반으로 오늘 뭐 먹을지 골라주는 추천 서비스
무엇을 만드나?
MVP 기획 · 19,000원
PRD·기능정의·화면목록·DB·API 계약까지, 개발자에게 바로 넘기는 기획서.
샘플은 여기까지 공개합니다
파일 다운로드와 전문(全文) 복사는 실제 결과물에서만 제공됩니다. 내 아이디어를 입력하면 같은 형식의 결과물을 받아볼 수 있습니다.
취향(맛·카테고리·예산)을 입력하면 어울리는 음식과 음식점 카드를 추천하는 모바일 반응형 웹을 만듭니다. 복잡한 추천 AI 없이 규칙 기반 매칭으로 '추천이 실제로 선택을 돕는가'를 먼저 검증합니다. 지도·예약·결제는 다음 단계로 미룹니다.
매번 메뉴를 고르는 피로를 줄여주는 취향 기반 AI 음식 추천 서비스. 사용자가 현재 상황(기분·카테고리·지역)을 간단히 입력하면, Firestore에 등록된 음식·음식점 데이터를 기반으로 규칙 기반 필터링 추천 결과를 보여주고, 마음에 드는 항목을 저장할 수 있다.
목표
비목표(1차 제외)
Google 소셜 로그인 / 로그아웃
“사용자로서 Google 계정으로 1클릭 로그인하여 내 취향 저장 목록을 개인화하고 싶다.”
취향 입력 (규칙 기반 필터 파라미터 수집)
“사용자로서 카테고리·기분·지역을 간단히 선택하여 지금 나에게 맞는 음식 추천을 받고 싶다.”
규칙 기반 음식·음식점 추천
“사용자로서 내가 선택한 취향에 맞는 음식과 음식점 카드를 즉시 확인하고 싶다.”
관심 항목 저장 / 저장 취소
“사용자로서 마음에 드는 음식점 카드를 저장하고 나중에 다시 확인하고 싶다.”
저장 목록 조회
“사용자로서 내가 저장한 음식점 카드를 모아보고 빠르게 재확인하고 싶다.”
관리자 음식·음식점 데이터 등록
“관리자로서 음식과 음식점 데이터를 웹 화면에서 직접 등록하여 추천 풀을 관리하고 싶다.”
취향 입력·규칙 기반 추천·저장·관리자 데이터 등록. 지도/예약/결제 제외.
1단계 — 기반
셋업, 추천 데이터 모델, 관리자 등록
2단계 — 추천 흐름
취향 입력·추천 결과·음식점 카드·저장
3단계 — 다듬기·배포
피드백 반영·QA·배포
견적 참고 · 규칙 기반 기준. ML 추천·지도 연동은 검증 후 별도 견적.
랜딩 페이지 /
HeroSection: 서비스 소개 문구 + CTA 버튼('지금 추천 받기') · GoogleLoginButton: Firebase Auth Google 팝업 트리거, 비로그인 시 표시 · NavBar: 로고 + 로그인 상태에 따라 '저장 목록' 링크 또는 로그아웃 버튼
상태: isLoggedIn: boolean — 로그인 여부에 따라 CTA 버튼 목적지를 /preference 또는 /preference 로 동일하게 유지(로그인 불필요 진입 허용), authLoading: boolean — Auth 초기화 중 버튼 비활성화
취향 입력 페이지 /preference
CategorySelector: 한식·중식·일식·양식·분식 단일 선택 칩 그룹 · MoodSelector: 든든하게·가볍게·매콤하게·달콤하게 단일 선택 칩 그룹 · AreaInput: 지역 텍스트 입력 필드 (placeholder: '예: 강남, 홍대') · SubmitButton: 모든 항목 선택 완료 시 활성화, 클릭 시 /results?category=...&mood=...&area=... 로 라우팅
상태: selectedCategory: string | null, selectedMood: string | null, area: string, isFormValid: boolean — 세 항목 모두 입력 시 true
추천 결과 페이지 /results
FilterSummaryBar: 선택된 카테고리·기분·지역 표시 + '다시 입력' 버튼 · RestaurantCardList: 추천 음식점 카드 최대 10건 리스트 · RestaurantCard: 음식명·카테고리·음식점명·지역·하트(저장) 버튼 · EmptyState: 결과 0건 시 안내 메시지 + 재입력 버튼 · SkeletonCard: 로딩 중 플레이스홀더 3개
상태: results: RestaurantCard[] — 서버사이드 필터링 결과, isLoading: boolean, savedIds: Set<string> — 현재 로그인 사용자의 저장된 restaurant_id 집합, 하트 상태 동기화용, loginPromptOpen: boolean — 비로그인 하트 클릭 시 모달 표시
저장 목록 페이지 /saved
SavedCardList: 저장된 항목 카드 목록 (savedAt 내림차순) · SavedCard: 음식명·카테고리·음식점명·지역·하트 해제 버튼 · EmptyState: 저장 항목 없을 시 '아직 저장한 항목이 없습니다' + '추천 받기' 링크
상태: savedItems: SavedItem[] — Firestore saved_items 쿼리 결과, isLoading: boolean, authGuard: 비로그인 접근 시 / 로 redirect (Next.js middleware 처리)
관리자 데이터 등록 페이지 /admin
AdminGuard: role !== 'admin' 시 홈 리다이렉트 처리 (서버 컴포넌트에서 검증) · TabGroup: '음식 등록' / '음식점 등록' 탭 전환 · FoodForm: name(텍스트)·category(셀렉트)·tags(쉼표 구분 텍스트) 입력 + 등록 버튼 · RestaurantForm: name(텍스트)·area(텍스트)·food_id(등록된 foods 드롭다운 선택) 입력 + 등록 버튼 · ToastNotification: 등록 성공/실패 메시지
상태: activeTab: 'food' | 'restaurant', foodForm: { name: string; category: string; tags: string }, restaurantForm: { name: string; area: string; food_id: string }, foodOptions: Food[] — RestaurantForm food_id 드롭다운용, submitting: boolean, toast: { message: string; type: 'success' | 'error' } | null
users
foods
restaurants
saved_items
# API / 서버 액션 계약 > 스택: Next.js App Router Server Actions + Cloud Firestore > 인증: Firebase Auth (ID Token → 서버에서 `admin.auth().verifyIdToken()` 검증) > 시크릿: `FIREBASE_SERVICE_ACCOUNT_KEY` 등 모든 키는 서버 환경변수에만 보관, 클라이언트 노출 금지 --- ## 1. 취향 저장 (사용자 프로필 업데이트)
나머지 122줄은 실제 결과물에서 확인할 수 있습니다
# 주요 의사결정 & 리스크·대응 --- ## 의사결정 ### D-01. 추천 엔진: 단순 태그 필터링 (ML 없음) - **결정**: `foods.tags` ∩ `users.preferences.tags` 배열 교집합 기반 필터링 - **근거**: ML 모델은 MVP 범위 초과. 데이터 축적 전 정확도 검증 불가. 규칙 기반으로 충분히 검증 가능
나머지 42줄은 실제 결과물에서 확인할 수 있습니다
# 수용 테스트 / QA 체크리스트 > 테스트 환경: Firebase Emulator Suite (Auth + Firestore) + Next.js 개발 서버 > 우선순위: 🔴 필수 · 🟡 권장 · 🟢 선택 --- ## 1. 인증 (Firebase Auth)
나머지 78줄은 실제 결과물에서 확인할 수 있습니다
M0프로젝트 초기화 및 환경 설정
M1Firestore 스키마 배포 및 시드
M2Firebase Auth 연동 및 사용자 흐름
M3취향 입력 및 음식 추천 기능
M4관심 저장 및 저장 목록 기능
M5관리자 데이터 등록 화면
M6랜딩 페이지 및 UI 완성
M7배포 및 MVP 검증
이 문서는 개발자에게 그대로 전달할 수 있는 기획서입니다.