피드로 돌아가기
Reading a Paginated API Without Holding the Whole Thing in Memory
Dev.toDev.to
Backend

Async Generator 도입으로 50만 건 처리 시 메모리 사용량 90% 절감

Reading a Paginated API Without Holding the Whole Thing in Memory

Parthipan Natkunam2026년 6월 13일9intermediate

Context

Paginated API의 모든 데이터를 수집하기 위해 전체 데이터를 메모리에 적재한 후 처리하는 Eager Loading 방식 채택. 데이터셋 규모 증가에 따른 Memory Heap 급증과 네트워크 요청 완료 전까지 처리가 불가능한 블로킹 구조의 한계 발생.

Technical Solution

  • Async Generator를 활용한 Pull-based Lazy Loading 구조 설계
  • async function*yield 키워드를 통해 네트워크 요청과 레코드 반환의 제어권을 소비자로 이전
  • for await...of 루프를 통한 스트리밍 처리로 데이터 수신과 동시에 즉시 프로세싱 수행
  • 커서 기반의 페이지 요청 로직을 Generator 내부로 캡슐화하여 클라이언트 코드의 복잡도 제거
  • 조건 충족 시 break를 통한 조기 종료로 불필요한 API 호출을 차단하는 최적화 구현

- 대량 데이터 API 호출 시 `all.push(...records)` 패턴의 메모리 점유율 검토 - 데이터 처리 중 조기 종료(Early Exit) 가능성이 있는 경우 Lazy Loading 적용 고려 - 높은 Throughput이 최우선인 경우 Async Generator의 순차적 처리 한계를 인지하고 `Promise.all` 기반의 병렬 처리와 비교 분석

원문 읽기