Prisma - User & Token connection

2025. 6. 2. 12:15ยท๐Ÿ’Ž Prisma

Prisma

 

โœ… Prisma ์„ค์ •


generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["referentialIntegrity"]
}

datasource db {
  provider             = "mysql"
  url                  = env("DATABASE_URL")
  referentialIntegrity = "prisma"
}

 

โœ… User model


model User {
  id        Int      @id @default(autoincrement())
  phone     Int?     @unique
  email     String?  @unique
  name      String
  avatar    String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  tokens    Token[]
}

 

โœ… Token model


model Token {
  id        Int      @id @default(autoincrement())
  payload   String   @unique
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  userId    Int
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@index([userId])
}

 

โœ… Foreign Key ๋ฒ„์ „ ์ฐจ์ด


์˜ˆ์ „ prisma์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์—์„œ๋Š”
previewFeatures = ["referentialIntegrity"]์™€ referentialIntegrity = "prisma"์„ ์‚ฌ์šฉํ•˜๋ฉด DB์— foreign key(FK)๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ Prisma ๋‚ด๋ถ€์—์„œ ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๊ฐ•์˜ ์˜์ƒ์ฒ˜๋Ÿผ npx prisma db push๋ฅผ ํ•˜์˜€์„ ๋•Œ ์—๋Ÿฌ๊ฐ€ ์—†์ด ์ž‘๋™์ด ๋˜์—ˆ์ง€๋งŒ,

์ตœ์‹  ๋ฐฉ์‹์ธ relationMode = "prisma"์„ ์‚ฌ์šฉํ•ด์„œ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ˜„์žฌ prisma์˜ ๋‚ด๋ถ€๊ตฌ์กฐ์—์„œ๋Š” foreign key๋ฅผ DB์— ์ƒ์„ฑํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์„ PlanetScale์˜ ๊ธฐ๋ฐ˜์ธ vitess๊ฐ€ foreign key๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„, npx prisma db push๋ฅผ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๋‹ค.

1. deprecated ๋˜์—ˆ์ง€๋งŒ previewFeatures = ["referentialIntegrity"]์™€ referentialIntegrity = "prisma"์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋Œ€๋กœ ์ง„ํ–‰


2. relationMode = "prisma"์„ ์‚ฌ์šฉํ•˜๊ณ 
user User @relation(fields: [userId], references: [id]) ์ด field๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ relation์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ
const token = await prisma.token.findUnique({ where: { id: 1 } });
const user = await prisma.user.findUnique({ where: { id: token.userId } });

์ด๋Ÿฐ ์‹์œผ๋กœ ์ˆ˜๋™์œผ๋กœ ๊ด€๊ณ„ํ˜• join์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

โœ… Token ์ƒ์„ฑ


const { phone, email } = req.body;
const user = phone ? { phone: +phone } : email ? { email } : null;
if (!user) return res.status(400).json({ ok: false });
const payload = Math.floor(100000 + Math.random() * 900000) + "";
const token = await client.token.create({
    data: {
      payload,
      user: {
        connectOrCreate: {
          where: {
            ...user,
          },
          create: {
            name: "Anonymous",
            ...user,
          },
        },
      },
    },
  });

 

connect

์ƒˆ๋กœ์šด ํ† ํฐ์„ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์œ ์ €์™€ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

 

create

์ƒˆ๋กœ์šด ํ† ํฐ์„ ๋งŒ๋“ค๋ฉด์„œ ์ƒˆ๋กœ์šด ์œ ์ €๋„ ๋งŒ๋“ ๋‹ค.

 

connectOrCreate

์œ ์ €๋ฅผ ์ฐพ์œผ๋ฉด ํ† ํฐ๊ณผ connect, ๋ชป ์ฐพ์œผ๋ฉด create ํ•ด์ค€๋‹ค.

whrere์™€ create์ด ํ•„์š”ํ•˜๋‹ค.

user๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์—†์–ด์ง„๋‹ค.

 

โœ… _count


model User {
  id         Int         @id @default(autoincrement())
  phone      String?     @unique
  email      String?     @unique
  name       String
  avatar     String?
  createdAt  DateTime    @default(now())
  updatedAt  DateTime    @updatedAt
  tokens     Token[]
  products   Product[]
  favs       Fav[]
  posts      Post[]
  answers    Answer[]
  wonderings Wondering[]
}

 

ํ•ด๋‹น model์—์„œ tokens, products, favs, posts, answers, wonderings๋Š” _count๋กœ ํ•ด๋‹น ๋ชจ๋ธ์˜ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

'๐Ÿ’Ž Prisma' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Prisma - Prisma v7 ์‚ฌ์šฉ๋ฒ•  (0) 2026.01.16
Prisma - schema.prisma์—์„œ model ๊น”๋”ํ•˜๊ฒŒ ์ž๋™ ์ •๋ ฌํ•˜๊ธฐ  (0) 2025.09.24
Prisma - findUnique, create, upsert  (0) 2025.06.02
Prisma - ์‹œ์ž‘ํ•˜๊ธฐ  (0) 2025.05.26
'๐Ÿ’Ž Prisma' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Prisma - Prisma v7 ์‚ฌ์šฉ๋ฒ•
  • Prisma - schema.prisma์—์„œ model ๊น”๋”ํ•˜๊ฒŒ ์ž๋™ ์ •๋ ฌํ•˜๊ธฐ
  • Prisma - findUnique, create, upsert
  • Prisma - ์‹œ์ž‘ํ•˜๊ธฐ
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    dev setup
    Python
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    next.js 12
    MySQL
    Prisma
    next.js 14
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    ๋ชจ๋”ฅ๋‹ค
    mongoDB
    tailwindcss
    PostgreSQL
    React Native
    Firebase
    react router
    Next.js
    SQL
    0๋ ˆ๋ฒจ
    API
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
Prisma - User & Token connection
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”