음식 추천 및 AI 식단 관리 프로젝트를 마치고 개선의 여지가 너무나도 많은 점...을 파악하고, 이를 만져보려고 한다.
문제
@Override
@Transactional
public ReportGetResponseDto getDailyReport(String email) {
Member member = memberRepository.findByEmailAndDeletedIsNull(email)
.orElseThrow(MemberNotFoundException::new);
LocalDate today = LocalDate.now();
MemberInfo memberInfo = memberInfoRepository.findByMemberAndDeletedIsNull(member).orElseThrow(MemberInfoNotFoundException::new);
Report report = reportRepository
.findByMemberAndDeletedIsNullAndReportDate(member, today)
.orElseGet(() -> createDailyReport(member, today, memberInfo));
LocalDateTime start = today.atStartOfDay();
LocalDateTime end = LocalDateTime.now();
List<RecommendationResult> records = recommendationResultRepository
.findRecommendationResult(member, start, end);
if (records.isEmpty() || records == null) {
throw new RecommendResultNotFoundException();
}
// 통계 계산
Nutrient consumed = records.stream()
.map(rr -> toNutrient(rr.getFood()))
.reduce(new Nutrient(0,0,0,0,0,0,0,0), Nutrient::plus);
Nutrient target = calculateTargetNutrient(memberInfo);
double score = calculateHealthScore(consumed, target);
// 코치 코멘트 생성
String nutrientPrompt = String.format("""
오늘의 영양 통계입니다.\n" +
"- 평균 건강 점수 : %.2f\n" +
"- 총 칼로리 : %.0f kcal\n" +
"- 탄수화물 : %.0f g\n" +
"- 단백질 : %.0f g\n" +
"- 지방 : %.0f g\n" +
"- 나트륨 : %.0f mg\n" +
"- 당류 : %.0f g\n" +
"- 식이섬유 : %.0f g\n" +
"- 콜레스테롤 : %.0f mg",""",
score,
consumed.calories(), target.calories(),
consumed.carbohydrates(), target.carbohydrates(),
consumed.protein(), target.protein(),
consumed.fat(), target.fat(),
consumed.sodium(), target.sodium(),
consumed.sugar(), target.sugar(),
consumed.fiber(), target.fiber(),
consumed.cholesterol(), target.cholesterol()
);
String prompt = "아래 통계를 참고하여, 수치별 평가와 개선 조언을 200자 이내로 작성해주세요.";
// String comment = openAiChatModel.call(nutrientPrompt + prompt);
report.updateComment("AI API 키 만료임");
log.info("Updated daily comment: {}", "키 만료됨");
// presignedUrl 변환 함수 적용
return ReportGetResponseDto.of(report, records, consumed, target, s3Service::buildGetUrl);
}
Nutrient consumed = records.stream()
.map(rr -> toNutrient(rr.getFood()))
이 부분에서 또 음식 조회하는 쿼리 N번