2026 PROJECT / AI · Computer Vision · 일상·건강

찍고먹어요

냉장고 사진 한 장에서 시작하는 식재료 인식과 요리 추천

개발자 지주우공개일 2026. 06. 22.영상 4:13
Spring BootReactFastAPIGeminiJavaPythonJavaScriptMariaDBRedisPineconeAWSDockerNginxJPAJWT
재생이 어려운 경우 원본 영상을 확인하세요.YouTube에서 보기 (새 탭)

ABOUT THE PROJECT

프로젝트 소개

찍고먹어요는 냉장고 사진 한 장으로 식재료를 자동 인식하고 요리를 추천해주는 AI 기반 냉장고 식료품 분석 및 요리 추천 서비스입니다.

사용자는 냉장고 사진을 업로드하면 AI가 식재료를 자동으로 인식하고, 보유 재료 기반의 레시피를 추천합니다. 사용자는 인식된 식재료를 직접 교정할 수 있으며, 교정된 결과를 기반으로 최적의 레시피를 제안합니다.

프론트엔드에서는 AVIF 등 비표준 이미지 포맷을 Canvas API를 활용해 JPEG로 변환한 뒤 업로드하는 방식을 적용하여 다양한 기기 환경을 지원합니다. 이미지 업로드는 Spring Boot에서 AWS S3 Presigned URL을 발급받아 브라우저가 S3에 직접 PUT 요청하는 방식으로 구현하여 서버 부하를 최소화했습니다.

AI 서비스는 FastAPI와 Python 기반으로 구성되었으며, Google Gemini API를 활용해 냉장고 이미지 내 식재료 객체 인식 및 분석, 선택한 레시피의 YouTube 영상 직접 분석을 통한 조리 단계 타임라인 생성을 수행합니다. Gemini API 호출 시 503·429 응답에 대해 지수 백오프(Exponential Backoff) 기반 재시도 로직을 적용하여 서비스 안정성을 확보했습니다. 또한 Pinecone 벡터 DB와 연동하여 식품 영양 정보 유사도 검색을 수행합니다.

레시피 선택 후 사용자는 조리 타임라인 페이지에서 YouTube 영상과 AI가 생성한 단계별 조리 가이드를 동시에 확인할 수 있으며, 각 단계 클릭 시 해당 영상 구간으로 자동 이동합니다. 부족한 재료는 Naver 쇼핑 API를 통해 검색하고 장바구니에 담을 수 있습니다.

인증은 JWT 기반으로 구현하였으며, Access Token과 Refresh Token을 모두 HttpOnly + Secure + SameSite=Lax 쿠키로 발급하여 XSS 공격에 대한 보안성을 확보했습니다. Access Token은 Redis 블랙리스트(BL:AT:{jti}) 기반으로 로그아웃 후 재사용을 차단하고, Refresh Token은 Redis 화이트리스트(RT:{userId})에 저장하여 RTR(Refresh Token Rotation) 방식으로 재사용 공격을 방지했습니다. 비밀번호는 SHA-256으로 암호화하여 저장합니다.

Spring Security 설정에서 STATELESS + NullSecurityContextRepository를 적용하여 서버 세션을 완전히 제거했으며, 커스텀 CookieOrHeaderBearerTokenResolver로 쿠키에서 JWT를 추출하고, JwtBlacklistFilter로 블랙리스트 검증을 수행합니다.

배포 환경은 AWS EC2(t3.micro)에 Spring Boot와 FastAPI(Docker 컨테이너)를 함께 운영하며, Nginx를 리버스 프록시로 사용하고 Let's Encrypt 기반 HTTPS를 적용하여 실제 웹 서비스 형태로 운영 중입니다.

사용 기술

Spring BootReactFastAPIGeminiJavaPythonJavaScriptMariaDBRedisPineconeAWSDockerNginxJPAJWT
YouTube 원본 프로젝트 설명
❍ 개발자 : 지주우 ❍ 제목 : 찍고먹어요 ❍ 설명 : 찍고먹어요는 냉장고 사진 한 장으로 식재료를 자동 인식하고 요리를 추천해주는 AI 기반 냉장고 식료품 분석 및 요리 추천 서비스입니다. 사용자는 냉장고 사진을 업로드하면 AI가 식재료를 자동으로 인식하고, 보유 재료 기반의 레시피를 추천합니다. 사용자는 인식된 식재료를 직접 교정할 수 있으며, 교정된 결과를 기반으로 최적의 레시피를 제안합니다. 프론트엔드에서는 AVIF 등 비표준 이미지 포맷을 Canvas API를 활용해 JPEG로 변환한 뒤 업로드하는 방식을 적용하여 다양한 기기 환경을 지원합니다. 이미지 업로드는 Spring Boot에서 AWS S3 Presigned URL을 발급받아 브라우저가 S3에 직접 PUT 요청하는 방식으로 구현하여 서버 부하를 최소화했습니다. AI 서비스는 FastAPI와 Python 기반으로 구성되었으며, Google Gemini API를 활용해 냉장고 이미지 내 식재료 객체 인식 및 분석, 선택한 레시피의 YouTube 영상 직접 분석을 통한 조리 단계 타임라인 생성을 수행합니다. Gemini API 호출 시 503·429 응답에 대해 지수 백오프(Exponential Backoff) 기반 재시도 로직을 적용하여 서비스 안정성을 확보했습니다. 또한 Pinecone 벡터 DB와 연동하여 식품 영양 정보 유사도 검색을 수행합니다. 레시피 선택 후 사용자는 조리 타임라인 페이지에서 YouTube 영상과 AI가 생성한 단계별 조리 가이드를 동시에 확인할 수 있으며, 각 단계 클릭 시 해당 영상 구간으로 자동 이동합니다. 부족한 재료는 Naver 쇼핑 API를 통해 검색하고 장바구니에 담을 수 있습니다. 인증은 JWT 기반으로 구현하였으며, Access Token과 Refresh Token을 모두 HttpOnly + Secure + SameSite=Lax 쿠키로 발급하여 XSS 공격에 대한 보안성을 확보했습니다. Access Token은 Redis 블랙리스트(BL:AT:{jti}) 기반으로 로그아웃 후 재사용을 차단하고, Refresh Token은 Redis 화이트리스트(RT:{userId})에 저장하여 RTR(Refresh Token Rotation) 방식으로 재사용 공격을 방지했습니다. 비밀번호는 SHA-256으로 암호화하여 저장합니다. Spring Security 설정에서 STATELESS + NullSecurityContextRepository를 적용하여 서버 세션을 완전히 제거했으며, 커스텀 CookieOrHeaderBearerTokenResolver로 쿠키에서 JWT를 추출하고, JwtBlacklistFilter로 블랙리스트 검증을 수행합니다. 배포 환경은 AWS EC2(t3.micro)에 Spring Boot와 FastAPI(Docker 컨테이너)를 함께 운영하며, Nginx를 리버스 프록시로 사용하고 Let's Encrypt 기반 HTTPS를 적용하여 실제 웹 서비스 형태로 운영 중입니다. ❍ 적용 기술 : 프레임워크 : Spring Boot, Spring Security, FastAPI, React 프론트엔드 : React, React Router, Axios, Zustand, Vite, Canvas API(AVIF→JPEG 변환), HTML5, CSS, JavaScript 백엔드 : Spring Boot, Spring Security, Spring Data JPA, WebClient, JWT 기반 인증 필터 체인(BearerTokenAuthenticationFilter, JwtBlacklistFilter), CookieOrHeaderBearerTokenResolver AI 서비스 : FastAPI, Python, Google Gemini API(이미지 분석·영상 요약), Pinecone(식품 영양 벡터 검색), Exponential Backoff 기반 재시도 로직 사용 언어 : Java, JavaScript, Python, HTML5, CSS 데이터베이스 : MariaDB(회원/레시피/리뷰/장바구니), Redis(JWT 블랙리스트·화이트리스트·이메일 인증코드) 클라우드 : AWS EC2(Spring Boot + FastAPI 호스팅), AWS S3(냉장고 이미지 저장, Presigned URL 방식) 통신 프로토콜 : REST API, HTTPS, SMTP(이메일 인증) 웹서버/배포 : Nginx(리버스 프록시, proxy_read_timeout 120s), Docker, HTTPS, SSL, Let's Encrypt 인증/보안 : JWT(JSON Web Token) 기반 인증, RTR(Refresh Token Rotation), HttpOnly Cookie, Redis 블랙리스트·화이트리스트, Spring Security STATELESS, SHA-256 비밀번호 암호화 외부 API : Google Gemini API, YouTube Data API v3, Naver 쇼핑 API, Kakao 우편번호 서비스, AWS S3 Presigned URL 빌드/의존성 관리 : Gradle, Spring Security OAuth2 Resource Server, Nimbus JOSE + JWT 로깅 : Logback 기반 백엔드 로깅, Python logging 기반 AI 서비스 로깅 ❍ 아키텍처 : 단일 서버 아키텍처(Spring Boot + FastAPI Docker 공존), S3 Presigned URL 기반 직접 업로드 패턴, JWT Stateless 인증, Redis 기반 토큰 상태 관리, AI 서비스 분리(FastAPI), 벡터 유사도 검색(Pinecone) ❍ 도메인 주소 : https://ridinggoat.kr Made by Vrew Edit Tool

공개된 YouTube 설명에 근거한 소개입니다. 설명에 없는 학생 정보나 기능은 추가하지 않습니다.

CONTINUE EXPLORING

기술로 이어지는 작품

모든 작품 보기 ↗

이런 프로젝트를 직접 만들어보고 싶다면

빅데이터소프트웨어공학과 알아보기 (새 탭)