Java(AWS SDK v2)에서의 DynamoDB Query

Query는 하나의 파티션 키를 공유하는 모든 항목을 읽으며, 선택적으로 정렬 키로 범위를 좁힙니다. AWS SDK for Java 2.x에서는 keyConditionExpression을 가진 QueryRequest를 빌드하며, 내장 **queryPaginator**가 모든 결과 페이지에 걸쳐 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.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;

public class QueryExample {
    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("#hashKey", "Artist");
            names.put("#rangeKey", "SongTitle");

            Map<String, AttributeValue> values = new HashMap<>();
            values.put(":hashKeyValue", AttributeValue.builder().s("Arturo Sandoval").build());
            values.put(":rangeKeyValue", AttributeValue.builder().s("C").build());

            QueryRequest request = QueryRequest.builder()
                    .tableName("Music")
                    .keyConditionExpression(
                            "#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)")
                    .expressionAttributeNames(names)
                    .expressionAttributeValues(values)
                    .build();

            List<Map<String, AttributeValue>> items = new ArrayList<>();
            for (QueryResponse page : ddb.queryPaginator(request)) {
                items.addAll(page.items());
            }
            System.out.println("Found " + items.size() + " items");
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

Explanation

  • keyConditionExpression — 파티션 키에 대한 등가 조건(#hashKey = :hashKeyValue)과, 최대 하나의 정렬 키 조건(=, <, <=, >, >=, BETWEEN 또는 begins_with)을 포함해야 합니다. #hashKey/#rangeKey 별칭은 expressionAttributeNames를 통해 Artist/SongTitle로 해석됩니다(예약어 안전).
  • expressionAttributeValues:placeholder → 타입 지정 AttributeValue 맵입니다.
  • 페이지네이션 — 하나의 Query는 최대 1 MB를 반환합니다. ddb.queryPaginator(request)는 페이지를 순회하는 동안 후속 요청을 지연 발행하는 QueryIterable을 반환하며, 각 QueryResponse 페이지는 items() 리스트를 담습니다. (직접 처리하시나요? 비어 있을 때까지 lastEvaluatedKey().exclusiveStartKey(...)로 다시 전달하세요.)
  • 정렬 키 순서를 반대로 하려면 **.scanIndexForward(false)**를 추가하세요(기본값은 오름차순).
  • 보조 인덱스를 쿼리하려면 .indexName("...")을 추가하세요.
  • 평범한 Java 객체를 선호하시나요? DynamoDB Enhanced Client(software.amazon.awssdk.enhanced.dynamodb)는 어노테이션이 붙은 빈 클래스로 동일한 쿼리를 노출합니다.

Do it visually

DynamoDB Expression Builder는 키 조건을 조립하고 실행 가능한 코드를 복사해 주므로, 자리 표시자와 값 맵을 손으로 작성할 필요가 없습니다.

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