Skip to content

MeowMeow-punch/PickEat

 
 

Repository files navigation

🍽️ PICK EAT

Welstory 기반 식단 추천 서비스 (SQL + AI Hybrid)

Generic badge Generic badge Generic badge Generic badge Generic badge


Image

“외부 식단을 안정적으로 흡수하고, 추천을 운영 가능하게 만든다.”
Welstory 연동 + 구조화 로그 기반 관측 설계

🧾 프로젝트 개요

  • 기간: 2025.11 - 2025.12
  • 역할: Backend
  • 핵심 포인트:
    • Welstory 외부 API를 ID/PW 로그인 기반으로 연동
    • SQL → AI 최종 선택의 하이브리드 추천 구조
    • MDC(traceId) + JSON 구조 로그 + OpenSearch 기반 관측 시스템 설계

🚀 핵심 기능

1. Welstory 연동 식단 조회 & 직접 식단 생성

  • Welstory 외부 급식 플랫폼과 연동하여 당일 점심 식단을 조회
  • 사용자 영양 목표(칼로리/탄단지/Focus)에 맞는 메뉴 자동 추천
  • Welstory 메뉴 외에도 사용자가 직접 먹은 음식 기록/등록 가능
  • 누적 섭취 데이터를 기반으로 다음 끼니 추천에 반영

2. 사용자 유형 기반 개인 맞춤 설문 시스템

  • 가입 시 목표(영양관리/다이어트/벌크업) 선택
  • 목표별 세부 설문(질환/알러지/음주/흡연/활동량 등) 수집
  • 수집 데이터는 목표 산출 + 추천 맥락 정보로 활용

3. SQL + AI 하이브리드 추천 알고리즘

  • AI가 전체 Food DB를 직접 소화하는 비효율을 피하기 위해 2단계 구조 채택
      1. SQL 필터링으로 상위 후보군 추출
      1. AI가 사용자 목표/상황/선호를 고려해 최종 선택 + 추천 이유 생성

4. Welstory 외부 API 연동 아키텍처

  • 인증 토큰 수명 관리(자동 로그인, 401 시 1회 재시도)
  • timeout 설정, 응답 내부 에러코드 분기, 장애 전파 방지
  • 외부 식당 ID의 비일관 동작을 발견하고 DB를 Source of Truth로 설정
    • 식당명 ↔ restaurantId 매핑을 내부에서 관리

👤 내가 맡은 역할

1) Welstory 외부 API 안정화 설계/구현

  • ID/PW 로그인 기반 인증 흐름 구현 (토큰/세션성 Authorization 관리)
  • ensureToken → loginInternal → callWithRetry(401/403 시 재로그인)으로 복구 경로 내장
  • 응답을 DTO로만 받지 않고 HttpResult(ok/status/headers/json/text)원문 + 파싱 동시 보관
  • 외부 식당 ID 불안정 문제를 해결하기 위해 restaurant_mapping 테이블로 DB SoT 설계

2) 외부 연동 레이어링(교체 가능 구조)

  • Configuration / Transport / Auth / Endpoints / DTO / Wrapper / Gateway / Service
  • Gateway 인터페이스로 캐시(Caffeine/Redis) 확장 지점을 확보

3) 로깅/관측 시스템(운영 기준) 설계/구현

  • MDC 기반 traceId/userId/clientIp 자동 주입 필터 구현
  • HTTP_ACCESS / ERROR / BUSINESS_EVENT 로그 타입 분리
  • Logback local(텍스트) / prod(JSON) 분리
  • Filebeat → OpenSearch → Dashboards 파이프라인 구성(초기 Logstash 미도입)

🏛️ 아키텍처 개요

Image
  • Backend(Spring Boot): 유스케이스 조립, 추천 결과 저장/응답
  • External API(Welstory): 로그인 기반 토큰 인증 + 메뉴/영양 조회
  • DB(PostgreSQL): 사용자/식단/매핑(SoT) 저장
  • Observability: JSON 로그 → Filebeat → OpenSearch → Dashboards

📈 Logging / Observability 설계

1) MDC 기반 traceId

  • 요청 단위 traceId 생성 또는 X-TRACE-ID 헤더 수용
  • 모든 로그에 traceId/userId/clientIp 자동 주입
  • 요청 종료 시 MDC clear

2) logType 분리

  • HTTP_ACCESS: 요청/응답 시간, status, uri
  • ERROR: errorCategory, errorCode, httpStatus, traceId
  • BUSINESS_EVENT: eventCode + 도메인 키(groupId 등)

3) 파이프라인

  • App(JSON stdout) → Filebeat(JSON 파싱) → OpenSearch → Dashboards
  • 초기에는 Logstash 미도입(운영 리소스/복잡도 절감)

🧨 Trouble Shooting

문제: AI_READY 롱폴링 응답 미수신

  • CORE_READY는 정상 동작했지만 AI_READY 단계에서 클라이언트 타임아웃 발생
  • 원인: waiter 등록 타이밍과 complete 호출 사이 레이스 컨디션 + 상태 플래그 갱신 시점 불일치

해결

  • 사전 상태 체크 API 추가(isAlreadyReady)
  • TxAfterCommit 이후 complete(AI_READY) 호출로 이벤트 발행 시점 정렬

🛠 Tech Stack

분류 기술 스택
Frontend React 19, Vite
Backend Spring Boot 3.5.8, Spring Security, JPA
DB PostgreSQL 42.7.4
Infra Docker, GitHub Actions
Logging Logback(JSON), Filebeat, OpenSearch, Dashboards

About

픽잇 백엔드 레포입니다

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Java 99.8%
  • Dockerfile 0.2%