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 — 필터링되는 속성은 별칭 처리(#filter0Year)되어 Year 같은 예약어를 안전하게 유지합니다.
  • 페이지네이션 — 각 Scan 페이지는 필터링 전에 최대 1 MB를 읽으므로, 테이블에 일치 항목이 아직 있어도 필터링된 페이지가 비어서 돌아올 수 있습니다. ddb.scanPaginator(request)LastEvaluatedKey가 소진될 때까지 페이지를 계속 요청하는 ScanIterable을 반환합니다 — 첫 페이지에서 멈추지 마세요.
  • 페이지당 스캔되는 항목 수(필터 이전)를 제한하려면 **.limit(...)**을 추가하세요 — 반환되는 항목 수는 제한하지 않습니다.
  • 대규모 전체 테이블 스캔은 .segment(...) / .totalSegments(...)로 작업을 여러 워커에 분할하세요(병렬 스캔).
  • Query를 선호하세요. Scan은 테이블 전체를 읽습니다. 아주 작은 테이블이 아닌 한 느리고 비쌉니다.

Do it visually

필터를 손으로 조립하고 계신가요? DynamoDB Expression BuilderFilterExpression + 이름/값 맵을 만들고 실행 가능한 코드를 복사해 줍니다.

스크립트에서 무작정 스캔하는 대신 GUI에서 테이블을 탐색하려면 — 필터링되고 페이지네이션된 결과 그리드와 코드로 복사 — DynoTable을 다운로드하세요.

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 스타일 쿼리를 실행하고, 항목을 로컬에서 편집하세요.