์์ฆ Prisma๋ฅผ ์ฌ์ฉํด์ ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์งํ์ค์ธ๋ฐ ์ฒ์ ์ฌ์ฉํ๋ค๋ณด๋ ์๋ก ๋ฐฐ์ฐ๋ ๊ฒ๋ค์ด ๋ง๋ค.
Seeding๋ ๊ทธ ์ค ํ ๊ฐ์ง์ธ๋ฐ ํํ ๋ฆฌ์ผ ๋์์๊ณผ ๊ธ๋ค์ ๋ณด๋ค๋ณด๋ seeding, seed๋ผ๋ ๋จ์ด๊ฐ ์์ฃผ ๋์๋ค. ๋น์ฅ ํ์ํด๋ณด์ด์ง๋ ์์์ ๋์ค์ ํ์ํ ๋์ ๋ด์ผ์ง ํ๊ณ ์ง๋์ณค๋๋ฐ ํ์ํ ์๊ฐ์ด ์๋ค. (์์์ ์ธ๊ธํ๋ค์ํผ Prisma๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ค๋ณด๋ Prisma, Prisma seeding์ ๋ํ ๋์ ์ดํด๊ฐ ์ ํ์ ์ผ ์ ์๊ณ ์ด ๊ธ์ด ๊ณต์ ๋ฌธ์์ ๊ธฐ์ดํด ์๊ธดํ์ง๋ง ๋ ์ ํํ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค.)
Prisma์ ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด ์ด ๋งํฌ๋ฅผ ํ์ธํ๋ผ.
Seeding์ ๋ฌด์์ด๊ณ ์ธ์ ํ์ํ๊ฐ?
Seeding์ด ๋ฌด์์ธ์ง๋ถํฐ ๊ฐ๋จํ ์ดํด๋ณด๋ฉด ๊ณต์ ๋ฌธ์์๋ ์ด๋ ๊ฒ ํ ๋ฌธ์ฅ์ผ๋ก ์ค๋ช ํ๋ค.
Seeding allows you to consistently re-create the same data in your database
Seeding์ ๋น์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ด์ฑ์๊ฒ ์ฌ์์ฑํ๋๋ก ํด์ค๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ๋ ํ ์์ ๋ฐ์ดํฐ๋ผ๋ ์จ๋ฅผ ๋ฏธ๋ฆฌ ์ฌ์ด๋๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค. ์๋ฌดํผ ๊ณต์ ๋ฌธ์์์๋ ๊ณ์ํด์ seeding์ด ์ฌ์ฉ๋ ์ ์๋ ๋ถ๋ถ์ ๋ํด ์ด๋ ๊ฒ ์ค๋ช ํ๋ค.
- Populate your database with data that is required for your application to start - for example, a default language or a default currency.
- Provide basic data for validating and using your application in a development environment. This is particularly useful if you are using Prisma Migrate, which sometimes requires resetting your development database.
- ๋น์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋น์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐํด์ค๋ค. ์๋ฅผ ๋ค๋ฉด ๊ธฐ๋ณธ ์ธ์ด๋ ๊ธฐ๋ณธ ํตํ.
- ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒ์ฆํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค. ์ด๊ฒ์ ๋น์ ์ ๊ฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ค์ ํด์ผ ํ๋ Prisma Migrate๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํนํ ์ ์ฉํ๋ค.
Prisma Migrate์ ๋ํด์๋ ๋ค๋ฃจ์ง ์๋๋ค. ์ ๊ธ์ PlanetScale์์ ๋ธ๋์น๋ฅผ ์์ฑํ๊ณ deploy requestํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ ธ์๋๋ฐ ๊ฐ๋ฐํ๋ ๊ณผ์ ์ ์ฌ๋ฌ ๋ธ๋์น๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ seeding ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ํธ๋ฆฌํ๊ณ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ค ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. PlanetScale์์ ๋ธ๋์น๋ฅผ ์๋ก ์์ฑํ๋ฉด schema๋ง ๋ณต์ฌ๊ฐ ๋๊ณ ๋ฐ์ดํฐ๋ ๊ฐ์ด ๋ณต์ฌ๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๋ธ๋์น๋ฅผ ์์ฑํ ๋๋ง๋ค ์๋ก์ด ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ ๊ฒ์ด๋ค. ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ค๋ฉด Seed ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆด์ง ๋ชจ๋ฅด์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋๋ผ๋ ๊ณ์ ๋ฐ๋ณตํ์ฌ ์ถ๊ฐํด ์ฃผ์ด์ผ ํ๋ ๊ฒ์ด๋ผ๋ฉด ์๊ฐ์ ์กฐ๊ธ ๋ ๋ค์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ์ง๋ ๋ชจ๋ฅธ๋ค.
Seeding์ ์ด๋ป๊ฒ ํ๋ ๊ฒ์ธ๊ฐ? (JavaScript ๊ธฐ์ค)
1. seed.js ํ์ผ ์ถ๊ฐํ๊ธฐ
ํ๋ก์ ํธ์์ prisma๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด /prisma๋ผ๋ ๋๋ ํ ๋ฆฌ๊ฐ ์์ ๊ฒ์ด๋ค. ํด๋น ๋๋ ํ ๋ฆฌ ์์ seed.js ํ์ผ์ ์์ฑํด์ค๋ค.
2. seed.js ์ ์คํฌ๋ฆฝํธ ์์ฑํ๊ธฐ
์๋์ ์ฝ๋๋ ๊ณต์ ๋ฌธ์์ ๋์์๋ ์ํ ์คํฌ๋ฆฝํธ์ด๋ค.
alice, bob์ด๋ผ๋ user๋ฅผ ์ถ๊ฐํ๊ณ ์๊ณ ๋ชจ๋ upsert๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ where์ ๋ํด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ update๋ฅผ ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ก ์์ฑํ๋ ์ฟผ๋ฆฌ๋ก ์์ธํ ์ฌ์ฉ๋ฒ์ ์ฌ๊ธฐ์ ํ์ธํด๋ณด์(๋งํฌ). ์ด ์คํฌ๋ฆฝํธ๋ ์์ ์ ์คํค๋ง์ ํ์ํ ๋ฐ์ดํฐ์ ๋ง์ถฐ์ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
async function main() {
const alice = await prisma.user.upsert({
where: { email: 'alice@prisma.io' },
update: {},
create: {
email: 'alice@prisma.io',
name: 'Alice',
posts: {
create: {
title: 'Check out Prisma with Next.js',
content: 'https://www.prisma.io/nextjs',
published: true,
},
},
},
})
const bob = await prisma.user.upsert({
where: { email: 'bob@prisma.io' },
update: {},
create: {
email: 'bob@prisma.io',
name: 'Bob',
posts: {
create: [
{
title: 'Follow Prisma on Twitter',
content: 'https://twitter.com/prisma',
published: true,
},
{
title: 'Follow Nexus on Twitter',
content: 'https://twitter.com/nexusgql',
published: true,
},
],
},
},
})
console.log({ alice, bob })
}
main()
.catch((e) => {
console.error(e)
process.exit(1)
})
.finally(async () => {
await prisma.$disconnect()
})
์๋๋ ๋ด๊ฐ ์์ฑํ seed.js์ ์ผ๋ถ์ด๋ค.
const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
async function main() {
const category = await prisma.category.upsert({
where: { id: 1 },
update: {},
create: {
name: "Side project",
},
});
const test = await prisma.user.upsert({
where: { id: 1 },
update: {},
create: {
email: "test@test.com",
name: "test",
Article: {
create: {
categoryId: 1,
title: "[ํ์ ๊ณํ] ์๋ก์ด ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด์",
content:
'์๋ก์ด ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์์ํ ์๊ฐ์ด๋ค. ๋ฌด์์ด๋ ์ง์ ํด๋ด์ผ ๋๋ผ๋ ๊ฒ๋ ๋ง๊ณ ๋ฐฐ์ฐ๋ ๊ฒ๋ ๋ง์ ๊ฒ ๊ฐ๋ค...',
... // ์๋ต
},
},
},
});
console.log({ category, test });
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
3. seed.js ํ์ผ์ ๋ํด package.json์ ์ถ๊ฐํ๊ธฐ
4. Seeding ํ๊ธฐ
์์ ์ปค๋งจ๋๋ฅผ ์คํํ๋ฉด seeding์ด ์งํ๋๊ณ ์ฑ๊ณต์ ์๋์ ๊ฐ์ด ํ์ธํ ์ ์๋ค.