Go(AWS SDK v2)에서의 DynamoDB Query
Query는 하나의 파티션 키를 공유하는 모든 항목을 읽으며, 선택적으로 정렬 키로 범위를 좁힙니다. AWS SDK for Go v2에서는 dynamodb.QueryInput에 KeyConditionExpression을 작성하며, 내장 **QueryPaginator**가 모든 결과 페이지에 걸쳐 LastEvaluatedKey를 대신 따라갑니다.
Code
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
func main() {
ctx := context.TODO()
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
if err != nil {
log.Fatalf("load config: %v", err)
}
client := dynamodb.NewFromConfig(cfg)
paginator := dynamodb.NewQueryPaginator(client, &dynamodb.QueryInput{
TableName: aws.String("Music"),
KeyConditionExpression: aws.String(
"#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)"),
ExpressionAttributeNames: map[string]string{
"#hashKey": "Artist",
"#rangeKey": "SongTitle",
},
ExpressionAttributeValues: map[string]types.AttributeValue{
":hashKeyValue": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
":rangeKeyValue": &types.AttributeValueMemberS{Value: "C"},
},
})
var items []map[string]types.AttributeValue
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
log.Fatalf("query: %v", err)
}
items = append(items, page.Items...)
}
fmt.Printf("Found %d items\n", len(items))
}Explanation
KeyConditionExpression— 파티션 키에 대한 등가 조건(#hashKey = :hashKeyValue)과, 최대 하나의 정렬 키 조건(=,<,<=,>,>=,BETWEEN또는begins_with)을 포함해야 합니다.#hashKey/#rangeKey별칭은ExpressionAttributeNames를 통해Artist/SongTitle로 해석됩니다(예약어 안전).ExpressionAttributeValues—:placeholder→ 타입 지정 값 맵(&types.AttributeValueMemberS{...})입니다.- 페이지네이션 — 하나의
Query는 최대 1 MB를 반환합니다.dynamodb.NewQueryPaginator는 클라이언트를 감싸LastEvaluatedKey가 소진될 때까지 계속 호출합니다.HasMorePages()/NextPage(ctx)루프가 SDK의 표준 패턴입니다. - 정렬 키 순서를 반대로 하려면 **
ScanIndexForward: aws.Bool(false)**를 설정하세요(기본값은 오름차순). - 보조 인덱스를 쿼리하려면
IndexName: aws.String("...")을 추가하세요. - 코드로 조건을 구성하는 것을 선호하시나요?
expression패키지(github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression)는expression.Key(...).Equal(...)빌더를 조합해 이름/값 맵을 생성하며,attributevalue.UnmarshalListOfMaps는page.Items를 Go 구조체로 변환합니다.
Do it visually
DynamoDB Expression Builder는 키 조건을 조립하고 실행 가능한 코드를 복사해 주므로, 자리 표시자와 값 맵을 손으로 작성할 필요가 없습니다.
GUI에서 실제 테이블에 대해 쿼리를 실행하려면 — 키 조건 폼, 페이지네이션 그리드, 코드로 복사 — DynoTable을 다운로드하세요.
Related examples
- DynamoDB Query in Java — AWS SDK for Java 2.x를 사용한 동일한 쿼리.
- DynamoDB Scan in Go — 파티션으로 키 접근할 수 없을 때.
- 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
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- expression package — AWS SDK for Go v2 (pkg.go.dev)
- Querying tables — Amazon DynamoDB Developer Guide
Last verified 2026-07-13 against the official AWS documentation linked above.