DBMS

MySQL (0) Upsert

오리888 2023. 3. 17. 21:25

Upsert를 사용하면 간결하게  database 안에 있는 data들을 간단하게 찾거나 만들거나 업데이트할 수 있다

그럼 바로 예를 봐보자

 

예)

 

async function handler(req: NextApiRequest, res: NextApiResponse) {
const { email, phone } = req.body; // POST request로 받는 정보 (이메일 또는 핸드폰 번호)

let user; //유저 
if (email) {
user = await client.user.findUnique({
where: {
email,
},
});
if (user) console.log(user, "user with email");
if (!user) {
console.log("did not find, will create with email");
user = await client.user.create({
data: {
name: "Anonymous", //기본 이름값
email,
},
});
console.log(user, "created user with email");
}
}

if (phone) {
user = await client.user.findUnique({
where: {
phone: +phone,
},
});
if (user) console.log(user, "user with phone");
if (!user) {
console.log("will create with phone");
user = await client.user.create({
data: {
name: "Anonymous", //기본 이름값
phone: +phone,
},
});
console.log(user, "created user with phone");
}
}

return res.status(200).end();
}

 

예시에서 유저가 이메일 또는 핸드폰 번호를 입력하여 로그인을 시도하였을 때 

database에서

이 유저의 정보가 이미 있는지 (이미 있다면 업데이트는 하지 말고 그냥 로그인시켜주기) 

유저의 정보가 없으면 이 정보를 통해 기본 이름값을 넣어준 뒤 새로운 유저를 만들어준다

 

하지만 예시 코드는 복잡하진 않지만 긴 걸 볼 수 있다

여기서 upsert를 사용하면 코드 길이를 훨씬 줄일 수 있는데 바로 사용해 보자

 
const user = await client.user.upsert({
where: {
...(phone && { phone: +phone }), // es6 문법이다. object 안에 if else를 사용하는 문법이다
...(email && { email }),
},
create: {
name: "Anonymous", //기본 이름값
...(phone && { phone: +phone }),
...(email && { email }),
},
update: {},
});
console.log(user);

이렇게 upsert를 사용하면 

where은 이메일 또는 폰으로 database에 같은 정보가 등록된 유저가 있는지 확인한다 (find)

create는 where로 이메일 또는 폰 정보가 database안에 없을 경우 새로운 유저를 만들어준다 

update는 where로 찾은 유저의 정보를 바꿀 수 있는데 로그인만 시켜주면 되기 때문에 따로 update 설정은 안 해주려고 empty object를 넣었다

 

 

참고로 정보를 확인할 때 es6 문법을 활용하였다

이렇게 upsert를 사용하면 코드 길이가 엄청 줄어들어 좋다