Go(AWS SDK v2)의 DynamoDB DeleteItem
client.DeleteItem은 전체 기본 키를 담은 dynamodb.DeleteItemInput을 받습니다. types.ReturnValueAllOld를 쓰면 응답이 실제로 뭔가 있었는지 알려주고, ConditionExpression을 더하는 순간에는 오류가 왜 그것이 남아 있는지 알려줍니다.
코드
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.DeleteItem(ctx, &dynamodb.DeleteItemInput{
TableName: aws.String("Music"),
Key: map[string]types.AttributeValue{
"Artist": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
},
ReturnValues: types.ReturnValueAllOld,
})
if err != nil {
log.Fatalf("delete item: %v", err)
}
if len(out.Attributes) == 0 {
fmt.Println("No item with that key existed")
} else {
fmt.Println("Deleted:", out.Attributes)
}
}설명
types.ReturnValueAllOld는 문자열"ALL_OLD"가 아니라 타입이 지정된 상수입니다 — 이 필드는types.ReturnValue를 받으므로 오타가 런타임ValidationException이 아니라 컴파일 오류가 됩니다.DeleteItem은NONE과ALL_OLD만 받아들이며, 나머지 열거값은UpdateItem과 공유합니다.len(out.Attributes) == 0이 얻을 수 있는 유일한 신호입니다 — 존재한 적 없는 키를 삭제해도 성공하며, SDK는 오류 대신 nil 맵을 돌려줍니다. "삭제했다"와 "삭제할 것이 없었다"를 가르는 다른 표시는 없습니다.- 가드 실패는
errors.As로 잡으세요 —var ccfe *types.ConditionalCheckFailedException다음errors.As(err, &ccfe)입니다. Go v2가 서비스 오류를 Smithy 작업 오류로 감싸기 때문에 직접 비교로는 놓칩니다. - 예외가 진 항목을 실어 올 수 있습니다 —
ReturnValuesOnConditionCheckFailure: types.ReturnValuesOnConditionCheckFailureAllOld를 설정하면ccfe.Item이 DynamoDB가 본 그대로의 행을 담으므로, 다시 읽지 않고도 실제로 가드를 통과하지 못한 값을 기록할 수 있습니다. SDK는 그 대가를 이렇게 문서화합니다. "No read capacity units are consumed." - 호출당 항목 하나 — 전체 삭제 API는 없습니다. 여러 항목을 삭제한다는 것은 먼저 키를 모아 쓰기를 배치로 처리하거나, 테이블을 통째로 버린다는 뜻입니다.
시각적으로 해보기
까다로운 쪽은 가드입니다. ConditionExpression과 거기에 딸린 이름·값 맵 말입니다. DynamoDB Expression Builder가 이 셋을 폼 하나로 조립해 줍니다.
DynoTable은 같은 위험을 반대편에서 공략합니다. 삭제는 먼저 Pending changes 패널에 들어가고 커밋할 때만 테이블에 도달하므로, 잘못된 행은 복구할 대상이 아니라 그냥 버리면 되는 것이 됩니다. DynoTable 다운로드.
관련 예제
- Java의 DynamoDB DeleteItem — AWS SDK for Java 2.x로 구현한 동일한 삭제.
- Go의 DynamoDB PutItem — 같은 키의 쓰기 쪽.
- DynamoDB 조건 표현식 —
attribute_exists와 값 검사로 삭제를 보호하기. - DynamoDB ConditionalCheckFailedException — 조건부 삭제가 실패하면 무엇이 발생하는지, 그리고 언제 예상된 것인지.
참고 자료
- DeleteItem — Amazon DynamoDB API Reference
- Use DeleteItem 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)
- Condition expressions — Amazon DynamoDB Developer Guide
위에 링크된 공식 AWS 문서를 기준으로 2026-07-28에 마지막으로 검증했습니다.