식단 관리 - Part 4 todayFood 등록 기능

Project Diary/Next.js + Prisma + MariaDB (KiloFlow)

이 글에서는 사용자가 오늘 먹은 음식을 등록하는 기능을 구현합니다.


 

데이터베이스 스키마

 

users 테이블

model users {
  user_id                Int              @id @default(autoincrement())
  email                  String           @unique
  password               String
  nickname               String
  profile_image          String           @default("default_image_url")
  isInitialSetupComplete Boolean          @default(false)
  created_at             DateTime         @default(now())
  userProfile            UserProfile?

  recommends             recommend[] 
  userFoodList           userFoodList[] 
  todayFood              todayFood[] // 추가된 부분

  @@index([user_id])
}

 

todayFood 테이블

model todayFood {
  id          Int           @id @default(autoincrement())
  user_id     Int
  food_id     String
  added_at    DateTime      @default(now())

  user        users         @relation(fields: [user_id], references: [user_id], onDelete: Cascade)

  @@index([user_id])
}

 


 

프론트엔드

 

오늘의 음식 추가 함수

// 오늘의 음식 추가 함수
const addTodayFood = async () => {
  try {
    const res = await fetch('/api/food/todayFood', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        user_id: currentUserId,  // 현재 사용자 ID
        food_id: id,  // 현재 음식 ID
      }),
    });

    if (res.ok) {
      const rec = await res.json();
      const newFoodData = [...foodData, { calorie }];
      setFoodData(newFoodData);  // 새로운 음식 데이터 상태에 추가
      alert(`${name} ${rec.message}`);  // 성공 메시지 알림
    } else {
      alert('추가에 실패했습니다.');  // 실패 메시지 알림
    }
  } catch (err) {
    alert('추가에 실패했습니다.');  // 예외 처리 메시지 알림
  }
};

(설명 : 주석참고)

 


 

백엔드

 

todayFood API엔드포인트

import type { NextApiRequest, NextApiResponse } from "next";
import prisma from "../../../lib/prisma";

// todayFood 등록을 처리하는 API 핸들러 함수
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === "POST") {  // POST 요청 처리
    try {
      const { user_id, food_id } = req.body; // 요청 본문에서 user_id와 food_id를 추출

      // todayFood 테이블에 새로운 레코드 생성
      await prisma.todayFood.create({
        data: {
          food_id: food_id,  // 등록할 음식 ID
          user_id: Number(user_id),  // 사용자 ID
        },
      });

      // 성공 메시지 반환
      return res.status(200).json({ message: "추가가 완료되었습니다." });
    } catch (error: any) {
      // 에러 처리
      console.log("서버에러", error);
      return res.status(500).json({
        error: "서버에서 오류가 발생했습니다.",
        details: error.message,
      });
    }
  }
}

(설명 : 주석참고)