๐ก TIL 20230822 - Prisma, Planet scale ์ ์ ๋ฐ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ
1. Prisma, Planet Scale, Vitess
1) Prisma
Prisma๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ํ๋์ ์ด๊ณ ๊ฐ๋ ฅํ ORM (Object-Relational Mapping) ๋๊ตฌ์ด๋ค. Prisma๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๊ฐํธํ๊ฒ ์ ์ํ ์ ์๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ญ์ ์ฝ๊ฒ ์์ฑํ๊ณ ์คํํ ์ ์๋ค. Prisma๋ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๊ณผ ํตํฉํ ์ ์์ผ๋ฉฐ, TypeScript์ JavaScript๋ฅผ ์ง์ํ๋ฉฐ, ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๋๊ธฐํํ์ฌ ๊ฐ๋ฐ์์๊ฒ ๊ฐ๋ ฅํ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ค.
2) Planet Scale
MySQL๊ณผ ํธํ๋๋ ์๋ฒ๋ฆฌ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ํ์ํค์ง ์์ผ๋ฉด์ ํ์ฅ์ฑ, ์ฑ๋ฅ ๋ฐ ์์ ์ฑ์ ์ ๊ณตํ๋ ์๋น์ค์ด๋ค.
Vitess ๊ฐ๋ฐ ํ ์ธ์๋ค์ด ๋ง๋ ์๋น์ค๋ก, MySQL์ ์์ ์ฑ๊ณผ ์คํ์์ค์ธ Vitess์ ํ์ฅ์ฑ์ ๊ฐ์ถ์๋ค๋ ์ฅ์ ๋๋ฌธ์ 2021๋ ์ ์๋น์ค๋ฅผ ๋ฐ์นญํ ์ดํ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ ์๋ฌธ์ด ๋(!?) ์๋น์ค๋ผ๊ณ ํ๋ค.
3) Vitess
Vitess๋ Youtube ์๋น์ค์ ๋๋ฌด ๊ฑฐ๋ํด์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์ผ์ผ๋งํ๊ธฐ ์ํด Youtube์์ ์คํ ์์ค๋ก ๊ฐ๋ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ฐ์ด๋ฉ ๋ฐ ํด๋ฌ์คํฐ๋ง ์์คํ ์ผ๋ก, ์ฃผ๋ก ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ค. Vitess๋ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๊ฐ์ํ ๊ณ์ธต์ ์ ๊ณตํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ๋ฌ ๋ ธ๋๋ก ๋ถํ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ํคํ ์ฒ๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ฅ์ฑ ๋ฐ ๊ฐ์ฉ์ฑ์ ํฅ์์ํค๊ณ , ๋์ ๋ถํ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
2. ๊ธฐ๋ณธ ์ ์
// PlanetScale auth
pscale auth login
// PlanetScale๊ณผ ํ๋ก์ ํธ(๋ก์ปฌ) ์ฐ๊ฒฐ
pscale connect project-name
// secure tunnel์ ํตํด PlanetScale๊ณผ ์ฐ๊ฒฐ๋๋ url ํ๊ฒฝ๋ณ์ ์ค์
DATABASE_URL="mysql://000.0.0.0:0000/project-name"
// scheme.prisma์์ ์คํค๋ง ์ ์ ํ push
npx prisma db push
// ํ๋ฆฌ์ฆ๋ง ์คํ๋์ค ์คํ -> DB ๊ด๋ฆฌ์ ํจ๋
npx prisma studio
// ํ๋ฆฌ์ฆ๋ง ํด๋ผ์ด์ธํธ ์ค์น
yarn add @prisma/client
3. ํ๋ฆฌ์ฆ๋ง ํด๋ผ์ด์ธํธ ์ค์น ํ client.ts ํ์ผ ์ค์
import { PrismaClient } from "@prisma/client";
export default new PrismaClient();
- ์ค์ ํ npx prisma db push๋ก ์๋ฒ์ push
4. schema.prisma
ํ๋ฆฌ์ฆ๋ง๋ฅผ ์ค์ ํ๊ณ ๋ฐ์ดํฐ์ ์๊น์๋ฅผ ์ ์ํ๋ ํ๋ฆฌ์ฆ๋ง์ ์ฌ์ฅ๊ณผ ๊ฐ์ ํ์ผ..!
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL") // ํ๊ฒฝ๋ณ์์ ์ค์ ํด์ค planet scale secure url
// relationMode ์ค์ : ๋ฐ์ดํฐ ๊ฐ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ ๋ prisma ์ค์ ๋๋ก ํ๊ฒ ๋ค๋ ์๋ฏธ
// ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ
relationMode = "prisma"
}
// npx prisma db push
model User {
id Int @id @default(autoincrement())
phone Int? @unique
email String? @unique
name String
avartar String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ
- ex. User DB : { id: 1, username: john }
- Comments DB์ { id: 1, text: wow!, user: 5 }๋ก ๋ฑ๋กํ๋ คํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ (user: 5๊ฐ ์์์๋)
- ์ผ๋ฐ์ ์ธ sql์ด๋ postgresql ํ๊ฒฝ์์๋ ์ธ๋ํค ์ ์ฝ๋๋ฌธ์ ์๋ฌ ๋ฐ์ํจ
- comments DB์ user๋ผ๋ ์ธ๋ํค๊ฐ ์์ผ๋ User ํ ์ด๋ธ์์ ๊ฒ์ํ๊ธฐ ๋๋ฌธ
- ํ์ง๋ง ์ด๋ฒ์ ์ฌ์ฉํ๋ Vitess๋ foreign key constranint๋ฅผ ์ง์ํ์ง ์์
- ๋ฐ๋ผ์ ์ด๋ฌํ ํ์ธ์์ ์ DB side์์ ํ๋ ๊ฒ์ด ์๋๋ผ prisma๋ฅผ ํตํด์ ํ ๊ฒ
์ฐธ๊ณ ์ฌ์ดํธ
๋ ธ๋ง๋ ์ฝ๋ - ๋น๊ทผ๋ง์ผ ํด๋ก ์ฝ๋ฉ
PlanetScale์ Prisma๋ก ๋ ์ ์ฌ์ฉํ๊ธฐ
'โ๏ธ What I Learned > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] ์ผ์์ ์ฌ๊ฐ์ง๋ TDZ(Temporal Dead Zone) (0) | 2023.08.26 |
---|---|
[TIL] import { useRouter } from โnext/routerโ์ โnext/navigationโ ์ฐจ์ด (0) | 2023.08.24 |
[TIL] Prisma์ ๋ํด (0) | 2023.08.20 |
[TIL] Tailwind CSS ์ฅ๋จ์ , ์ฐ์ต์์ (0) | 2023.08.19 |
[TIL] Next.js 13 - getStaticProps, getStaticPaths (feat. 12๋ฒ์ ์์์ getServerSideProps) (0) | 2023.08.18 |