Skip to content

feat(diet): AI 인식 API 연동(Mock)#9

Open
Ji-Un-Gil wants to merge 2 commits intodevfrom
feat/BS-39-AI-인식-API-연동-Mock

Hidden character warning

The head ref may contain hidden characters: "feat/BS-39-AI-\uc778\uc2dd-API-\uc5f0\ub3d9-Mock"
Open

feat(diet): AI 인식 API 연동(Mock)#9
Ji-Un-Gil wants to merge 2 commits intodevfrom
feat/BS-39-AI-인식-API-연동-Mock

Conversation

@Ji-Un-Gil
Copy link
Contributor

🎯 PR 타입

[x] Feat: 새로운 기능 추가
[x] Fix: 버그 수정
[x] Docs: 문서 수정
[x] Refactor: 코드 리팩토링
[x] Test: 테스트 코드 추가 또는 리팩토링
[ ] Chore: 빌드 부분 혹은 패키지 매니저 수정


📌 관련 이슈

Related Issue: BS-39
링크: https://surviber.atlassian.net/browse/BS-39


📝 개요

작업 배경 (Why)
PRD 4.2 요구사항에 명시된 핵심 기능, 'AI를 활용한 식단 기록 자동화'를 구현하기 위해 백엔드 API를 개발했습니다. 사용자가 음식 사진을 업로드하면, AI가 이를 분석하여 영양 정보와 함께 식단을 손쉽게 기록할 수 있는 기반을 마련했습니다.

핵심 변경 사항 (What)
음식 사진 업로드, AI 이미지 분석, 식단 기록 생성을 위한 3단계 API를 구현하고, 관련 테스트 코드를 작성했습니다. 또한, DTO를 record 타입으로 리팩토링하고, 외부 서비스 연동을 위한 아키텍처를 개선했습니다.


✅ 작업 상세 내용

[x] AI 식단 기록 API 구현

  • POST /api/v1/foods/image: S3에 음식 사진을 업로드하고 이미지 URL을 반환하는 API를 구현했습니다.
  • POST /api/v1/foods/analyze: 이미지 URL을 받아 외부 AI 서비스로 음식을 인식하고, DB 정보와 매칭하여 영양 정보가 포함된 후보 목록을 반환하는 API를 구현했습니다.
  • POST /api/v1/meals: 사용자가 최종 선택한 음식으로 식단을 생성하는 API를 구현했습니다.

[x] 아키텍처 개선 및 리팩토링

  • 외부 서비스(S3, Vision AI) 연동을 위해 S3Uploader, FoodVisionClient 인터페이스를 도입하고 Mock 구현체를 작성하여 의존성을 분리했습니다.
  • MealFacade를 활용하여 UserService, FoodService 등 여러 도메인 서비스가 관여하는 복잡한 식단 생성 로직을 처리하도록 개선했습니다.
  • 신규 생성된 모든 DTO를 record 타입으로 리팩토링하여 코드 간결성과 불변성을 확보했습니다.

[x] 테스트 및 디버깅

  • FoodService, FoodController, MealController에 대한 단위/통합 테스트 코드를 추가하여 기능 안정성을 검증했습니다.
  • record 리팩토링 및 메서드 시그니처 변경으로 인해 발생한 다수의 컴파일 오류를 해결했습니다.

[x] 문서화

  • PROMPTLOG.mdrecord.md에 개발 진행 내역을 상세히 기록했습니다.

📸 결과 및 테스트 방법

실행 결과
API 구현이므로 별도의 UI 변경 사항은 없습니다.

테스트 방법

  1. 프로젝트 전체 테스트 (./gradlew clean test)를 실행하여 모든 테스트가 통과하는지 확인합니다.
  2. 애플리케이션 실행 후, Swagger UI (/swagger-ui.html)를 통해 아래 API들이 순서대로 정상 동작하는지 확인합니다.
    • POST /api/v1/foods/image (이미지 파일 업로드)
    • POST /api/v1/foods/analyze (위 단계에서 받은 imageUrl 사용)
    • POST /api/v1/meals (위 분석 결과를 바탕으로 식단 정보 구성하여 요청)

🔎 리뷰어 집중 포인트

  • MealFacadeUserServiceFoodService를 호출하여 식단을 생성하는 흐름이 자연스럽고 효율적인지 확인 부탁드립니다.
  • 외부 서비스 연동을 위해 추가된 S3UploaderFoodVisionClient 인터페이스 설계가 확장성을 고려하여 잘 분리되었는지 검토 부탁드립니다.
  • record 타입으로 변경된 DTO들이 프로젝트 전반의 컨벤션과 잘 맞는지 확인 부탁드립니다.

⚠️ 위험 요소 및 고려사항

롤백 계획 (Rollback Plan)
이 PR을 Revert하고 main 브랜치를 재배포합니다.

의존성 변경 (Dependency Changes)
없음


🤖 AI 참고사항 (for AI)

  • Scope:
    src/main/java/com/babsim/babsimbackend/domain/diet, src/main/java/com/babsim/babsimbackend/infrastructure, src/test/java/com/babsim/babsimbackend/domain/diet

  • Logic:
    FoodServiceuploadFoodImage, analyzeFoodImage 메서드 및 MealFacadecreateMeal 메서드.

  • Prompt:
    다음 스텝으로, 오늘 기록된 식단(Meal) 데이터를 바탕으로 사용자의 일일 영양 섭취량을 계산하고, 사용자의 목표(Goal)와 비교하여 간단한 분석 결과를 제공하는 DailyNutritionAnalysisService를 구현해줘.


✅ PR 제출 전 체크리스트

[x] PR 제목은 Conventional Commit에 맞게 작성했습니다.
[x] main 브랜치로부터 최신 코드를 반영했습니다. (rebase)
[x] 스스로 코드 리뷰를 진행했습니다.
[x] 변경 사항에 대한 테스트를 완료했습니다.
[x] 관련 Jira 이슈를 연결했습니다.
[x] Assignees, Reviewers, Labels를 올바르게 설정했습니다.

PRD 4.2 요구사항에 명시된, 음식 사진 업로드를 통한 식단 기록 핵심 기능을 구현합니다. 이미지 업로드, AI 기반 음식 인식, 식단 기록 생성 과정을 포함합니다.

### 주요 변경 사항

**1. API 구현**
- `POST /api/v1/foods/image`: 음식 사진 업로드를 처리하고, 저장된 이미지 URL(S3)을 반환합니다.
- `POST /api/v1/foods/analyze`: 이미지 URL을 받아 외부 AI 서비스로 음식 목록을 인식하고, 영양 정보가 포함된 음식 후보 목록을 반환합니다.
- `POST /api/v1/meals`: 사용자가 최종 선택한 음식들로 새로운 식단 기록을 생성합니다.

**2. 아키텍처 개선**
- `S3Uploader`와 `FoodVisionClient` 인터페이스를 도입하여 외부 서비스(S3, Vision AI)의 의존성을 분리하고 테스트 용이성을 향상시켰습니다.
- 로컬 개발 및 테스트를 위해 Mock 구현체(`MockS3Uploader`, `MockFoodVisionClient`)를 제공합니다.
- `FoodController`와 `MealController`의 역할을 명확히 하고, 식단 생성 엔드포인트를 `MealController`로 이동시켰습니다.
- `MealFacade`를 활용하여 `UserService`와 `FoodService`를 오케스트레이션하는 복잡한 식단 생성 로직을 처리하도록 개선했습니다.

**3. 리팩토링 및 버그 수정**
- 새로 추가된 모든 DTO를 Java `record` 타입으로 리팩토링하여 코드 간결성과 불변성을 확보했습니다.
- 메서드 시그니처 변경 및 DTO 리팩토링으로 인해 발생했던 테스트 코드의 다수 컴파일 오류를 수정했습니다.
- 누락되었던 `MealFoodRepository` 인터페이스를 추가했습니다.

**4. 테스트**
- `FoodService`에 대한 단위 테스트를 추가하여, 외부 의존성을 Mocking하고 비즈니스 로직을 검증했습니다.
- `FoodController`와 `MealController`에 대한 통합 테스트를 추가하여 새로운 API 엔드포인트의 동작을 검증했습니다.
데이터베이스 연결 실패 및 다중 데이터소스 설정 오류로 인해 애플리케이션이 시작되지 못하는 문제를 해결합니다.

### 주요 변경 사항

1.  **TimescaleDB 리포지토리 스캔 오류 해결**
    - **문제**: `TimescaleDBJpaConfig`의 JPA 리포지토리 스캔 경로(`basePackages`)가 잘못 설정되어, `NutritionTimeseriesRepository` 빈을 찾지 못하는 오류가 발생했습니다.
    - **해결**: `TimescaleDBJpaConfig`의 `@EnableJpaRepositories` 및 `setPackagesToScan` 경로를 올바른 패키지(`...domain.timeseries`)로 수정하여, TimescaleDB 관련 리포지토리가 정상적으로 등록되도록 했습니다.
@Ji-Un-Gil Ji-Un-Gil self-assigned this Nov 11, 2025
@Ji-Un-Gil Ji-Un-Gil added the enhancement New feature or request label Nov 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant