Firestore 의 일괄 쓰기

후후니·2022년 9월 4일
0

firestore를 통해 유저의 정보를 업데이트 및 생성 하는 경우,
기존에는 setDoc을 사용하였다.

예시

      유저데이터.map(async function (obj, idx) {
        await setDoc(doc(dbService, `컬렉션`, `${obj.phone}`), {
          name: obj.name,
          phone: obj.phone,
          createdAt: date,
          updatedAt: date,
        }).then(console.log("저장 완료"));
      });

유저의 데이터를 '컬렉션'에 유저의 'phone'이라는 도큐먼트를 생성해주는 코드이다.

하지만 이 코드를 실행하면 유저 한명당 setDoc 요청을 계속해서 보내게되고, 유저의 수가 늘어나면 날수록 처리 시간은 길어지는 문제가 있다.

이를 해결하기 위해, 파이어베이스의 '일괄 쓰기'라는 기능을 사용하기로 하였다.

쉽게 이해하자면, 일괄 쓰기 'batch'라는 기능은 데이터를 한 곳에 모아뒀다가 일괄 쓰기 요청을 보내는 것이라고 생각하면 쉽다.

batch를 사용할때 주의해야 할 점은, 일괄 쓰기는 하나의 batch에 500개 쓰기 요청만을 할 수 있다는 것이다.

내가 요청해야 하는 유저 데이터의 수는 1000개가 넘어가는 경우가 많으므로, 이를 해결하기 위해 아래 코드의 해결방안으로 해결하였다.

		   const batchArray = [];
           batchArray.push(writeBatch(dbService));
            let operationCounter = 0;
            for (let i = 0; i < newArr.length; i++) {
              const sfRef = await doc(
                dbService,
                `${typeOption}_newUser`,
                `${newArr[i].id}`
              );
              batchArray[batchArray.length - 1].update(sfRef, {
                workState: "1",
              });
              operationCounter++;
              if (operationCounter === 499) {
                batchArray.push(writeBatch(dbService));
                operationCounter = 0;
              }
            }
            batchArray.forEach(async (batch) => await batch.commit());

batchArray라는 빈 배열을 만들어 주고, 요청 횟수가 499가 되었을 때, 해당 요청의 묶음을 배열에 push 해준다. 모든 batch 작업이 끝나면, 모아진 batchArray를 커밋한다.

이렇게 한다면, 일괄 쓰기 500개 제한을 해결함과 동시에, 한 번에 모든 쓰기 요청을 보낼 수 있기 때문에, 클라이언트 입장에서도 데이터 처리 요청을 기다리지 않을 수 있어, ux를 향상 시킬 수 있다.

profile
주니어 프론트엔드

0개의 댓글