Go(AWS SDK v2)에서의 DynamoDB GetItem
AWS SDK for Go v2에서 항목은 map[string]types.AttributeValue이고, types.AttributeValue는 봉인된 인터페이스입니다. 구현체는 SDK가 제공하는 열 개의 AttributeValueMember* 구조체뿐입니다. 그것들로 키를 작성하는 일은 쉽습니다. 값을 다시 읽어 내는 지점에서 Go가 다른 모든 SDK와 갈라집니다.
client.GetItem은 다른 곳과 마찬가지로 여전히 완전한 기본 키를 요구합니다.
코드
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)
out, err := client.GetItem(ctx, &dynamodb.GetItemInput{
TableName: aws.String("Music"),
Key: map[string]types.AttributeValue{
"Artist": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
},
ProjectionExpression: aws.String("#proj0, #proj1, #proj2, #proj3"),
ExpressionAttributeNames: map[string]string{
"#proj0": "Artist",
"#proj1": "SongTitle",
"#proj2": "AlbumTitle",
"#proj3": "Year",
},
})
if err != nil {
log.Fatalf("get item: %v", err)
}
if out.Item == nil {
fmt.Println("Item not found")
return
}
fmt.Println(out.Item)
}설명
- 스칼라는 포인터입니다 —
TableName,ProjectionExpression,ConsistentRead는*string과*bool이라서 SDK가 "설정되지 않음"과 제로 값을 구분할 수 있습니다.aws.String,aws.Bool,aws.Int32는 오직 그것을 위해 존재합니다. - 숫자는 문자열로 도착합니다 — DynamoDB가 와이어에서 숫자를 문자열로 보내기 때문에
AttributeValueMemberN.Value는string입니다.Year를 읽는다는 것은out.Item["Year"].(*types.AttributeValueMemberN)다음에strconv.Atoi를 뜻합니다. 단언은 comma-ok 형태로 쓰세요. 맨 형태는 속성이 없거나 타입이 다르면 패닉을 일으킵니다. attributevalue.UnmarshalMap이 탈출구입니다 —github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue에 있으며,dynamodbav태그가 붙은 구조체로 항목 전체를 매핑하고 문자열-숫자 변환도 처리합니다. 항목에 속성이 두어 개를 넘는 순간부터 손이 갈 만합니다.- 찾지 못하면
out.Item이nil이고,err도nil입니다. 둘을 구분할 필요가 없다면len(out.Item) == 0이 nil과 빈 맵을 모두 덮습니다. - 오류는
errors.As로 판별하세요 — Go v2는 서비스 오류를 Smithy 작업 오류로 감싸므로err == …나err.Error()문자열 비교는 둘 다 조용히 실패합니다.var nf *types.ResourceNotFoundException을 선언하고 그 주소를 넘기세요. ConsistentRead: aws.Bool(true)는 읽기 비용을 두 배로 만들고 GSI에서는 거부됩니다. 위의#proj별칭도 장식이 아닙니다.Year는 예약어라서 그것을 직접 지목하는 프로젝션은 거절당합니다.
시각적으로 해보기
AttributeValueMember* 형태와 평범한 JSON 사이를 옮겨 다니는 일은 Go에서 늘 따라붙는 세금입니다. 항목 하나만 읽거나 붙여 넣으면 될 때는 DynamoDB JSON 변환기가 브라우저에서 그 왕복을 처리해 줍니다.
DynoTable은 대신 항목을 평범한 행으로 보여 주고, 그리드 뒤의 쿼리를 바로 이 SDK v2 타입 위에 세운 Go 프로그램으로 내보냅니다. DynoTable 다운로드.
관련 예제
- Java의 DynamoDB GetItem — AWS SDK for Java 2.x로 하는 같은 읽기.
- Go의 DynamoDB Query — 항목 하나 대신 파티션 전체 읽기.
- DynamoDB 파티션 키의 동작 방식 —
GetItem이 완전한 키를 요구하는 이유. - DynamoDB ResourceNotFoundException — 여기서 가장 먼저 만나는 오류: 잘못된 테이블 이름이나 리전.
- "The provided key element does not match the schema" — 넘긴 키가 테이블의 키 스키마와 맞지 않는 경우.
참고 자료
- GetItem — Amazon DynamoDB API Reference
- Use GetItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- attributevalue package — AWS SDK for Go v2 (pkg.go.dev)
- Read consistency — Amazon DynamoDB Developer Guide
위에 링크된 공식 AWS 문서를 기준으로 2026-07-28에 마지막으로 검증했습니다.