사용자의 식단 목표, 예산, 선호도,
알레르기, 조리 난이도를 반영하여
식단 스타일 추천부터 월간 식단, 대체 메뉴, 장보기 정보까지 연결합니다.
|
🎯 핵심 목표 오늘의 끼니는 단순히 메뉴를 추천하는 서비스가 아니라, 사용자 조건을 기반으로 식단 스타일 후보 → 월간 식단 → 대체 메뉴 → 식료품 구매 정보까지 연결하는 흐름을 목표로 합니다. |
| 문제 상황 | 사용자 불편 |
|---|---|
| 🍽️ 메뉴 결정 | 매일 무엇을 먹을지 고민하는 데 시간이 오래 걸림 |
| 💰 예산 관리 | 월 식비 안에서 여러 끼니를 구성하기 어려움 |
| 🥗 영양 고려 | 영양 균형과 개인 선호를 함께 고려하기 어려움 |
| 알레르기 및 제외 재료를 메뉴마다 확인해야 함 | |
| 🛒 장보기 | 필요한 재료와 상품 가격을 직접 비교해야 함 |
| 기존 서비스 | 오늘의 끼니 |
|---|---|
| ✍️ 사용자가 먹은 식단을 직접 기록 | ✨ 사용자 조건 기반 식단 자동 추천 |
| 🔍 개별 메뉴 또는 레시피 검색 중심 | 📅 식단 스타일과 월간 식단 단위 구성 |
| 🔁 메뉴 반복 및 장기 구성을 사용자가 관리 | ⚙️ 추천·최적화 엔진을 통한 다양성 및 반복 제어 |
| 📖 레시피 제공에 집중 | 🛒 식단과 식재료 구매 흐름 연결 |
| 👤 단일 사용자 조건 중심 | 👨👩👧👦 가구 형태와 가구원 정보까지 반영 |
- 식단 목표, 월 예산, 활동량, 요리 실력 입력
- 선호 음식과 비선호 재료 설정
- 알레르기 및 제외 재료 기반 메뉴 필터링
- 가구 형태와 가구원 정보를 반영한 사용자 설정
- 사용자 조건 기반 페르소나 후보 추천
- 사용자 조건에 맞는 식단 스타일 후보 제공
- 선택한 스타일을 기반으로 월간 식단 최적화
- 끼니별 대체 메뉴 후보 제공
- 일별·월별 식단 캘린더 조회
- 메뉴별 영양 성분과 상세 정보 제공
- 특정 날짜와 끼니의 메뉴 변경
- 기존 식단의 균형을 고려한 대체 메뉴 제공
- 식단 만족도 및 사용자 피드백 저장
- 피드백을 활용한 추천 고도화 기반 마련
- 식단에 필요한 재료 목록 구성
- 재료별 상품 및 가격 정보 조회
- 선택한 식재료를 장보기 목록에 추가
- 장보기 완료 여부와 예상 비용 관리
- 삭제한 장보기 항목 복원 지원
- 게스트 로그인 지원
- Google, Kakao, Naver 소셜 로그인
- Access Token과 Refresh Token 기반 인증
- 로그아웃 및 회원 탈퇴 시 토큰 무효화
- 사용자 프로필과 온보딩 설정 관리
회원가입 및 로그인
→ 사용자·가구 정보 입력
→ 추천 페르소나 및 식단 스타일 선택
→ 월간 식단 생성 요청
→ 식단 생성 상태 조회
→ 월간 캘린더 및 메뉴 상세 확인
→ 대체 메뉴 선택
→ 장보기 목록 생성 및 가격 확인
→ 식단 피드백 등록
월간 식단 생성과 같이 처리 시간이 긴 작업은 비동기로 수행하며, Frontend는 작업 ID를 사용해 생성 상태를 주기적으로 조회합니다.
오늘의 끼니는 Frontend, Backend, Modeling, RAG를 역할별로 분리하고, 각 파트를 API 기반으로 연결한 구조입니다.
Frontend
└── Flutter 기반 사용자 화면
↓ JSON API
Backend
├── FastAPI 기반 API 서버
├── OAuth2 및 JWT 인증
├── Celery 비동기 작업 처리
├── Redis 작업 큐·캐싱·분산 락
└── SQLAlchemy 기반 PostgreSQL 저장
↓ JSON API
Modeling
├── Profile Builder
├── RAG Candidate Request & Fallback
├── Scoring Engine
├── Monthly Plan Optimizer
├── MMR Alternative Re-ranking
└── Plan Quality Validator
↕ JSON API
RAG
├── Ollama 기반 데이터 가공
├── Neo4j 지식 그래프
└── GraphRAG 기반 후보 메뉴 검색
| 파트 | 주요 역할 |
|---|---|
| 📱 Frontend | 사용자 입력, 온보딩, 식단 캘린더, 메뉴 상세 및 장보기 화면 제공 |
| ⚙️ Backend | 인증, 요청 검증, 비동기 작업 처리, 캐싱, 데이터 저장 및 파트 간 API 연동 |
| 🧠 Modeling | 사용자 프로필 생성, 후보 메뉴 평가, OR-Tools 기반 월간 대표 식단 최적화, MMR 기반 대안 메뉴 다양화 및 결과 검증 |
| 🕸️ RAG | 레시피·재료·영양 관계 데이터를 기반으로 후보 메뉴를 검색하고 Modeling에 제공 |
| 🚀 Infrastructure | Docker 기반 실행 환경, AWS EC2 배포, Nginx HTTPS 연결 및 Prometheus·Grafana 모니터링 |
|
💡 구조 핵심 월간 식단 생성과 같이 처리 시간이 긴 요청은 Backend에서 Celery 작업으로 분리합니다. Redis는 작업 큐, 캐싱 및 분산 락에 사용하며, 생성된 식단 결과는 PostgreSQL에 저장합니다. 운영 환경에서는 Docker와 AWS EC2를 기반으로 서비스를 실행하고, Nginx를 통해 외부 요청을 전달합니다. Modeling API의 요청 수, 오류율 및 응답시간 지표는 Prometheus가 수집하고 Grafana에서 시각화합니다. |
| 기술 | 사용 목적 |
|---|---|
| Flutter | 크로스 플랫폼 모바일 애플리케이션 |
| Riverpod | 화면 및 비동기 상태 관리 |
| Dio | Backend API 통신 |
| go_router | 화면 라우팅 |
| Figma | UI·UX 설계 및 프로토타입 제작 |
| 기술 | 사용 목적 |
|---|---|
| Python 3.13 | Backend 개발 언어 |
| FastAPI | REST API 서버 |
| Pydantic V2 | 요청·응답 데이터 검증 |
| SQLAlchemy | ORM 기반 데이터 접근 |
| PostgreSQL | 사용자·식단·장보기 데이터 저장 |
| Redis | 작업 큐, 캐싱, 분산 락 및 토큰 블랙리스트 |
| Celery | 식단 생성 비동기 작업 처리 |
| HTTPX | Modeling 등 외부 API 통신 |
| OAuth2 / JWT | 소셜 로그인 및 사용자 인증 |
| 기술 | 사용 목적 |
|---|---|
| Python 3.11 | 추천 및 식단 최적화 엔진 |
| FastAPI | Backend와 분리된 독립 Modeling API 제공 |
| Pydantic | 사용자 입력과 Modeling API 요청·응답 스키마 검증 |
| Weighted Scoring | 예산·영양·선호도·조리 난이도·다양성을 반영한 메뉴별 Final Score 계산 |
| OR-Tools | 예산·필수 끼니·반복 조건을 고려한 월간 대표 메뉴 최적화 |
| MMR | OR-Tools가 확정한 대표 메뉴별 대안 메뉴 재정렬 및 다양성 제어 |
| Snapshot / Replay | 동일 입력을 기준으로 정책 변경 전후의 품질과 회귀 여부 검증 |
| Prometheus | Modeling API 요청 수, 오류 및 응답 시간 지표 수집 |
| 기술 | 사용 목적 |
|---|---|
| Python 3.11 | 데이터 파이프라인 및 API 구현 |
| LangChain / GraphRAG | 벡터·그래프 기반 복합 검색 |
| Neo4j | 메뉴·재료·영양 관계 지식 그래프 |
| Vector DB | 메뉴와 레시피 임베딩 검색 |
| Ollama / Gemma 2 | 레시피 및 관계 데이터 가공 |
| Chromium Automation | 레시피와 영양 데이터 수집 |
| 기술 | 사용 목적 |
|---|---|
| Docker / Docker Compose | 파트별 실행 환경 표준화 |
| GitHub Actions | 테스트, 이미지 빌드 및 배포 자동화 |
| AWS EC2 | Backend 및 Modeling 서버 운영 |
| AWS RDS | PostgreSQL 운영 데이터베이스 |
| GHCR | Docker 이미지 저장 |
| Nginx / HTTPS | Reverse Proxy 및 외부 통신 보호 |
todays_ggini/
├── frontend/
│ └── today-s_kkini/ # Flutter 모바일 애플리케이션
│
├── backend/ # FastAPI API 및 비동기 처리 서버
│
├── modeling/ # 추천·식단 최적화 엔진 및 Modeling API
│
├── rag/ # 데이터 수집, 지식 그래프 및 후보 검색
│
├── scripts/ # 공통 실행 및 검증 스크립트
│
├── assets/
│ └── images/ # README 및 프로젝트 소개 이미지
│
├── Dockerfile.modeling
├── docker-compose.modeling.yml
└── README.md
|
⭐ 파트별 세부사항 각 파트의 내부 모듈 구조와 구현 세부 사항은 해당 파트 README에서 확인할 수 있습니다. |
| 파트 | 문서 | 주요 내용 |
|---|---|---|
| 📱 Frontend | frontend/today-s_kkini/README.md |
화면 구성, 상태 관리 및 API 연동 |
| ⚙️ Backend | backend/README.md |
인증, 데이터베이스, 비동기 처리 및 API |
| 🧠 Modeling | modeling/README.md |
프로필 생성, 후보 평가, OR-Tools 최적화, MMR 대안 메뉴 구성, 품질 검증 및 Modeling API |
| 🕸️ RAG / Data | rag/readme.md |
데이터 수집, Neo4j, GraphRAG 및 후보 검색 |
루트 README는 오늘의 끼니 서비스의 전체 구조와 사용자 흐름을 설명하며, 파트별 상세 구현은 각 디렉터리의 README에서 관리합니다.
git clone https://github.com/hekim-cse/todays_ggini.git
cd todays_gginipython3.13 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r backend/requirements.txt
PYTHONPATH=.:backend:modeling \
python -m uvicorn app.main:app \
--app-dir backend \
--reloadBackend API 문서:
http://127.0.0.1:8000/docs
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r modeling/requirements.txt로컬 Modeling API 실행:
ENV=local \
PYTHONPATH=modeling \
RAG_API_URL="https://api.kkini.cloud/api/v1/meal-candidates" \
python -m uvicorn api.server:app \
--host 0.0.0.0 \
--port 8001 \
--reloadModeling API 문서:
http://127.0.0.1:8001/docs
상태 확인:
curl http://127.0.0.1:8001/healthDocker 실행:
MODELING_API_KEY=local-secret-key \
docker compose \
-f docker-compose.modeling.yml \
up --buildcd frontend/today-s_kkini
flutter pub get
flutter runcd rag
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python api_server.py파트별 실행에 필요한 환경변수와 상세 설정은 각 파트 README를 참고합니다.
| Method | Endpoint | 설명 |
|---|---|---|
POST |
/api/v1/auth/guest/init |
게스트 세션 생성 |
POST |
/api/v1/auth/google |
Google 로그인 |
POST |
/api/v1/auth/kakao |
Kakao 로그인 |
POST |
/api/v1/auth/naver |
Naver 로그인 |
POST |
/api/v1/auth/refresh |
Access Token 재발급 |
GET |
/api/v1/user/me |
사용자 정보 조회 |
| Method | Endpoint | 설명 |
|---|---|---|
POST |
/api/v1/meal/generate |
월간 식단 비동기 생성 요청 |
GET |
/api/v1/meal/generate/status/{job_id} |
식단 생성 상태 조회 |
POST |
/api/v1/meal/confirm |
생성된 식단 확정 |
GET |
/api/v1/meal/calender |
월간 식단 캘린더 조회 |
GET |
/api/v1/meal/{date} |
일일 식단 조회 |
POST |
/api/v1/meal/{date}/swap |
메뉴 변경 |
POST |
/api/v1/meal/feedback |
식단 피드백 저장 |
| Method | Endpoint | 설명 |
|---|---|---|
GET |
/api/v1/shopping/ingredients/{ingredient_id}/prices |
재료별 가격 조회 |
POST |
/api/v1/shopping/add-shopping-items |
장보기 항목 추가 |
GET |
/api/v1/shopping/shopping-list |
장보기 목록 조회 |
PATCH |
/api/v1/shopping/shopping-list/items/check |
구매 상태 변경 |
POST |
/api/v1/shopping/shopping-list/items/batch-delete |
장보기 항목 삭제 |
POST |
/api/v1/shopping/shopping-list/items/restore |
삭제 항목 복원 |
대표적인 식단 생성 흐름은 다음과 같습니다.
Frontend
→ Backend 식단 생성 요청
→ Celery 작업 등록 및 job_id 반환
→ Modeling API 호출
→ 사용자 프로필 생성
→ RAG 메뉴 후보 요청 및 Fallback
→ Soft Scoring 및 Final Score 계산
→ Final Score 상위 후보와 저비용 후보 병합
→ OR-Tools 기반 월간 대표 메뉴 최적화
→ MMR 기반 대안 메뉴 재정렬
→ Plan Quality Validator 검증
→ PostgreSQL 저장
→ Frontend Polling
→ 생성된 식단 표시
본 프로젝트는 Pull Request 기반으로 협업합니다.
main
└── 최종 배포 및 릴리즈 브랜치
develop
└── 통합 개발 브랜치
feat/*
fix/*
refactor/*
docs/*
└── 기능별 작업 브랜치
git checkout develop
git pull origin develop
git checkout -b feat/담당파트-작업명작업 브랜치 생성
→ 구현 및 테스트
→ Commit 및 Push
→ Pull Request 생성
→ 팀원 Review
→ develop 병합
→ 작업 브랜치 삭제
| 타입 | 설명 | 예시 |
|---|---|---|
feat |
기능 추가 | feat: 월간 식단 생성 API 추가 |
fix |
오류 수정 | fix: 메뉴 변경 응답 누락 수정 |
refactor |
구조 및 코드 개선 | refactor: 사용자 모델 구조 분리 |
docs |
문서 수정 | docs: 통합 README 수정 |
test |
테스트 추가 및 수정 | test: Modeling 오류 응답 테스트 추가 |
chore |
설정 및 기타 작업 | chore: Docker 실행 환경 수정 |




