DynamoDB에서 여러 항목을 삭제하는 법
DynamoDB에는 DELETE FROM table WHERE …가 없습니다. 모든 삭제는 전체 기본 키로
항목 하나를 대상으로 합니다 — API에는 대량 삭제 연산도, truncate도 없고,
의 DELETE 문은 문 하나당 정확히 항목 하나를 제거합니다. 그래서
"여러 항목 삭제"는 언제나 두 단계 작업입니다: 키를 찾고, 그런 다음 키마다
삭제 하나를 발행하되, 처리량을 위해 배치로 묶습니다.
이 가이드는 배치 옵션들, 전부-아니면-전무 트랜잭션 변형, 전부-삭제 케이스, 그리고 GUI에서 선택과 키 입력 두 번으로 같은 일을 하는 방법을 다룹니다.
DynamoDB에서 여러 항목을 어떻게 삭제하나요?
없앨 항목들의 기본 키를 (Query나 Scan으로) 모은 다음, 배치로 삭제하세요:
BatchWriteItem은 호출당 최대 25개의 DeleteRequest를 받고,
TransactWriteItems는 최대 100개 항목을 원자적으로 삭제하며, PartiQL DELETE
문은 BatchExecuteStatement로 한 번에 25개씩 배치할 수 있습니다.
DynoTable에서는 행을 선택하고 ⌘⌫를 눌러 삭제를
스테이징한 뒤, 검토하고 커밋합니다.
- 대량, 최선-노력:
BatchWriteItem— 호출당 25개 삭제, 남은 것은 재시도. - 전부-아니면-전무:
TransactWriteItems— 함께 성공하거나 함께 실패하는 최대 100개의 동작. - SQL풍 문법: PartiQL
DELETE+BatchExecuteStatement— 같은 키-단위 규칙, 익숙한 표기. - 테이블의 모든 것: truncate 전략 — 대개 테이블을 삭제하고 다시 만드는 편이 쌉니다.
- 시각적 선택: DynoTable의 스테이징된 삭제 — 행을 선택하고, 스테이징하고, 빨간 diff를 검토하고, 커밋.
0단계: 키 모으기
삭제에는 전체 기본 키가 필요합니다 — 테이블에서는
파티션 키 그리고 정렬 키입니다
(AWS:
"각 기본 키마다 키 속성 전부 를 제공해야 합니다"). 임의의 속성으로 삭제할 수는
없으므로, "status = 'archived'인 모든 항목 삭제"는 읽기에서 시작합니다:
- 조건이 키(또는 GSI 키)에 있다면, 표적화된
Query가 키를 저렴하게 모읍니다. - 그렇지 않으면 필터가 달린
Scan입니다 — 필터가 있든 없든 테이블 전체를 읽습니다(그리고 과금합니다); Query 대 Scan을 보세요.
키 속성만 반환하는 ProjectionExpression을 쓰고, LastEvaluatedKey를 끝까지
따라가세요(페이지네이션) — 아니면 조용히 첫 1 MB 페이지
분량만 삭제하게 됩니다.
방법 1: BatchWriteItem (호출당 최대 25개 삭제)
BatchWriteItem은 호출당 최대 25개의 put/delete 요청 또는 16 MB를
묶습니다
(AWS API 레퍼런스:
"BatchWriteItem 호출 한 번은 최대 25개의 항목 put 또는 delete 연산으로 이루어진,
최대 16MB의 데이터를 네트워크로 전송할 수 있습니다").
aws dynamodb batch-write-item --request-items '{
"Orders": [
{"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1001"}, "SK": {"S": "META"}}}},
{"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1002"}, "SK": {"S": "META"}}}},
{"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1003"}, "SK": {"S": "META"}}}}
]
}'배치에서 사람들이 걸려 넘어지는 세 가지 속성 — 모두 API 레퍼런스 그대로입니다:
- 원자적이지 않습니다. "
BatchWriteItem에 지정된 개별PutItem과DeleteItem연산은 원자적입니다. 하지만BatchWriteItem전체로는 그렇지 않습니다." 일부 삭제는 반영되고 다른 것은 안 될 수 있습니다. UnprocessedItems를 반드시 재시도해야 합니다. 스로틀링된 요청은 요청과 같은 형태로UnprocessedItems응답 맵에 담겨 돌아옵니다 — "일반적으로BatchWriteItem을 루프 안에서 호출"하며, AWS는 재시도 사이에 "지수 백오프 알고리즘을 사용할 것을 강력히 권장"합니다.- 조건이 없습니다. "개별 put과 delete 요청에는 조건을 지정할 수 없습니다" —
조건부 삭제는 대신
DeleteItem이나 트랜잭션을 거쳐야 합니다. 배치는 또한 한 호출 안에서 같은 키에 대한 두 연산을 거부합니다.
루프의 형태 — 25개씩 청크, 전송, 남은 것을 백오프와 함께 다시 큐에 — 는 배치 연산에서 다루는 것과 동일합니다.
방법 2: TransactWriteItems (원자적 삭제)
일련의 삭제가 함께 성공하거나 실패해야 할 때 — 이를테면 부모 항목과 그
자식들을 제거할 때 — TransactWriteItems를
쓰세요: 최대 100개의 동작(삭제, put, 업데이트, 조건 확인)이 원자적으로
적용되며, 항목별 도 허용됩니다. 대가는:
트랜잭션 쓰기는 일반 쓰기의 두 배 쓰기 용량이 듭니다. 전체 동작 방식(멱등성
토큰, TransactionCanceledException, 비용 계산)은
DynamoDB 트랜잭션에 있습니다.
방법 3: PartiQL DELETE, 배치로
PartiQL은 키-단위 규칙을 없애 주지 않습니다 — 표기만 바꿔 줄 뿐입니다. 개발자
가이드는 명시적입니다
(PartiQL DELETE):
"한 번에 하나의 항목만 삭제할 수 있습니다. 여러 항목을 삭제하는 단일 DynamoDB
PartiQL 문은 발행할 수 없습니다", 그리고 WHERE 조건은 "단일 기본 키 값으로
해석되어야 합니다".
여러 항목을 삭제하려면 단일 항목 문들을 배치합니다 —
BatchExecuteStatement
는 배치당 최대 25개 문을 실행합니다(모두 읽기이거나 모두 쓰기, 절대 섞이지
않음):
[
{"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1001' AND SK = 'META'"},
{"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1002' AND SK = 'META'"}
]aws dynamodb batch-execute-statement --statements file://statements.json전체 키를 고정하지 않는 WHERE는 실패합니다 —
DELETE FROM Orders WHERE status = 'archived'는 없습니다. 더 많은 PartiQL
패턴(과 그 뒤의 제한)은 PartiQL 예제와
PartiQL 대 SQL에 있습니다.
모든 항목 삭제하기 (truncate)
DynamoDB에는 truncate가 없습니다. 선호하는 순서대로 옵션은:
- 테이블을 삭제하고 다시 만드세요. 테이블 전체를 항목 단위로 삭제하면
항목마다 쓰기 하나가 과금됩니다;
DeleteTable+CreateTable은 그 쓰기 청구서 전체를 비켜 갑니다. 함정: 테이블 설정 — 인덱스, TTL, , 용량 모드, 태그 — 은 저절로 돌아오지 않습니다; 생성 시점에 다시 선언합니다(infrastructure-as-code라면 별일 아닙니다). - 로 항목을 만료시키세요. 정말 원하는 것이 "X보다 오래된 모든 것 삭제"라면, TTL이 만료된 항목을 백그라운드에서 쓰기 용량 소비 없이 삭제합니다 — 아무 비용도 들지 않는 슬로모션 대량 삭제입니다.
- Scan + 배치 삭제(방법 1) — 테이블이 계속 라이브여야 하고 일부만 없앨 때입니다 — 스캔된 항목마다 읽기, 삭제된 항목마다 쓰기 비용을 냅니다.
DynoTable에서 여러 항목 삭제하기
위의 선택-후-삭제 흐름 — 쿼리, 키 수집, 청크, 재시도 — 은 GUI가 맡아야 할 바로 그 잡무입니다. DynoTable에서는 그리드 선택입니다:
- 없앨 행들이 화면에 나오도록 쿼리를 실행하거나 필터링하세요.
- 행들을 선택하고 ⌘⌫를 누르세요 — 선택된 모든 행이 스테이징된 삭제가 됩니다. 아직 DynamoDB에 닿은 것은 아무것도 없습니다: 그리드에서 행이 빨갛게 물들고 스테이징 패널에 검토 가능한 카드로 나타납니다.
- 검토한 뒤 커밋하세요. 커밋은 낙관적 잠금 조건과 함께
TransactWriteItems배치로 나갑니다 — 스테이징된 삭제는 항목이 여전히 존재할 때만 통과합니다 — 그리고 큰 스테이지는 DynamoDB의 트랜잭션 한도 안에 들어가도록 자동으로 청크됩니다. ⌘⇧⌫는 검토를 건너뛰고 한 번의 키 조합으로 선택을 삭제하고 커밋합니다.

범위는 정직합니다: 삭제되는 것은 선택한 행들 — 검토를 거치고 커밋 전까지 되돌릴 수 있는 작업 — 이지, 맹목적인 전체 테이블 truncate가 아닙니다. 테이블 전체를 지우려면 (위에서처럼) 테이블을 삭제하고 다시 만드세요.
삭제에 손으로 쓴 조건(attribute_exists, 버전 확인)이 필요하다면,
DynamoDB Expression Builder에서 정확한
ConditionExpression + 플레이스홀더 맵을 만들어 DeleteItem이나 트랜잭션에
붙이세요.
FAQ
DynamoDB 호출 한 번으로 여러 항목을 삭제할 수 있나요?
네 — BatchWriteItem으로 최대 25개(최선-노력, UnprocessedItems 재시도) 또는
TransactWriteItems로 최대 100개를 원자적으로 삭제합니다. 둘 다 항목마다 전체
기본 키를 받으며, 어느 쪽도 항목을 고르는 "where" 조건을 받지 않습니다.
DynamoDB에 DELETE WHERE가 있나요?
아니요. 저수준 API도 PartiQL도 조건으로 삭제할 수 없습니다 — PartiQL의
DELETE는 "단일 기본 키 값으로 해석"되는 WHERE를 요구합니다. 먼저 키를
쿼리하거나 스캔한 다음, 각각을 삭제합니다.
DynamoDB 테이블의 모든 항목을 어떻게 삭제하나요? 전체 소거라면 테이블을 삭제하고 다시 만드세요 — 항목마다 쓰기 하나를 내는 것을 피할 수 있습니다. 오래된 것 위주의 정리에는 TTL을 쓰세요 — 만료된 항목을 쓰기 용량 소비 없이 삭제합니다. Scan + 배치 삭제는 테이블이 계속 라이브여야 할 때의 대비책입니다.
왜 배치 삭제 후에 항목이 다시 나타나나요?
거의 항상 재시도하지 않은 UnprocessedItems 때문입니다: 스로틀링된
BatchWriteItem은 실패한 삭제를 응답에 조용히 돌려주고, 그것을 루프로 처리하지
않는 코드는 항목이 테이블에 남은 채로 "끝"납니다. 맵이 비어서 돌아올 때까지 지수
백오프로 재시도하세요.
항목을 삭제하는 비용은 얼마나 드나요? 각 삭제는 표준 쓰기이고(1 KB당 WCU 하나, 트랜잭션 안에서는 두 배), 키를 찾는 데도 읽기 비용이 듭니다. 요금 계산기로 피해 규모를 추산하세요.
무엇을 삭제하는지 먼저 보고 싶으신가요? DynoTable을 다운로드하세요 — 행을 선택하고, ⌘⌫로 삭제를 스테이징하고, diff를 검토하고, 확신이 들 때 커밋하세요.


