Session 21. CRUD

๊น€๋ฏผ์žฌยท2021๋…„ 9์›” 19์ผ
0

TIL, WeCode, Courseย 

๋ชฉ๋ก ๋ณด๊ธฐ
39/48
post-thumbnail

*๐Ÿ”Study Keyword :

๐Ÿ”‘CRUD์— ๊ฐœ๋…๊ณผ ๐Ÿ—๏ธPrisma Client๋ฅผ ์ด์šฉํ•œ C,R ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

- CRUD

  • CRUD๋ž€ CREATE, READ , UPDATE, DELETE์˜ ์ค„์ž„๋ง๋กœ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์กฐํšŒ ์ˆ˜์ • ์‚ญ์ œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋„ค๊ฐ€์ง€ ๊ฒฝ์šฐ์— ํ•ด๋‹น๋œ๋‹ค

-C: ํšŒ์›๊ฐ€์ž…, ๊ธ€์ž‘์„ฑ ,์ƒํ’ˆ๋“ฑ๋ก
-R: ํšŒ์›์กฐํšŒ, ์ƒํ’ˆ ์กฐํšŒ
-U: ์œ ์ € ์ •๋ณด ๋ณ€๊ฒฝ, ์ƒํ’ˆ๋ช… ๋ณ€๊ฒฝ
-D: ์œ ์ € ์‚ญ์ œ
=> D์˜ ๊ฒฝ์šฐ ์‚ฌ์‹ค ์‹ค์ œ๋กœ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  isDelete๊ฐ™์€ ์นผ๋Ÿผ์„ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด๋†“๋Š”๋‹ค.
=> ์ด๋ฅผ ์†Œํ”„ํŒ… ๋”œ๋ฆฌํŠธ ํ˜•ํƒœ๋ผ๊ณ ํ•˜๋ฉฐ ์ง€์šฐ๊ธดํ–ˆ์ง€๋งŒ ์ง€์šด๊ฒŒ ์•„๋‹Œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

- Prisma Client

  • ํ”„๋ฆฌ์ฆˆ๋งˆ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผ ํ•˜๊ธฐ ์œ„ํ•ด Prisma Client๋ฅผ ์„ค์น˜ํ•œ๋‹ค. ํ”„๋ฆฌ์ฆˆ๋งˆ ํด๋ผ์ด์–ธํŠธ๋Š”
  • Prisma Client๋Š” Prisma๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๋“ค์„ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Client ์—ญํ• ์„ ํ•œ๋‹ค
  • Prisma Client๋Š” ๋งˆ์น˜ ๊ณ ๊ฐ์ด ์ œ๊ณต๋ฐ›๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์œผ๋กœ Prisma๋Š” ์ด๋ฏธ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Prisma Client ์„ค์น˜๊ณผ์ •

1> Prisma Client ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

npm install @prisma/client --save

2> Prisma Client๋ฅผ import ํ•ด์ค€๋‹ค.

import {Prisma Client} from "@prisma/client"

3> ํด๋ž˜์Šค ์ƒ์„ฑ๋œ Prisma Client๋ฅผ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

const prisma = new Prisma Client()

  • prisma client๋ฅผ ์„ค์น˜ํ•˜๋ฉด prisma generate ๋ผ๋Š” ๋ช…๋ น์–ด๋„ ํ•จ๊ป˜ ์‹คํ–‰๋œ๋‹ค.
  • prisma generate๋Š” prisma.schema ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ด ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจ๋ธ ํ˜•ํƒœ์— ๋งž๋Š” client๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • prisma generate์˜ ์—ญํ• ์€ schema ํŒŒ์ผ์„ ์ฝ์–ด์„œ ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจ๋ธ ํ˜•ํƒœ์— ๋งž๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑํ•ด์คŒ์œผ๋กœ์„œ schema ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์œ„ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์–ด ํด๋ผ์ด์–ธ์— ๋ฐ˜์˜๋˜์–ด ์ž๋™์™„์„ฑ๋˜์–ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Prisma์—์„œ C.R. ๊ตฌํ˜„

app.post('/categories', async (req, res) => {
  await prisma.$queryRaw`
    INSERT INTO categories (name)
    VALUES ('์ฝœ๋“œ ๋ธŒ๋ฃจ');
  `;
  const [category] = await prisma.$queryRaw`
    SELECT *
    FROM categories
    ORDER BY id DESC
    LIMIT 1
  `;
  res.json(category);
});
  • ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ๊ฐ’์ด ์นดํ…Œ๊ณ ๋ฆฌ์— ๋‹ด๊ธฐ๋ฉด ๋ฆฌํ„ด ๊ฐ’์„ res.json์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋งŒ๋“  ๋ฐ์ดํ„ท๋“ค์„ ๊ทธ๋Œ€๋กœ ๋Œ๋ ค์ค€๋‹ค.
  • get์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋งŒ ์˜ค๋Š” ๊ฒƒ์ด๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์„ฑ ์ž์ฒด๋Š” post์ด๋‹ค.
  • prisma์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์ด ์žˆ๋Š”๋ฐ EX> find many, uniquie๋“ฑ์ด ์กด์žฌํ•˜์ง€๋งŒ sql๋ฌธ๋„ prisma์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

  • async ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€? ์ฒ˜๋ฆฌ๊ฐ€ ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋นผ๋‘๊ณ  ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋“ค ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ๋นผ๋†“์•˜๋˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ
  • ์ฆ‰, ๋น„๋™๊ธฐ๋ž€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๋กœ์ง ์ค‘ ํ•˜๋‚˜๊ฐ€ DB๋ž‘ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„œ๋ฒ„๊ฐ„์— ์—ฐ๋™์„ ํ•  ๋•Œ ํ†ต์‹ ์ด ์ด๋ค„์ง€๊ณ  ๋Œ€๋ถ€๋ถ„ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
    => ํ†ต์‹  = ๋น„๋™๊ธฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ = ํ†ต์‹ 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‚ฌ์šฉ๋ฒ•

์ธ์ž ์•ž์— async๋ฅผ ๋ถ™์ž„์œผ๋กœ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋น„๋™๊ธฐ๋กœ ๋งŒ๋“ค๋ฉด
์ด ํ•จ์ˆ˜์˜ ์—ญํ• ์€ DB์— ์ ‘๊ทผํ•˜์—ฌ
1> ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ
2>๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์œผ๋กœ ์ง„ํ–‰๋˜๋Š”๋ฐ
์ด๋–„ 1> ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ๋ณด๋‹ค 2> ๋ฐ˜ํ™˜์ด ๋จผ์ € ์ด๋ฃจ์–ด์ง€๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด 1> ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ๋๋‚œ ๋’ค 2> ๋ฐ˜ํ™˜์„ ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๋ณด์žฅ๋ฐ›๋Š”๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹ 2๊ฐ€์ง€

1> select * ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๋Š” ๊ฒƒ
2> select table.column ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜๋Š” ๊ฒƒ

app.post('/categories', async (req, res) => {
  await prisma.$queryRaw`
    INSERT INTO categories (name)
    VALUES ('์ฝœ๋“œ ๋ธŒ๋ฃจ');
  `;
  const [category] = await prisma.$queryRaw`
    SELECT *
    FROM categories
    ORDER BY id DESC
    LIMIT 1
  `;
  res.json(category);
});
  • ORM์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์ฒ˜๋Ÿผ ์ตœ๊ทผ ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ SQL๋ฌธ์„ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
  • queryRaw ๋ฉ”์„œ๋“œ์˜ ํŠน์ง•์€ ๋ฐ˜ํ™˜ ํƒ€์ž…์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๋ฐฐ์—ด์ด๊ธฐ์— ํ•˜๋‚˜๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์—ด ๋น„๊ตฌ์กฐํ™”๋ฅผ ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  • *๋Š” ๋ณดํ†ต ์•ˆ์“ฐ๋ฉฐ c.id , c.name ๊ฐ™์ด from categories c์ฒ˜๋Ÿผ ์ค„์—ฌ์„œ ์ ์–ด์ค€๋‹ค

*๐Ÿ’กconclusion

  1. CRUD๊ฐ€ ๋ญ”์ง€์— ๋Œ€ํ•ด์„œ CREATE, READ ํ•˜๋Š” ๋ฒ•
  2. ์ฝ”๋“œ ๋‹จ์—์„  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ ์กฐ์ฐจ๋„ ํ†ต์‹ (8000 - 3036 ํฌํŠธ์—์„œ ๊ณผ์ •์€ ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ)
  3. ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ASYNC/AWAIT, AWAIT๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์•ˆ์ง€๋‚˜๊ฐ€๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑธ ๋ฐ›์•„์™€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋‹ค๋ ค์ค˜์•ผํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ์„œ ์‚ฌ์šฉ๋œ๋‹ค.
  4. creat.findMany ๊ฐ™์€ ํ”„๋ฆฌ์ฆˆ๋งˆ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ •๋„๋งŒ ์•Œ๊ณ  rawQuery์„ ๋” ์ž˜ ์“ฐ๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค.
    +) ๋งŒ์•ฝ ๋ฐฉ๊ธˆ ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ญ”์ง€ ์•Œ์•„์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€ํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด์˜ค๋Š” ๊ฒƒ๊นŒ์ง€ ํ•ด์ฃผ๋ฉด ์นœ์ ˆํ•œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ๊ฑฐ๋“ญ๋‚  ๊ฒƒ์ด๋‹ค.

#๐Ÿ“‘Study Source

  • ์œ„์ฝ”๋“œ ๊ฐ•์˜ ์ค‘ ๋ฒก์—”๋“œ ํŒŒ์šด๋ฐ์ด์…˜์— ๋Œ์•„์˜จ ๊ด€ํฌ๋‹˜์˜ ๊ฐ•์˜ ์ค‘:>
profile
์ž๊ธฐ ์‹ ๋ขฐ์˜ ํž˜์„ ๋ฏฟ๊ณ  ์‹ค์ฒœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

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