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을 다운로드하세요.
Related examples
- DynamoDB Query in Go — AWS SDK for Go v2를 사용한 동일한 쿼리.
- DynamoDB Scan in Java — 파티션으로 키 접근할 수 없을 때.
- Query vs. Scan —
Query가 올바른 기본값인 이유. - Key condition expressions — 모든 유효한 파티션/정렬 키 연산자.
- "Query condition missed key schema element" — 키 조건이 잘못된 속성을 지정하거나 파티션 키를 건너뛴 경우.
- "Query key condition not supported" — contains나 두 번째 정렬 키 조건처럼 키 조건에서 사용할 수 없는 연산자.
References
- Query — Amazon DynamoDB API Reference
- Use Query with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- QueryRequest — AWS SDK for Java 2.x API Reference
- Querying tables — Amazon DynamoDB Developer Guide
Last verified 2026-07-13 against the official AWS documentation linked above.