๐ŸŒˆTodoList _with Prisma_01

RoRAยท2023๋…„ 4์›” 13์ผ
0

TECHIT_BlockChain_School_3

๋ชฉ๋ก ๋ณด๊ธฐ
8/9

๐Ÿช‚ 2023. 04. 13. Thursday_ ๋”์ด์ƒ ๋ฏธ๋ฃจ๋ฉด ์•ˆ๋ ๊ฑฐ ๊ฐ™์•„์„œ ๋‹ค์‹œ velog ์ž‘์„ฑ ์‹œ์ž‘ ! ๐Ÿช‚


โœ… ToDoList

(with Prisma - Backend & Database)

โ €โ €โ €

Intro

์•ˆ๋…•ํ•˜์„ธ์š”!๐Ÿ˜

๋ชจ๋‘ ํ•จ๊ป˜ 4๊ฐœ์›” ๋™์•ˆ ํ•˜๋‚˜์˜ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ทธ๋‚ ๊นŒ์ง€ ํ™”์ดํŒ…ํ•ฉ์‹œ๋‹ค !

* ์ด ๊ณณ์—์„œ๋Š” ๋‹น์ผ์— ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ณต์Šตํ•˜๋Š” ์šฉ๋„๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

* ์ง€๋‚œ ์‹œ๊ฐ„์— ์ž‘์—…ํ–ˆ๋˜ "To-Do-List" ํ”„๋กœ์ ํŠธ์— Prisma๋ฅผ ์ ์šฉํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค ! ์˜ค๋Š˜ ์ด ์‹œ๊ฐ„์—๋Š” Prisma ๊ธฐ๋ณธ ์„ธํŒ…์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋ณต์Šตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
โ €โ €โ €โ €
โ €โ €


โœ… Prisma ๊ธฐ๋ณธ ์„ธํŒ…

๐Ÿ‘‰ STEP 01. ํŒŒ์ผ ์ƒ์„ฑ ( .jsx or .js)โ €โ €

โœ”๏ธ 01. bakend ํŒŒ์ผ(์ œ์ผ ์ฒ˜์Œ ์ƒ์„ฑ)

โ €โ €โ–ช๏ธ app.js ํŒŒ์ผ ์ƒ์„ฑโ €โ €โ €โ €โ €โ €โ €โ €โ €--> โ €โ €โ €โ €โ €โ €(์•„๋ž˜ ๊ธฐ๋ณธ setting ๋ช…๋ น์–ด ์ž‘์„ฑ ํ›„ ์ƒ์„ฑ)
โ €โ €โ–ช๏ธ routes/user.js ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐโ €--> โ €โ €โ €โ €โ €โ €(์•„๋ž˜ ๊ธฐ๋ณธ setting ๋ช…๋ น์–ด ์ž‘์„ฑ ํ›„ ์ƒ์„ฑ)

โ €โ €โ €โ €โ €
โœ”๏ธ 02. frontend ํŒŒ์ผ (์ œ์ผ ์ฒ˜์Œ ์ƒ์„ฑ)

โ €โ €โ €

๐Ÿ‘‰ STEP 02. ๊ธฐ๋ณธ setting ๋ช…๋ น์–ด

โœ”๏ธ express ์„ค์น˜

โ–ช๏ธ npm init
โ–ช๏ธ npm -i express

โ €โ €

โœ”๏ธ nodemon ์„ค์น˜

โ–ช๏ธ npm i -D nodemon

โ–ช๏ธ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด package.json ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

	๐Ÿ”ธpackage.json ํŒŒ์ผ์—์„œ  ๋‹ค์Œ ๋‚ด์šฉ ์ˆ˜์ •ํ•˜๊ธฐ
"scripts": {
	"dev": "nodemon app.js"
},
โ–ช๏ธ 'npm run dev' ๋ช…๋ น์–ด๋กœ backend ์„œ๋ฒ„ ์ ‘์†ํ•˜๊ธฐ !

โ €โ €โ €

๐Ÿ‘‰ STEP 03. Prisma ์‚ฌ์šฉ ์‹œ์ž‘ !

โœ”๏ธ 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์„ ํ™œ์šฉํ•˜๋ฉด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์ˆœ๊ฐ„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค.

โ €โ €โ €

๐Ÿ‘‰ STEP 04. MySQL DB ๊ณต๊ธ‰์ž๋กœ ์„ค์ •

โœ”๏ธ Schema.prisma ํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ธฐ

โ–ช๏ธ provider์€ mysql๋กœ ๋ณ€๊ฒฝ
โ–ช๏ธ relationMode = "prisma" ์ถ”๊ฐ€
	๐Ÿ”ธMySQL์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต๊ธ‰์ž๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ ,
      ๊ด€๊ณ„ ๋ชจ๋“œ๊ฐ€ Prisma๋กœ ์„ค์ •๋œ๋‹ค.
  datasource db {
      provider = "mysql"
      url      = env("DATABASE_URL")
      relationMode = "prisma"
  }

โ €โ €โ €

๐Ÿ‘‰ STEP 05. PlanetScale

โœ”๏ธ 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"

โ €โ €

๐Ÿ‘‰ STEP 06. Prisma Studio ์—ฐ๊ฒฐ

โœ”๏ธ backend ํด๋” ๊ฒฝ๋กœ terminal ์ƒˆ๋กœ ์˜คํ”ˆ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด ์ž…๋ ฅ

> npx prisma db push
> npx prisma studio

โ €

โ €โ €โ €


๐Ÿ“Œ23.04.13

0๊ฐœ์˜ ๋Œ“๊ธ€