2025 Co-Ed 캡스톤 디자인 장려상 수상작 기반 · 개인 리메이크

FitFoyo

2026.05 — 2026.08
Next.js 16React 19TypeScriptTailwindCSS 4ZustandReact Hook FormZodNestJS 11Prisma 6PostgreSQL (Neon)OpenAI APITurborepoVercelRailway

Architecture

사용자 자연어

"닭가슴살 먹고 30분 뛰었어"

Function Calling (pass 1)

tool 호출로 기록 작업 결정

서버 CRUD · 칼로리 재계산

식단·운동 레코드 반영

GPT (pass 2)

json 자연어 응답 · 추천 생성

식단 · 운동 레코드

DB 근거 칼로리

맞춤 추천

1인칭 코칭

Introduce

식단·운동을 자연어로 입력하면 AI가 항목을 분류·정산해 기록하고, 달력에서 하루를 한눈에 보여주는 헬스케어 캘린더입니다. 모놀리식 레거시를 TurboRepo 모노레포 + BFF 패턴으로 재설계했고, AI 출력의 신뢰성·비용·보안까지 단독으로 다뤘습니다.

AI가 잘못 계산한 칼로리를 실제 데이터로 바로잡기

LLM 단독 추정 시 칼로리가 실제의 약 3.8배(불닭볶음면 4,000kcal)로 과대계산되던 문제를, 등록 음식은 자체 영양 DB(FoodNutrition)를 기준으로 서버에서 재계산하고 미등록 음식만 LLM 추정으로 폴백하는 하이브리드 구조로 해결했습니다. 보정 결과가 1,061kcal로 고정되는지 검증하는 회귀 테스트로 재발을 차단했고, DB 근거 여부를 "추정" 배지로 사용자에게 정직하게 노출했습니다.

수정 전수정 후

불닭볶음면 2개

before
4000kcal
after
1061kcal

말하듯 적으면 AI가 식단·운동으로 나눠 기록

OpenAI Function Calling으로 1차 패스에서 자연어를 해석해 기록 생성·수정·삭제 작업을 결정하고 서버가 실제 DB에 반영한 뒤, 2차 패스에서 자연어 응답과 맞춤 추천을 생성하는 2-pass 에이전트를 설계했습니다. 병렬 tool 호출로 "닭가슴살 먹고 30분 뛰었어" 같은 혼합 입력을 식단·운동 레코드로 각각 분리했고, 대화 히스토리를 DB 대신 sessionStorage로만 유지해 토큰 비용과 UX의 트레이드오프를 명시적으로 선택했습니다.

달력을 넘겨도 기다림 없이 뜨는 빠른 화면

월을 이동할 때마다 매번 반복되던 약 500~640ms의 데이터 요청을, Zustand 월별 스냅샷 캐시와 인접 월 백그라운드 프리페치로 재설계해 캐시 히트 시 네트워크 요청 없이 즉시 전환되도록 개선했습니다. 통계 화면에서만 사용하는 차트 라이브러리(recharts)를 next/dynamic으로 코드 스플릿해 약 98KB(gzip)를 초기 로드 번들에서 제외했습니다.

수정 전수정 후

월 이동 지연

before
640ms
after
0ms

월 이동 지연은 배포 환경 Network 탭 실측값(캐시 미스 502~638ms → 캐시 히트 시 요청 0)입니다.

Gallery