본문 바로가기
Note/개념

BATCH

by sosomaneya 2026. 4. 6.
728x90

BATCH란?

: 여러 개의 작업을 하나의 묶음으로 모아서 일괄 처리하는 패턴이다.

 

§ Batch의 기본 전제

 · 동질적 작업 : 묶이는 작업들이 비슷한 유형이어야 한다.

  예시) 묶이는 작업들이 모두 INSERT, 모두 파일 업로드 등

 · 독립적이거나 순서가 상관 없음 : 작업 간에 의존성이 없거나 실행 순서가 결과에 영향을 주지 않아야 한다.

 · 시간적 여유 : 실시간 즉시 처리 작업이 아니여야한다. 혹은 작업들을 모으고 묶는데 드는 시간이 무시해도 될 만큼 짧아야 한다.

 

§ Batch가 필요한 이유

 · 성능 증가 : 개별로 보내서 네트워크 요청 수가 늘어나 성능이 저하되는거 보다는 작업별로 묶어서 한 번의 작업으로 네트워크에 요청하는게 성능적으로 더 낫다.

 · 안전성 - 트랜잭션 원자성 : 여러 작업들이 모두 성공하거나 혹은 모두 실패해야하는 경우에 필요하다. 따로따로 실행하는 경우 중간에 일부 작업들이 실패할 시에는 데이터 불일치 혹은 누락이 발생하기 때문이다.

 예시) 파일 업로드를 하는데 파일명 데이터는 누락되고 파일업로드 시각 데이터나 uuid값만 INSERT 됨

 · 안전성 - 자원 보호 : 요청들을 계속 개별로 보내제끼면 서버/네트워크/DB가 과부하된다. Batch를 사용하여 한 번에 처리하는 양을 제한하면 보다 자원을 보호할 수가 있다.

 


 

§ Batch의 유형

- 트랜잭션 Batch : 여러 DB 작업(INSERT/UPDATE/DELETE)을 하나의 트랜잭션으로 묶어서 실행한다. 모두 성공하면 커밋, 하나라도 실패하면 전체 롤백된다.

 · 일반적인 형태 : 

BEGIN TRANSACTION;
  INSERT INTO users (id, name) VALUES ('u1', 'Kim');
  INSERT INTO memberships (userId, orgId) VALUES ('u1', 'org1');
  INSERT INTO positions (id, name) VALUES ('p1', 'Manager');
COMMIT;

 · Cloudflare D1 에서의 형태 : 

await db.batch([
  db.prepare('INSERT INTO users ...').bind(...),
  db.prepare('INSERT INTO memberships ...').bind(...),
]);

 


 

- 대량 처리 Batch : 처리할 데이터의 양이 너무 많아서 한 번에 처리할 수 없을 때, 일정 크기로 작업을 나누어서 순차적으로 처리하는 패턴이다.

 · 일반적인 형태 :

const CHUNK_SIZE = 100;

for (let i = 0; i < items.length; i += CHUNK_SIZE) {
  const chunk = items.slice(i, i + CHUNK_SIZE);
  await processChunk(chunk);
}

 


 

- 동시성 제어 Batch : 여러 비동기 작업들을 실행할 때, 한 번의 작업 진행 시, N개씩만 병렬 실행하고 다 끝난 다음에 그 다음의 N개의 작업을 진행하는 패턴이다. 모든 작업을 한 번에 진행했을 때 생길 수 있는 여러 자원(네트워크/서버/메모리 등)들이 포화되는 것을 방지하기 위함이다.

 · 예시) 놀이기구를 4명씩 나누어서 탑승시킨다. → 한번에 20명을 탑승시키면 사고 발생

 · 일반적인 패턴 : 

const MAX_PERSON = 4;
/* tasks.length = 20 */

for (let i = 0; i <  tasks.length; i += MAX_PERSON) {
  const batch =  tasks.slice(i, i + MAX_PERSON);
  await Promise.all(batch.map(task => execute(task)));
}
반응형

'Note > 개념' 카테고리의 다른 글

변수와 함수의 동작 원리  (0) 2026.05.10
SQLite  (0) 2026.04.19
JOIN  (0) 2026.04.06
N+1  (1) 2026.04.05
TDD  (0) 2026.03.23