Account Logic2

minho·2022년 7월 14일
0

upsert

Account Logic에서 만들어본 코드는 중복되는 부분이 많다 그러므로 upsert를 이용해 중복부분을 제거해 볼 것이다.

upsert란?

Update + Insert를 합친말로 데이터베이스에 해당 데이터가 존재한다면 업데이트 시키고, 없다면 새로 입력하는 것을 말한다.

upsert 적용

  • upsert에는 create와 update가 필수로 적용되어야 한다.
async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { phone, email } = req.body;
  let user;
  if (phone) {
    user = await client.user.upsert({
      where: {
        phone: +phone,
      },
      create: {
        name: "Anonymous",
        phone: +phone,
      },
      update: {},
    });
  } else if (email) {
    user = await client.user.upsert({
      where: {
        email,
      },
      create: {
        name: "Anonymous",
        email,
      },
      update: {},
    });
  }
  
  return res.status(200).end();
}

email이나 phone이 데이터베이스에 없으면 create를 실행시키고 있으면 update를 실행시킨다.

동적할당 적용

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { phone, email } = req.body;
  const user = await client.user.upsert({
    where: {   
      ...(phone && { phone: +phone }),
      ...(email && { email }),
    },
    create: {
      name: "Anonymous",
      ...(phone ? { phone: +phone } : {}),
      ...(email ? { email } : {}),
    },
    update: {},
  });
  return res.status(200).end();
}
  • ... 과 &&는 es6에서 적용되는 부분이다.
  • ...은 spread를 의미하며 &&는 then을 의미한다.
    이는 아래와 같다.
...(phone ? { phone: +phone } : {}),
...(email ? { email } : {}),

그러나 여전히 위의 부분이 중복되므로 중복을 제거해보자.

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { phone, email } = req.body;
  const payload = phone ? { phone: +phone } : { email };
  const user = await client.user.upsert({
    where: {
      ...payload,
    },
    create: {
      name: "Anonymous",
      ...payload,
    },
    update: {},
  });
  console.log(user);
  return res.status(200).end();
}
  • payload라는 변수를 만들어주어 phone인지 email인지 정해준다.
  • ...을 이용해 {}에 있는 값을 spread해준다.
profile
Live the way you think

0개의 댓글