안녕하세요 !!
이번에는 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를 사용해봅시다 ^^
'IT관련 > DB(데이터베이스) 관련' 카테고리의 다른 글
PrismaClient에 대해서 알아봅시다 ! ( feat. next js로 api만들기 ) (0) | 2022.05.22 |
---|---|
Prisma와 PlanetScale 사용법 정리 및 복습편 ! (feat. 명령어 모음 및 한눈에 적용하는것을 위주로 ) (0) | 2022.03.30 |
Prisma를 이용하여 mysql기능을 이용해보자 ! (Foreign Key Constraints - 외래키제약) (0) | 2022.03.28 |
Prisma와 planetscale을 연동 및 간단하게 DB를 만들어보자 ! (0) | 2022.03.28 |
planetscale에 대해서 ! (feat. serverless, 설치법) (0) | 2022.03.27 |