Java(AWS SDK v2)에서의 DynamoDB Scan
Scan은 테이블이나 인덱스의 모든 항목을 페이지 단위로 읽은 다음, 선택적으로 FilterExpression으로 행을 걸러냅니다. AWS SDK for Java 2.x에서는 ScanRequest를 빌드하고 내장 **scanPaginator**가 테이블 전체를 읽을 때까지 LastEvaluatedKey를 따라가게 합니다.
Code
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
import software.amazon.awssdk.services.dynamodb.model.ScanResponse;
public class ScanExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, String> names = new HashMap<>();
names.put("#filter0", "Year");
Map<String, AttributeValue> values = new HashMap<>();
values.put(":filterValue0", AttributeValue.builder().n("2010").build());
ScanRequest request = ScanRequest.builder()
.tableName("Music")
.filterExpression("#filter0 >= :filterValue0")
.expressionAttributeNames(names)
.expressionAttributeValues(values)
.build();
List<Map<String, AttributeValue>> items = new ArrayList<>();
for (ScanResponse page : ddb.scanPaginator(request)) {
items.addAll(page.items());
}
System.out.println("Matched " + items.size() + " items");
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}Explanation
filterExpression— 읽기 이후에 서버에서 적용됩니다. 응답은 줄이지만 비용은 줄이지 않습니다. 필터링 여부와 무관하게 스캔된 모든 항목을 읽는 비용을 지불합니다.expressionAttributeNames— 필터링되는 속성은 별칭 처리(#filter0→Year)되어Year같은 예약어를 안전하게 유지합니다.- 페이지네이션 — 각
Scan페이지는 필터링 전에 최대 1 MB를 읽으므로, 테이블에 일치 항목이 아직 있어도 필터링된 페이지가 비어서 돌아올 수 있습니다.ddb.scanPaginator(request)는LastEvaluatedKey가 소진될 때까지 페이지를 계속 요청하는ScanIterable을 반환합니다 — 첫 페이지에서 멈추지 마세요. - 페이지당 스캔되는 항목 수(필터 이전)를 제한하려면 **
.limit(...)**을 추가하세요 — 반환되는 항목 수는 제한하지 않습니다. - 대규모 전체 테이블 스캔은
.segment(...)/.totalSegments(...)로 작업을 여러 워커에 분할하세요(병렬 스캔). Query를 선호하세요.Scan은 테이블 전체를 읽습니다. 아주 작은 테이블이 아닌 한 느리고 비쌉니다.
Do it visually
필터를 손으로 조립하고 계신가요? DynamoDB Expression Builder는 FilterExpression + 이름/값 맵을 만들고 실행 가능한 코드를 복사해 줍니다.
스크립트에서 무작정 스캔하는 대신 GUI에서 테이블을 탐색하려면 — 필터링되고 페이지네이션된 결과 그리드와 코드로 복사 — DynoTable을 다운로드하세요.
Related examples
- DynamoDB Scan in Go — AWS SDK for Go v2를 사용한 동일한 스캔.
- DynamoDB Query in Java — 보통 먼저 손이 가야 할 더 저렴한 읽기.
- Query vs. Scan — (드물게)
Scan이 정당화되는 경우. - Why is my DynamoDB Scan slow and expensive? — 비용 모델과 이를 피하는 방법.
- DynamoDB ProvisionedThroughputExceededException — 전체 테이블 스캔이 프로비저닝된 테이블의 용량에 미치는 영향.
- DynamoDB ThrottlingException — 또 다른 스로틀, 그리고 지수 백오프가 이를 처리하는 방법.
References
- Scan — Amazon DynamoDB API Reference
- Use Scan with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- ScanRequest — AWS SDK for Java 2.x API Reference
- Scanning tables — Amazon DynamoDB Developer Guide
Last verified 2026-07-13 against the official AWS documentation linked above.