firebase의 쓰기 메서드 set(), update(), delete() / batch를 통한 일괄 쓰기

김민재·2025년 5월 19일

지금까지 배운 내용 중 firestore DB에서 문서를 수정하는 방법은 크게 세 가지가 존재한다. set()update(), batch()에 대해 알아보자.


1. set

set()문서가 기존에 존재했다면 전체를 덮어쓰기 하고, 존재하지 않았다면 문서를 새로 생성한다.

예시)

await db.collection("users").doc("alice").set({
  name: "Alice",
  age: 30
});

-> id='alice'인 문서가 없으면 새로 생성하여 데이터를 초기화하고,
이미 존재하면 set 메서드의 인수 데이터로 덮어쓴다.


2. update

update()은 문서가 기존에 존재하는 경우에만 사용이 가능하다.

await db.collection("users").doc("alice").update({
  age: 31
});

-> 필드 age의 값을 31로 변경한다. 만약 age라는 이름의 필드가 없다면, 추가 후 값을 초기화한다.


3. delete

📌 문서를 삭제하는 경우

await db.collection('users').doc('userId123').delete();

📌 컬렉션을 삭제하는 경우

  • firestore는 대규모 데이터 손실을 방지하기 위해, 명령어 한 줄로 컬렉션을 삭제하는 방법은 제공하고 있지 않다.

  • 따라서 컬렉션을 삭제하려면 그 컬렉션에 있는 모든 문서를 하나씩 삭제해야 한다.


3. batch

batch는 문서를 읽을 필요가 없는 경우, 일괄 쓰기를 할 때 사용한다.
set(), update() 또는 delete()를 포함하며, batch.commit()을 통해 일괄 처리한다. 다음 코드를 보자.

const items = rankingData.boxofs.boxof;
const concertsCollectionRef = docRef.collection("concerts");

const batch = db.batch();

// 랭킹 데이터 추가
items.forEach((concert) => {
  const concertDocRef = concertsCollectionRef.doc();
  batch.set(concertDocRef, concert);
});

await batch.commit();

이는 id='concerts'인 컬렉션에 items 배열 안의 데이터들을 각각 하나의 문서로 추가하는 코드이다.

db.batch()로 쓰기 작업 묶음을 새로 만든 뒤, batch.set()을 통해 set작업을 batch에 추가한다. 이 때 batch.set()의 첫 번째 인자로는 문서id가, 두 번째 인자로는 쓸 데이터가 들어간다. 마지막에 batch.commit()을 통해 batch 안에 추가된 모든 set 작업을 한꺼번에 실행한다.

🔎 batch를 사용하면 좋은 점

1. 원자적(atomic) 처리

  • 여러 개의 쓰기 작업(set, update, delete)를 하나로 묶어 모두 성공하거나 모두 실패하는 원자적 작업으로 보장한다.
  • 중간에 일부만 적용되는 상황을 방지할 수 있다.

2. 성능 향상

  • 여러 작업을 한 번에 서버로 보내기 때문에 네트워크 요청 횟수가 줄어들고 처리 속도가 빨라진다.

3. 오프라인 지원

  • 클라이언트가 오프라인 상태여도 작업을 로컬에 임시 저장했다가, 네트워크가 다시 연결되면 서버로 전송하여 실행한다.

⚠️ batch 사용 시 유의점

한 번 batch.commit()을 호출하면, 해당 batch는 종료되고 더 이상 사용이 불가능해진다.

따라서 새로운 일괄 쓰기 작업이 있을 때마다 batch를 생성해주어야 한다.

profile
넓이보다 깊이있게

0개의 댓글