실무에서 다음과 같은 경우가 발생한다.
이때 특정 시점에서 DB table의 존재 유무를 확인하는 작업은 프론트엔드에서 useQuery를 활용하여 이루어지고, DB CRUD에 관한 작업은 백엔드에서 이루어질 수 있다.
그러나 기본적으로 이러한 DB에 접근하고 확인, 수정 등 모든 일괄적인 작업들은 백엔드에서 이루어져야 이상한 동작을 방지하고 오류발생을 막을 수 있다.
const { data } = useQuery(my_query)
useQuery를 활용하여 해당 data가 DB에 생성되었는지 확인하는 작업을 하고, 없다면 새로운 table을 생성한다고 가정해본다.
이때 useQuery를 이용해서 확인 → useMutation을 이용해서 Update 순으로 이루어질텐데, 만약 useEffect 및 다른 함수 등으로 인해 useQuery를 통해 얻어야 하는 table이 null이 될 수 있다.
즉 비동기처리로 인해 useQuery에 data가 확보된 상태가 아닐 경우, useMutation에서 예상하지 못한 결과를 초래할 수 있다.
다만 확인 자체만 하는 경우라면 useQuery를 사용해도 무방한데, 최대한 정적인 상황에서 사용해야 오류를 방지할 수 있다.
try{
const currentTable = await db.Table.findOne({
where: {
value: value
}
})
if (currentPost){
currentPost.value = currentPost.value + 1;
await currentPost.save();
} else {
await db.PostView.create({
value: post_type
})
}
}catch (err) {
console.error('Query caused error! : ', err);
};
위와 같이 아예 DB 확인/Update이 같이 이루어진다면 하나의 백엔드 logic에서 처리해야 한다.
이때 try , await 등 비동기 처리를 확실하게 해주는 것에 유의하고 table 확인 > 생성 > Update 순으로 작업을 진행한다면 확실하고 안전하게 DB작업을 할 수 있다.
이처럼 DB작업은 웬만하면 백엔드에서 처리한다는 생각으로 임하면 좋을 것 같다.