식단 관리 - 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,
});
}
}
}
(설명 : 주석참고)