Node.js(AWS SDK v3)에서 DynamoDB의 모든 항목 가져오기

DynamoDB에는 "전체 선택"이 없습니다 — 테이블 전체를 읽는다는 것은 **끝까지 페이지네이션하는 Scan**을 의미합니다. 각 응답은 최대 1 MB를 담습니다. 키가 더 이상 반환되지 않을 때까지 LastEvaluatedKeyExclusiveStartKey로 다시 전달하며 반복합니다.

Code

import {DynamoDBClient, ScanCommand} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({region: 'us-east-1'});

const items = [];
let lastEvaluatedKey;

do {
  const response = await client.send(
    new ScanCommand({
      TableName: 'Music',
      ExclusiveStartKey: lastEvaluatedKey
    })
  );

  items.push(...(response.Items ?? []));
  lastEvaluatedKey = response.LastEvaluatedKey;
} while (lastEvaluatedKey);

console.log(`Table holds ${items.length} items`);

Explanation

  • 루프가 핵심 — 단일 Scan 호출은 테이블을 반환하지 않습니다. 최대 1 MB를 반환할 뿐입니다. 첫 응답 후 멈추는 것이 전형적인 "내 스캔에 항목이 누락됨" 버그입니다. LastEvaluatedKey가 없어야만 모든 것을 다 읽은 것입니다.
  • 메모리items는 테이블 전체를 담습니다. 큰 테이블의 경우 누적하지 말고 루프 안에서 각 페이지를 처리하세요(파일에 쓰기, 스트리밍, 집계).
  • 큰 테이블에서 더 빠르게: 병렬 스캔Segment / TotalSegments로 작업을 분할하세요: N개의 워커를 실행하며 각 워커가 자신만의 페이지네이션 루프로 자신의 세그먼트를 스캔합니다. 총비용은 동일하지만 실제 소요 시간은 훨씬 낮습니다.
  • 비용 — 전체 스캔은 실행할 때마다 모든 항목의 모든 바이트를 읽고(청구합니다). ProjectionExpression으로 응답을 줄이고(반환되는 속성이 줄어들 뿐 읽기 비용은 동일), 핫 경로에 스캔을 두지 마세요. 그것이 Query와 접근 패턴 설계가 있는 이유입니다.
  • 하는 김에 필터링도 하시나요? FilterExpression은 항목을 읽고(청구한) 이후에 걸러냅니다 — 필터를 사용한 Scan을 참고하세요.

Do it visually

테이블을 눈으로 훑어보는 데는 스크립트가 필요 없습니다: DynoTable을 다운로드해 어떤 테이블이든 페이지네이션된 그리드에서 탐색하세요 — 스캔을 대신 페이지네이션하므로 잘못 짤 루프가 없습니다. 그리고 스캔하고 비용을 치르기 전에, DynamoDB 요금 계산기가 테이블 전체 읽기의 실제 비용을 보여줍니다.

References

Last verified 2026-07-13 against the official AWS documentation linked above.

이 요청을 시각적으로 만들기

무료 DynamoDB 쿼리 빌더에서 이 작업을 구성하세요 — 키 조건, 필터, 인덱스, Limit, 정렬 순서, 페이지네이션 루프 — 그리고 실행 가능한 SDK v3, CLI, boto3 프로그램으로 다시 복사하세요.

DynamoDB 쿼리 빌더 열기

Console 없이 DynamoDB 작업하기

DynoTable은 DynamoDB를 위한 빠른 데스크톱 클라이언트입니다 — 테이블을 탐색하고, SQL 스타일 쿼리를 실행하고, 항목을 로컬에서 편집하세요.