Prisma client를 사용하여 데이터를 조회/생성/수정/삭제 하는 방법에 대해 알아보자.
app/api/users/route.tsx
import { NextRequest, NextResponse } from "next/server";
export function GET(request: NextRequest) {
return NextResponse.json([
{ id: 1, name: "a" },
{ id: 2, name: "b" },
]);
}
INSERT INTO mydb.User (email, name)
VALUES ('test@test.com', '문지은');
SELECT * FROM mydb.User;
이제 Get 함수를 수정해보자.
Prisma
인스턴스를 가져온 후에, 모든 사용자를 가져오기 위해 findMany
메소드를 호출한다.where
객체를 설정해 사용자를 필터링할 수 있고, xor 연산자를 통해 여러 조건을 결합할 수도 있다.findMany
메소드 또한 promise 객체를 반환하기 때문에 async
awiat
로 사용자를 가져온다.app/api/users/route.tsx
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";
export async function GET(request: NextRequest) {
const users = await prisma.user.findMany();
return NextResponse.json(users);
}
localhost:3000/api/users
로 GET
요청시 데이터를 잘 불러오는 것을 확인할 수 있다.users/[id]
폴더의 route
파일을 수정해보자.Prisma
인스턴스를 가져오고, 이번에는 findUnique
메소드를 사용한다.where
속성을 사용한다.id
param 값을 조건으로 설정해 특정 사용자 정보를 읽어오도록 작성한다.promise
를 리턴하므로 async
await
을 적용한다.null
값을 반환한다.app/api/users/[id]/route.tsx
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";
export async function GET(
request: NextRequest,
{ params }: { params: { id: string } }
) {
const requestedId = parseInt(params.id);
const user = await prisma.user.findUnique({
where: { id: requestedId },
});
return NextResponse.json(user);
}
localhost:3000/api/users/1
로 GET 요청 시 데이터를 잘 반환하는 것을 볼 수 있다.app/api/users/[id]/route.tsx
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";
export async function GET(
request: NextRequest,
{ params }: { params: { id: string } }
) {
const requestedId = parseInt(params.id);
const user = await prisma.user.findUnique({
where: { id: requestedId },
});
if (!user) {
return NextResponse.json({ error: "USER NOT FOUND" }, { status: 404 });
}
return NextResponse.json(user);
}
export async function POST(request: NextRequest) {
const body = await request.json();
// 요청한 데이터가 존재하지 않는다면 404 에러 반환
if (!body.name) {
return NextResponse.json({ error: "Name is required" }, { status: 404 });
}
if (!body.id) {
return NextResponse.json({ error: "Id is required" }, { status: 404 });
}
// 그렇지 않다면 전달 객체를 응답 객체로 반환
return NextResponse.json({ id: body.id, name: body.name });
}
create
메서드를 사용한다.create
메서드 인자 값으로 전달하고, 전달할때는 data
라는 속성을 사용한다.app/api/users/route.tsx
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";
import schema from "./schema";
export async function POST(request: NextRequest) {
const body = await request.json();
// 데이터 검증
const validation = schema.safeParse(body);
if (!validation.success) {
return NextResponse.json(validation.error.errors, { status: 404 });
}
// 새로운 사용자 생성
const newUser = await prisma.user.create({
data: {
name: body.name,
email: body.email,
},
});
return NextResponse.json(newUser);
}
localhost:3000/api/users
로 Post 요청시 정상적으로 작동하는 것을 확인할 수 있다.User
모델의 email
unique
제약사항 때문!findUnique
메소드를 통해 해당 사용자의 존재 유무를 검사하고, 존재하지 않는 경우에 create
메소드를 실행하도록 코드 수정app/api/users/route.tsx
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";
import schema from "./schema";
export async function POST(request: NextRequest) {
const body = await request.json();
// 데이터 검증
const validation = schema.safeParse(body);
if (!validation.success) {
return NextResponse.json(validation.error.errors, { status: 404 });
}
const user = await prisma.user.findUnique({
where: { email: body.email },
});
if (user) {
return NextResponse.json({ error: "User already exists" }, { status: 400 });
}
// 새로운 사용자 생성
const newUser = await prisma.user.create({
data: {
name: body.name,
email: body.email,
},
});
return NextResponse.json(newUser);
}
api/users/[id]/route.tsx
파일을 수정하여 데이터를 업데이트 하는 함수를 작성해보자.findUnique
메소드를 사용해 사용자 존재 여부를 검사하고, 사용자 객체가 존재하지 않으면 오류를 반환하고, 존재하는 경우 Prisma
의 update
메소드를 사용해 데이터 업데이트를 진행한다.update
메소드는 인자값으로 객체를 받는데, 객체 내부에는 where
속성을 사용해 찾고자 하는 데이터를 명시하고, data
속성에는 업데이트 하고자 하는 데이터를 명시할 수 있다.promise
를 리턴하기 때문에 async
await
을 적용한다.app/api/users/[id]/route.tsx
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";
import schema from "../schema";
export async function PUT(
request: NextRequest,
{ params }: { params: { id: string } }
) {
const body = await request.json();
const validation = schema.safeParse(body);
if (!validation.success) {
return NextResponse.json(validation.error.errors, { status: 404 });
}
const requestedId = parseInt(params.id);
const user = await prisma.user.findUnique({
where: { id: requestedId },
});
if (!user) {
return NextResponse.json({ error: "USER NOT FOUND" }, { status: 404 });
}
const uadatedUser = await prisma.user.update({
where: { id: requestedId },
data: { name: body.name, email: body.email },
});
return NextResponse.json(uadatedUser);
}
api/users/[id]/route.tsx
파일을 수정하여 데이터를 삭제 하는 함수를 작성해보자.findUnique
메소드를 사용해 사용자 존재 여부를 검사하고, 사용자 객체가 존재하지 않으면 오류를 반환하고, 존재하는 경우 Prisma
의 delete
메소드를 사용해 데이터 삭제를 진행한다.where
속성을 통해 삭제하고 싶은 객체의 정보를 명시할 수 있다.app/api/users/[id]/route.tsx
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";
export async function DELETE(
request: NextRequest,
{ params }: { params: { id: string } }
) {
const requestedId = parseInt(params.id);
const user = await prisma.user.findUnique({
where: { id: requestedId },
});
if (!user) {
return NextResponse.json({ error: "USER NOT FOUND" }, { status: 404 });
}
await prisma.user.delete({ where: { id: requestedId } });
return NextResponse.json({});
}