โ ORM์ด ๋ฌด์์ด๋ฉฐ ORM ์ค ํ๋์ธ ๐Prisma๋ฅผ ์ฌ์ฉํด์ MySQL๊ณผ express์๋ฒ๋ฅผ ์ฐ๊ฒฐํด๋ณด๋ฉฐ 1> ORM ํด๋์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์ฌ์ด์ ๋งค์นญ ๊ด๊ณ๋ฅผ ์ดํดํ๊ณ
2> Prisma migration์ ํ์ฉํด ์ฝ๋๋ก ์์ฑํ ๋ชจ๋ธ์ ํ ์ด๋ธ๋ก ๋ณํํด๋ณด๋ ๊ณผ์ ์ ์ดํดํ์.
- ์๋ฒ๊ฐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ณด๋ด์ฃผ์ง ๋ชปํ๊ธฐ๊ธฐ์ ์ต์คํ๋ ์ค ์๋ฒ์์ ๊ฐ๊ณต์ ๊ฑฐ์ณ์ ๋ณด๋ธ๋ค.
=> ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฒ๋ ๋ ๋ฆฝ์ ์ธ ๊ด๊ณ์ด๋ค.
์ด๋, ์ด ๋์ ์ฐ๊ฒฐํด์ฃผ๋ ๋ฌผ๋ฆฌ์ ์ธ ๋งค๊ฐ์ฒด๊ฐ ํ๋ฆฌ์ฆ๋ง์ด๋ค.
-WHAT ISโ
<script>
const dongsan = new Pet('๋์ฐ์ด', '์ ๊ฐ๋ฐ', 12)
console.log(dongsan.name) // '๋์ฐ์ด'
console.log(dongsan.owner) // '์ ๊ฐ๋ฐ'
console.log(dongsan.age) // 12
</script>
- ORM(Object Relational Mapping)์ด๋ ๋ฐ์ดํฐ ํ๋ํ๋๋ฅผ ๊ฐ์ฒด์ฒ๋ผ ์ด์ฉํ๋ ๊ฐ๋ ์ ๋งํ๋ค.
- ๋ง์น User ํด๋์ค์ name, age, user_id๋ผ๋ ์์ฑ์ด ์๊ณ ์์ฑ์ ๋ฐ๋ฅธ ๊ฐ์ด ์๋ค๋ฉด
1> ํ ์ด๋ธ ํ๋๊ฐ ํด๋์ค 2> ์ปฌ๋ผ์ ์์ฑ์ด๋ฉฐ 3> ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ํ์ค์ ํด๋์ค์ ์ธ์คํด์ค์ฒ๋ผ ํ์ฉ๋๋ค.- ์ด๋ ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ๊ณผ ์ปฌ๋ผ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฅผ
ํด๋์ค
์ ํน์ฑ๊ณผ ์ฐ๊ด์ง์ด ์ฌ๊ณ ํ๋ ํจ๋ฌ๋ค์์ ORM์ด๋ผ๊ณ ํ๋ค.
migration
์ ์ฝ๋๋ก ์์ฑํ ํด๋์ค๋ฅผ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ๋ก ์ฎ๊ธฐ๋ ๊ณผ์ ์ผ๋ก ์ฆ, prisma์์ ์์ฑํ model(ํด๋์ค)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฌธ๋ฒ์ผ๋ก ๋ณํํด์ฃผ๋ ๋ช ๋ น์ด์ด๋ค.- ORM์ migrate๋ฅผ ํ๊ฒ๋๋ฉด migration ํ์ผ์ด ์๊ฒจ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฉ๋๊ณ ORM์์ ๋ฐ์ดํฐ๋ฒ ์ค์ ๊ตฌ์กฐ๋ฅผ migration file์์ ๊ด๋ฆฌํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๊ฒฝ๋ ๊ณผ์ ์ ์ดํด ๋ณผ ์ ์๋ค.
migration
์ ํ๋ค๋ ๊ฑด model์ ์๋ skima ํ์ผ์ ๋ชจ๋ SQL๋ก ๋ณํํ ๋ค SQL์ ๋ค์ Datebase๋ก ์ ์ฉํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค.๋ชจ๋ธ > ๋ง์ด๊ทธ๋ ์ด์ > ๋ฐ์ดํ๋ฒ ์ด์ค
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง๋ค๊ธฐ
- ๋ชจ๋ธ ๋ด๋ถ์ ์ปฌ๋ผ์ @map์ ์์ผ๋ก์ ("categories")์ ๊ฐ์ด mysql์์ ์ค์ ํ ์ปฌ๋ผ๊ณผ ๋์ผํ๊ฒ ๋งตํ ํด์ค์ผํ๋ค.
- prisma์ model์ ์ปจ๋ฒค์ ์ mysql์ ๋ง๊ฒ ๋ณํํ๊ธฐ ์ํด์ ์ปฌ๋ผ๋ค์ @@map ํด์ค๋ค.
- ๋ชจ๋ธ ์์ฑ ํ ๋ง์ด๊ทธ๋ ์ด์ ์ ํด์ฃผ๊ธฐ
npx prisam migrate dev --name ๋ด์ฉ
- ๋ด์ฉ์๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๋ช ์์ ์ผ๋ก ์ ์ด์ค๋ค.
์ปค๋ฐ ๋ฉ์ธ์ง ๋จ๊ธฐ๋ฏ, ์ด๋ค ๋ง์ด๊ทธ๋ ์ด์ ์ ๋จ๊ธฐ๋ ์ง์ ๋ํด์ ์ ์ด์ค๋ค.
- ์ค์ ๋ก ์ด ๊ณผ์ ์ ๋ ๊ฐ์ง Model > Migration์ Migration > Database๋ก ๋๋ ์ง๋ค.
npx prisma migrate dev --create-only
- Model > Migration ๊ณผ์ ๋ง ๋ด์ ๋ช ๋ น์ด๋ก DB์ ์ ์ฉํ๊ธฐ ์ Model์์ ์์ ๋ Migration ํ์ผ ๋ง์ ์ ์ฉํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
1> Prisam๋ npm ์ ์ด์ฉํด ์ค์น
- ์ํ๋ ์์น์ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ mysql์ ์ฌ์ฉํ ์ ์๋๋ก ์๋ ๋ ํจํค์ง๋ฅผ ์ค์นํ๋ค.
npm install prisma --save-dev npm install @prisma/client --save
2> ๋๊ฐ์ง ํจํค์ง, nodemon๊ณผ dotenv ์ค์นํ๊ธฐ
- nodemon : ์ฝ๋๊ฐ ๋ณ๊ฒฝ ๋ ์ดํ, ์๋ฒ๋ฅผ ์ฌ์คํํ์ง ์์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ฒ์ ์ ์ฉ๋๋๋ก ํ๋ ํจํค์ง
- dotenv : ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํจํค์ง
npm install dotenv nodemon -D
3> ํ๋ฆฌ์ฆ๋ง ์์ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๊ธฐ
3_1>
npx prisma // ๋ช ๋ น์ด ํ์ธ npx prisma init // prisma ์ด๊ธฐ ์ธํ
3_2>
- prisma/schema.prisma
datasource db { provider = "mysql" url = env("DATABASE_URL") }
3_3> - ๋ ธ์ถํ์ง ์๊ธฐ ์ํด์ .env์์ ์จ๊ฒจ์ค๋ค.
- .env
DATABASE_URL = "mysql://USERNAME:PASSWORD@localhost:3306/DATABASE_NAME"
- ์ด์ฒ๋ผ prisma๋ฅผ ํตํด์ express๊ฐ Database(mysql)์ ์ ๊ทผํ๋ ค๋ฉด Database์ prisma๋ฅผ ์ฐ๊ฒฐํ๋ ์ค์ ์ ํด์ค์ผ prisma๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
<prisma> model comments { id Int @id @default(autoincrement()) user_id Int created_at DateTime? @default(now()) updated_at DateTime? deleted_at DateTime? articles articles @relation(fields: [article_id], references: [id]) users users @relation(fields: [user_id], references: [id]) @@index([user_id], name: "user_id") } </prisma>
prisma์์ pk & fk ๊ด๊ณ ์ค์ ํ๊ธฐ
- @relation(filed: [author] reference:)
drink๊ฐ categorty๋ฅผ ๋ ํผ๋ฐ์ค๋ก ์ผ๋ฏ์ด
id ์์ฑ์ ๋ถ์ฌ๋๋ฉด ์๋์ผ๋ก ํ๋ผ์ด๋จธ๋ฆฌ ํค๊ฐ๋๋ค.- ?๋ฅผ ํ์ ์์ ๋ถ์ด๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ๋ ํ ์ดํฐ ํ์ ์ ์์ด์ nullabel์ ๋ง๋ค์ด์ค๋ค.
- ํ๋ฆฌ์ฆ๋ง์์ ๋ชจ๋ธ์ ๋ง๋ค ๋ ํ ์ด๋ธ์ด ์์ฑ๋๋ค๋ ๊ฒ์ ๋จธ๋ฆฌ์์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์์ด์ผํ๋ค.
- ํ๋ฆฌ์ฆ๋ง์ ์ปจ๋ฒค์ ์ ๋ชจ๋ธ ์ด๋ฆ์ ํด๋์ค์ฒ๋ผ ๋๋ฌธ์๋ก ์์ํ๊ณ mysql ์ค๋ค์ดํฌ ์ผ์ด์ค์ ๋ณต์ํ ํํ๊ณผ ์๋ฌธ์๋ฅผ ๋ง์ถ๊ธฐ ์ํด์ map ํด์ค๋ค.
- ์์ฝ๋์ orm๊ณผ prisma์ ๋ํ ์ํ๋ ํ์ดํ ๋์น๋ ๊ฐ์ ์ค :]
์ค์ฐ ใ ใ ๊ณต๋ถํ๋ค ์ฐ์ จ๊ตฐ์ ๋ฏผ์ฌ๋!
Prisam ์๋๊ตฌ Prisma ใ ใ ใ ใ ใ