๐์ง๋๋ฒ Prisma๋ฅผ ์ค์นํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ์์๋ณด์๋ค. ์ค๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ป๊ฒ ์ ๊ทผํ๊ณ ์กฐ์ํ๋์ง ์์๋ณด๋ ค ํ๋ค.
Prisma Client๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋ง๊ฒ ์๋์ผ๋ก ์์ฑ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ผ์ด์ธํธ์ด๋ค. ์ฝ๊ฒ ๋งํด Prisma๋ฅผ ํตํด ์์ฑํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ผ๊ณ ํ ์ ์๋ค.
์๋ ๋ช ๋ น์ด๋ก PrismaClient๋ฅผ ์ค์นํ๋ค.
npm install @prisma/client
์ค์น ํ ์๋ ๋ช ๋ น์ด๋ก Prisma Client๋ฅผ ์์ฑํด์ค๋ค.
prisma generate
๐ข Prisma Schema์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋๋ง๋ค npx prisma generate
๋ฅผ ์คํํด Prisma Client๋ฅผ ์
๋ฐ์ดํธํด์ค์ผ ํ๋ค.
์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ด ํ์ํ ๊ณณ์์ PrismaClient๋ฅผ ์ธ์คํด์คํ ํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
or
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
Next.js์ ๊ฒฝ์ฐ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํซ ๋ฆฌ๋ก๋ฉ(์ฝ๋ ๋ณ๊ฒฝ์ ๋ณ๊ฒฝ๋ ์ฝ๋ ์ฌ์คํ. ํ์ผ์ ์ ์ฅํ ๋๋ง๋ค ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ค์ด ์ฌ์คํ๋จ.)์ผ๋ก ์ธํด ๋งค๋ฒ ์๋ก์ด PrismaClient ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ๋๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ์ด ์์ฑ๋๋ค. ์ด์ ๋ฐ๋ผ ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์๊ธฐ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ถ๋ ฅ์ด ๋งค์ฐ ๋๋ ค์ง๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด PrismaClient๋ฅผ ์ธ์คํด์คํํ์ฌ gloabalThis ๊ฐ์ฒด์ ์ ์ฅํด์ ์ฌ์ฉํ๋ค.
// lib/prisma.js
const { PrismaClient } = require("@prisma/client");
// PrismaClient๊ฐ global์ ์๋ ๊ฒฝ์ฐ์๋ง ์ธ์คํด์คํ
const prisma = globalThis.prisma || new PrismaClient();
// ํ๋ก๋์
์ํ๊ฐ ์๋ ๋ globalThis ๊ฐ์ฒด์ ์ ์ฅ
if (process.env.NODE_ENV !== "production") globalThis.prisma = prisma;
export default prisma;
๋ฐ์ดํฐ ์ ๊ทผ์ด ํ์ํ ๊ณณ์์ ์ธ์คํด์คํํ PrismaClient๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ค. Prisma Client API๋ก CRUD ์์ ์ ์ํํ ์ ์๋ค.
create
์๋ก์ด ๋ฐ์ดํฐ ์์ฑ
const member = await prisma.member.create({
data: {
name: 'Kim',
age: 20
},
})
createMany
์ฌ๋ฌ ๋ฐ์ดํฐ ์์ฑ
const createMembers = await prisma.member.createMany({
data: [
{ name: 'Kim', age: 22 },
{ name: 'Lee', age: 23 },
{ name: 'Park', age: 23 },
],
})
findUnique
ํน์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
// name์ด Kim์ธ ๋ฐ์ดํฐ ์กฐํ
const member = await prisma.member.findUnique({
where: {
name: 'Kim',
},
})
findMany
์ฌ๋ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
// ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
const members = await prisma.member.findMany()
// ์กฐ๊ฑด์ ๋ง๋ ์ฌ๋ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
// age๊ฐ 23์ธ ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ
const members = await prisma.member.findMany({
where: {
age: 23,
},
})
update
where ์์ ์์ฑ์ ๊ฐ์ง ๋ฐ์ดํฐ ์
๋ฐ์ดํธ
// name์ด Park์ธ ๋ฐ์ดํฐ์ age๋ฅผ 24๋ก ์
๋ฐ์ดํธ
const updateMember = await prisma.member.update({
where: {
name: 'Park',
},
data: {
age: 24,
},
})
updateMany
where ์์ ์์ฑ์ ๊ฐ์ง ๋ชจ๋ ๋ฐ์ดํฐ ์
๋ฐ์ดํธ
// age๊ฐ 23 ์ด์์ธ ๋ชจ๋ ๋ฐ์ดํฐ์ role์ ADMIN์ผ๋ก ์
๋ฐ์ดํธ
const updateMembers = await prisma.member.updateMany({
where: {
age: {
gte: 23,
},
},
data: {
role: 'ADMIN',
},
})
upsert
where ์์ ์์ฑ์ ๊ฐ์ง ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์
๋ฐ์ดํธ, ์๋ค๋ฉด ๋ฐ์ดํฐ ์์ฑ
// name์ด Jo์ธ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด age๋ฅผ 20์ผ๋ก ์
๋ฐ์ดํธ, ์๋ค๋ฉด name์ด Jo์ด๊ณ age๊ฐ 20๋ฐ์ดํฐ ์์ฑ
const upsertMember = await prisma.member.upsert({
where: {
name: 'Jo',
},
update: {
age: 20,
},
create: {
name: 'Jo',
age: 20,
},
})
delete
where ์์ ์์ฑ์ ๊ฐ์ง ๋ฐ์ดํฐ ์ญ์
// age๊ฐ 22์ธ ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ
const deleteMember = await prisma.member.delete({
where: {
age: 22,
},
})
deleteMany
์ฌ๋ฌ ๋ฐ์ดํฐ ์ญ์
// ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ
const members = await prisma.member.deleteMany()
// ์กฐ๊ฑด์ ๋ง๋ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ
// age๊ฐ 23์ธ ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์
const members = await prisma.member.deleteMany({
where: {
age: 23,
},
})
npx prisma generate
๋ฅผ ์คํํ์ฌ Prisma Client๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ๋ค.https://medium.com/@2018.itsuki/postgresql-with-next-js-and-prisma-44f66a05378a