
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({});
}

