Java(AWS SDK v2)의 DynamoDB DeleteItem
AWS SDK for Java 2.x에서 삭제는 전체 기본 키를 담은 DeleteItemRequest이며, ReturnValue.ALL_OLD가 실제로 무언가 있었는지를 알려 줍니다.
아래 코드에 conditionExpression을 추가하면, 컴파일은 그대로 되면서 버그가 생깁니다. 코드 아래 첫 번째 글머리 기호가 바로 그 버그입니다.
코드
import java.util.HashMap;
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.DeleteItemRequest;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ReturnValue;
public class DeleteItemExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, AttributeValue> key = new HashMap<>();
key.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
key.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());
DeleteItemRequest request = DeleteItemRequest.builder()
.tableName("Music")
.key(key)
.returnValues(ReturnValue.ALL_OLD)
.build();
DeleteItemResponse response = ddb.deleteItem(request);
if (response.attributes().isEmpty()) {
System.out.println("No item with that key existed");
} else {
System.out.println("Deleted: " + response.attributes());
}
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}설명
ConditionalCheckFailedException은DynamoDbException을 상속합니다 — 그래서 위의catch블록은 실패한 가드를 삼켜 버리고, 마치 서비스가 고장 난 것처럼 출력합니다. 요청이conditionExpression을 담게 되면 더 좁은 타입을 먼저 잡으세요. 제 역할을 한 조건은 오류가 아니라 결과입니다.- 예외가 밀려난 항목을 함께 전달합니다 — 요청에
returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD)를 붙이면e.item()이 DynamoDB가 본 그대로의 행을 돌려줍니다. AWS는 그 대가도 명시합니다: "No read capacity units are consumed." attributes()는 절대null을 반환하지 않습니다 — 아무것도 맞지 않은 삭제는 빈 맵을 내놓으므로isEmpty()가 판정 기준입니다. "서비스가 아무것도 반환하지 않았다"와 "서비스가 빈 맵을 반환했다"를 갈라 주는 것은hasAttributes()입니다.ReturnValue열거형은UpdateItem과 공유됩니다 —returnValues(ReturnValue.ALL_NEW)는 여기서도 컴파일되지만ValidationException으로 돌아옵니다. "DeleteItemdoes not recognize any values other thanNONEorALL_OLD"이기 때문입니다. 빌더의String오버로드도 똑같은 실수를 감춥니다(전체 목록).- 테이블을 비우는 것은 API 호출이 아닙니다 —
DeleteItem은 정확히 키 하나를 삭제하며, SDK에는 여러 개를 삭제하는 것이 없습니다. 테이블 비우기는 키를 얻기 위한Scan다음에 배치 쓰기를 잇는 일이고, 대개DeleteTable후CreateTable에 밀립니다.
시각적으로 해보기
가드로 삼는 속성이 예약어라면 조건에 # 별칭이 필요합니다. 예약어 검사기는 속성 이름 중 어느 것이 AWS의 573단어 목록에 올라 있는지 알려 주고, 해당하는 것들에 대해 expressionAttributeNames 맵을 생성해 줍니다.
DynoTable은 삭제가 테이블에 닿기 전에 보류 중인 변경 사항 패널에 스테이징합니다. Cmd+Backspace는 선택한 행을 스테이징하고, Cmd+Shift+Backspace는 한 번에 삭제하고 커밋하며, 스테이징된 것은 무엇이든 폐기할 수 있습니다. DynoTable 다운로드.
관련 예제
- Go의 DynamoDB DeleteItem — AWS SDK for Go v2로 하는 같은 삭제.
- Java의 DynamoDB PutItem — 같은 키의 쓰기 쪽.
- DynamoDB 조건 표현식 —
attribute_exists와 값 검사로 삭제를 보호하기. - DynamoDB ConditionalCheckFailedException — 실패한 조건부 삭제가 던지는 것, 그리고 그것이 예상된 상황일 때.
참고 자료
- DeleteItem — Amazon DynamoDB API Reference
- Use DeleteItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- DeleteItemRequest — AWS SDK for Java 2.x API Reference
- ConditionalCheckFailedException — AWS SDK for Java 2.x API Reference
- Condition expressions — Amazon DynamoDB Developer Guide
위에 링크된 공식 AWS 문서를 기준으로 2026-07-28에 마지막으로 검증했습니다.