๐ช 2023. 04. 13. Thursday_ ๋์ด์ ๋ฏธ๋ฃจ๋ฉด ์๋ ๊ฑฐ ๊ฐ์์ ๋ค์ velog ์์ฑ ์์ ! ๐ช
โ โ โ
์๋ ํ์ธ์!๐
๋ชจ๋ ํจ๊ป 4๊ฐ์ ๋์ ํ๋์ ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ทธ๋ ๊น์ง ํ์ดํ ํฉ์๋ค !
* ์ด ๊ณณ์์๋ ๋น์ผ์ ๋ฐฐ์ด ๋ด์ฉ์ ๋ณต์ตํ๋ ์ฉ๋๋ก ๊ธ์ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค.
* ์ง๋ ์๊ฐ์ ์์
ํ๋ "To-Do-List" ํ๋ก์ ํธ์ Prisma๋ฅผ ์ ์ฉํด ๋ณด๋ ค๊ณ ํฉ๋๋ค ! ์ค๋ ์ด ์๊ฐ์๋ Prisma ๊ธฐ๋ณธ ์ธํ
์ ๊ดํ ๋ด์ฉ์ ๋ณต์ตํด ๋ณด๊ฒ ์ต๋๋ค.
โ โ โ โ
โ โ
โ๏ธ 01. bakend ํ์ผ(์ ์ผ ์ฒ์ ์์ฑ)
โ โ โช๏ธ app.js ํ์ผ ์์ฑโ โ โ โ โ โ โ โ โ --> โ โ โ โ โ โ (์๋ ๊ธฐ๋ณธ setting ๋ช
๋ น์ด ์์ฑ ํ ์์ฑ)
โ โ โช๏ธ routes/user.js ํ์ผ ์์ฑํ๊ธฐโ --> โ โ โ โ โ โ (์๋ ๊ธฐ๋ณธ setting ๋ช
๋ น์ด ์์ฑ ํ ์์ฑ)
โ โ โ โ โ
โ๏ธ 02. frontend ํ์ผ (์ ์ผ ์ฒ์ ์์ฑ)
โ โ โ
โ๏ธ express ์ค์น
โช๏ธ npm init
โช๏ธ npm -i express
โ โ
โ๏ธ nodemon ์ค์น
โช๏ธ npm i -D nodemon
โช๏ธ ์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด package.json ํ์ผ์ด ์์ฑ๋๋ค.
๐ธpackage.json ํ์ผ์์ ๋ค์ ๋ด์ฉ ์์ ํ๊ธฐ
"scripts": {
"dev": "nodemon app.js"
},
โช๏ธ 'npm run dev' ๋ช
๋ น์ด๋ก backend ์๋ฒ ์ ์ํ๊ธฐ !
โ โ โ
โ๏ธ Prisma ์ค์นํ๊ธฐ
โช๏ธ npm i -D prisma
โช๏ธ ์ ๋ช
๋ น์ด ์์ฑ ํ prisma/schema.prisma ํ์ผ์ด ์์ฑ๋๋ค.
โ โ โ
โ๏ธ prisma/schema.prismaํ์ผ์ ๋ด์ฉ ์์ฑํ๊ธฐ
โช๏ธ 01. User model๋ช
์์ฑํ๊ธฐ
๐ธid, account, name, createdAt, upDatedAt ์ ์
model User{
id Int @id @default(autoincrement())
account String @unique
name String?
createdAt DateTime @default(now())
upDatedAt DateTime @updatedAt
}
โช๏ธ 02. : Todo๋ช
์์ฑํ๊ธฐ
๐ธid, todo, isDone, userId, createdAt, updatedAt ์ ์
model Todo {
id Int @id @default(autoincrement())
todo String
isDone Boolean
userId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([userId])
//๊ฒ์ ํจ์จ ์ฆ๊ฐํ๊ฒ ํด์ฃผ๋ ์ฝ๋
}
โช๏ธ 03. : User -- (1 : N) --> Todo ๊ด๊ณ์ค์
๐ธN ์ชฝ์ธ Todo ์ ๋ค์ ์ฝ๋ ์ถ๊ฐํ๊ธฐ
user User @relation(fields:[userId], references:[id])
/* ์ ์ฝ๋ ๋ฏ์ด ํด์
@relation : ์คํค๋ง์์ ๋ ์ ํ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ ์ง์๋ฌธ์ด๋ค.
fields:[userId] : ๊ด๊ณ๊ฐ userId ํ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋๋ก ์ง์
references:[id] : id๋ ๊ด๊ณ์ ๋์์ ์ง์ ํ๋ค.(User์ Id๋ฅผ ์๋ฏธํจ)
*/
๐ธ1 ์ชฝ์ธ User ์ ๋ค์ ์ฝ๋ ์ถ๊ฐํ๊ธฐ
todos Todo[]
โช๏ธ 04. ์์ฑํ ๋ด์ฉ ์ดํด๋ณด๊ธฐ !
๐ธ String? : '?'๋ ๊ฐ์ด ์์ด๋ ๋๊ณ , ์์ด๋ ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
๐ธ @default: ํด๋น ํ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ค.
๐ธ @unique: ํด๋น ํ๋์ ๊ฐ์ด ๊ณ ์ (unique)ํด์ผ ํจ์ ๋ํ๋ธ๋ค.
๐ธ @updatedAt: ํด๋น ํ๋๊ฐ ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ ์๊ฐ์ ์ ์ฅํ๋ค.
๐ธ autoincrement()
: ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํ ๋๋ง๋ค id ํ๋๋ ์๋์ผ๋ก ์ด์ ์ฌ์ฉ์์ id ๊ฐ์ 1์ ๋ํ ๊ฐ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
๐ธ @default{now()}๋ฅผ ์์ฑํ๋ฉด ์์ฑ๋๋ ์๊ฐ ๊ฐ์ createdAt์ผ๋ก ์ ์ฅํ๋ค.
๐ธ upDatedAt
: ์ฒ์์๋ ์์ฑ์๊ฐ์ผ๋ก ์ ์ฅ๋์ด ์์ง๋ง, @updataedAt์ ํ์ฉํ๋ฉด ์
๋ฐ์ดํธ ๋๋ ์๊ฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
โ โ โ
โ๏ธ Schema.prisma ํ์ผ ์์ ํ๊ธฐ
โช๏ธ provider์ mysql๋ก ๋ณ๊ฒฝ
โช๏ธ relationMode = "prisma" ์ถ๊ฐ
๐ธMySQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต๊ธ์๋ก ์ฌ์ฉํ๋๋ก ๋ฐ์ดํฐ ์์ค๊ฐ ๊ตฌ์ฑ๋๊ณ ,
๊ด๊ณ ๋ชจ๋๊ฐ Prisma๋ก ์ค์ ๋๋ค.
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
relationMode = "prisma"
}
โ โ โ
โ๏ธ PlanetScale ์ด๋ ?
โช๏ธ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋น์ค์ด๋ค.
โช๏ธ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฝ๋ค.
โช๏ธ ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ ํตํฉ๋๋ค.
โช๏ธ ๊ณ ๋๋ก ํ์ฅ ๊ฐ๋ฅํ๊ณ ๊ฐ์ฉ์ฑ์ด ๋๋ค.
โ โ โ
โ๏ธ PlanetScale-CLI ์ค์นํ๊ธฐ
01. ์ฌ์ดํธ ์ ์ (https://planetscale.com/)
โช๏ธ ๊ณ์ ์์ฑ
โช๏ธ database ์์ฑํ๊ธฐ_ ํ์ผ๋ช
: to-do-list
02. SCOOP ๋ฅผ ๋จผ์ ์ค์นํด์ผ ํ๋ค.
โช๏ธ ์ฌ์ดํธ(https://scoop.sh/)์ ๋ค์ด๊ฐ ๋ค์ ๋ช
๋ น์ด ์คํ
โช๏ธ ์ฃผ์ํ ์ !!!! ๊ผญ PowerShell ํฐ๋ฏธ๋ฃ์์ ์
๋ ฅํ๊ธฐ !
> Set-ExecutionPolicy RemoteSigned -Scope CurrentUse
> irm get.scoop.sh | iex
โ โ โ
03. pscale์ scoop์ ํตํด ์ฌ์ฉํ ์ ์๋ค. ์๋ ๋ช
๋ น์ด ์
๋ ฅ
> scoop bucket add pscale https://github.com/planetscale/scoop-bucket.git
> scoop install pscale mysql
> scoop update pscale
โ โ โ
04. ๋ก๊ทธ์ธํ๊ธฐ
โช๏ธ PScale CLI์์ PScale ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฅํ ๋ช
๋ น์ด
> pscale auth
โ โ
05. ์ฌ์ดํธ์์ ์์ฑํ db์ ์ฐ๊ฒฐํ๊ธฐ
> pscale connect to-do-list
โ โ
06. ํ๊ฒฝ๋ณ์ ๋ณ๊ฒฝ (๋ค๋๋ถํ์ผ์์ ์งํใ
~)
> DATABASE_URL="mysql://~~~~~~~/to-do-list"
โ โ
โ๏ธ backend ํด๋ ๊ฒฝ๋ก terminal ์๋ก ์คํ ํ ๋ค์ ๋ช ๋ น์ด ์ ๋ ฅ
> npx prisma db push
> npx prisma studio
โ
โ โ โ