본문 바로가기
IT관련/DB(데이터베이스) 관련

prisma의 upsert를 이용해서 데이터를 만들어보자 ! (db insert or update!)

728x90

안녕하세요 !! 

이번에는 prisma와 upsert를 이용해서 !!! 데이터를 만들어보려고 합니다 ! ( DB insert or update )

데이터를 만들면서 데이터가 있는지 판단해서 제가 넣으려는 데이터가 중복되면 안만들고 ! 중복이 안되면 만드는 그런 Logic입니다 ! 

 

* 참고로 저는 next js에서 하지만 ! react환경이라던가 javascript와 npm을 사용하고 계셔도 무방합니다 ^^ 

그럼 시작하겠습니다 ! 

먼저 이렇게 기본적인 Form을 만들어주세요 !! 

Email 로직부터 해보겠습니다 ! 

아 ! 테스트를 하시기전에는 꼭 db에 connect를 해주세요 !!! 「pscale connect DB명

email을 넣어주시고 check email를 해보겠습니다 ! 

 

로직순서는 아래와 같습니다. 

import { NextApiRequest, NextApiResponse } from "next";

async function handler(req: NextApiRequest, res: NextApiResponse) {
    const { phone, email } = req.body;
	let user;
    if (email) {
        user = await client.user.findUnique({
          where: {
            email,
          },
        });
        if (!user) {
          console.log("User Create !!");
          user = await client.user.create({
            data: {
              name: "kkana",	// 일단 name은 안받아서 임의로 넣었습니다 ! 나중에 추가할예정
              email,
            },
          });
        } else {
          console.log("user found!");
          console.log(user);
        }
    }
}

저는 「check email」을 눌렀을 때 비동기로 체크하는 로직을 만들었습니다. 

1. 먼저 email을 체크한다.

2. 이메일이 있으면 그 이메일을 가지고 유저를 조회한다. 

3. 유저가 없으면 그 때의 email을 가지고 유저를 생성하고 ! 있으면 log를 출력 ! 

 

이 순서입니다 !!! 자 여기서 생각해볼것이 ;; 저걸 phone number도 체크를 해야합니다 !!! 그럼 코드가 엄청나게 길어지겠죠??? 

코드량을 보자면 ! 

let user;

  if (email) {
    user = await client.user.findUnique({
      where: {
        email,
      },
    });
    if (!user) {
      console.log("User Create !!");
      user = await client.user.create({
        data: {
          name: "kkana",
          email,
        },
      });
    } else {
      console.log("user found!");
      console.log(user);
    }
  }

  // phone
  if (phone) {
    user = await client.user.findUnique({
      where: {
        phone: +phone,
      },
    });
    if (!user) {
      console.log("User Create !!");
      user = await client.user.create({
        data: {
          name: "Annonymous",
          phone: +phone,
        },
      });
    } else {
      console.log("user found!");
      console.log(user);
    }
  }

...... 이것도 다 안쓴거고 체크하는 로직만 쓴겁니다 !! 너무나 길죠?? 

그래도 한번 되는지 확인은 해봐야겠죠? 

이메일 입력해주시구 !! 한번 눌러보세요 !! 

그래서 vscode 에서 콘솔 보시면 ! 

성공 ! 그래도 코드가 너무길었다 ㅜㅜ


그럼 여기서 !!! prisma가 제공하는 아주 좋은기능으로 코드량을 확 줄이면서 더 한눈에 알기쉽게 코드를 짤 수 있습니다 !  

그건바로 !!  

upsert

update + insert를 합친듯한 느낌이 듭니다 ! 그래서 기능도 비슷합니다 ! 

왜냐하면 !! upsert는 기존 데이터베이스를 업데이트 하거나 새 데이터베이스 레코드를 생성합니다!! 

사용법은 밑에와 같습니다 !!! 

create : 새 레코드를 생성합니다 ! 해당 레코드를 생성 시 required값을 꼭 넣어주셔야합니다.

update : 기존 레코드를 업데이트합니다 !!! 

where : 조건을 넣어주시면 됩니다 ! 

공식사이트 : https://www.prisma.io/docs/reference/api-reference/prisma-client-reference

 

설명으로는 딱 안 와닿을수 있는데 ! 그냥 이름보시면 대충 느낌은 아실겁니다 ^^ 

밑에 코드로 한번 설명해보겠습니다 ! 

  const payload = phone ? { phone: +phone } : { email };
  const user = await client.user.upsert({
    where: {
      ...payload,
    },
    create: {
      name: "kkana",
      ...payload,
    },
    update: {},
  });

끝입니다 ! 

먼저 payload에 phone가 있는지 판단을해서 phone나 email을 payload에 넣어줍니다 ! 

그러고 나서 where에서 ...(스프레드)문법을 써서 payload를 그대로 넣어주죠 ! 

그래서?? where조건문에서 만약에 알맞은 정보가 없다 ! 라고 하면 새로운 레코드를 create해주고 ! 

있으면 기존 레코드를 update 해줍니다 ! 지금은 update를 딱히 하지 않았는데 name을 추가하거나 ! 나중에 token정보를 넣을건데 그 때 더 다뤄보도록 하겠습니다 ! 

 

한번 테스트를 해보겠습니다 ! 

이런식으로 잘 생성이 됐습니다 !!! 

 

 

결론 ! 

단순히 email, phone를 판단해서 if문으로 쓰는것도 괜찮지만 !! 

upsert를 이용해서 create와 update를 알아서 해주는것을 사용하면 훨씬 더 편리한것을 알았습니다 !! 

그러니 ! create와 upsert를 따로 써주지 말고 upsert를 사용해봅시다 ^^

 

 

 

 

 

728x90