DynamoDB ReturnValues: 쓰기에서 이전 또는 새 항목 받기
기본적으로 DynamoDB 쓰기는 성공 외에는 아무것도 반환하지 않습니다. 하지만 종종 쓰기
주변의 데이터 — 바꾸기 전의 값이나, 바꾼 뒤의 새 값 — 이 필요합니다. 순진한
해법은 두 번째 GetItem인데, 이는 추가 왕복이자 경쟁입니다: 그 사이에 다른
누군가가 쓸 수 있습니다. DynamoDB는 ReturnValues 매개변수로 둘 다 피합니다.
쓰기 자체의 일부로서 이전 또는 새 항목을 원자적으로 건네주거든요.
DynamoDB에서 ReturnValues는 무엇을 하나요?
ReturnValues는 DynamoDB 쓰기가 같은 호출의 일부로 항목을 돌려주도록 지시해, 두 번째 GetItem과 그로 인한 경쟁 조건을 건너뜁니다. PutItem과 DeleteItem은 NONE 또는 ALL_OLD만 받습니다. UpdateItem은 다섯 가지(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW) 모두를 받아, 이전 또는 새 값을 원자적으로 반환합니다.
ReturnValues는 쓰기의 일부로 항목을 반환합니다 — 두 번째 읽기도, 경쟁도 없습니다.NONE(기본값) — 아무것도 반환하지 않습니다.ALL_OLD— 쓰기 직전 그대로의 항목 전체.UPDATED_OLD— 업데이트가 바꾼 속성만, 이전 값.ALL_NEW— 쓰기 직후의 항목 전체.UPDATED_NEW— 바뀐 속성만, 이후 값.PutItem/DeleteItem은NONE또는ALL_OLD만 받습니다.UpdateItem은 다섯 가지 모두 받습니다.
문제: 방금 덮어쓴 값이 필요함
지원 데스크를 운영하는데 상담원이 티켓 상태를 open에서 pending으로 바꿉니다.
감사 로그는 변경 이전의 상태가 무엇이었는지 기록해야 합니다. ReturnValues가
없다면 이렇게 하겠죠:
GetItem으로 현재 상태를 읽고,UpdateItem으로 새 상태를 설정.
1단계와 2단계 사이에 다른 상담원이 상태를 바꿀 수 있습니다 — 이제 감사 로그는 낡은
"이전" 값을 기록합니다. 게다가 하나의 논리적 작업에 두 번의 호출입니다.
ReturnValues는 이것을, 쓰기 시점에 실제 그러했던 이전 상태를 반환하는 단일 원자적
UpdateItem으로 접어 넣습니다.
다섯 가지 옵션과 각각의 사용처
UpdateItem은 전체를 지원합니다. 선택지는 항목의 어느 부분과 쓰기의 어느 쪽이
필요한가입니다:
ReturnValues | 반환 | 사용처 |
|---|---|---|
NONE | 없음 | 항목을 돌려받을 필요가 없을 때(기본값) |
ALL_OLD | 쓰기 전 항목 전체 | 감사 / "방금 무엇을 교체했지?" |
UPDATED_OLD | 쓰기 전 바뀐 속성 | 건드린 필드만 신경 쓸 때 |
ALL_NEW | 쓰기 후 항목 전체 | 호출자에게 돌려줄 신선한 항목 전체가 필요할 때 |
UPDATED_NEW | 쓰기 후 바뀐 속성 | 방금 증가시킨 카운터/값을 다시 읽을 때 |
UPDATED_NEW는 일상의 영웅입니다:
업데이트 표현식으로 카운터를 증가시키고 같은
호출에서 새 합계를 다시 읽어들이세요, 경쟁 없이. 지원 티켓 감사라면, ALL_OLD(또는
상태 필드만 로깅한다면 UPDATED_OLD)가 변경 전 상태를 원자적으로 포착합니다.
비대칭에 주목하세요: PutItem과 DeleteItem은 NONE과 ALL_OLD만 지원합니다 —
삭제에는 반환할 "새" 값이 없고, put의 새 값은 여러분이 보낸 그것일 뿐입니다.
제자리에서 변형하는 UpdateItem만이 다섯 가지를 모두 제공합니다.
AWS 문서가
정확한 행렬을 설명합니다.
DynoTable에서 업데이트 쓰기
UpdateItem과 그 업데이트 표현식을
DynamoDB 표현식 빌더로 시각적으로 조립하세요 —
SET/ADD 절과 속성 이름 및 값 맵을 출력합니다. 앱에서는 스테이징된 쓰기가 커밋된
뒤 결과 항목을 DynoTable이 보여 주므로, 새 상태를 곧장 확인합니다.

함정 + 다음 단계
- 변경 주변을 읽으려고
GetItem-후-쓰기를 하지 마세요 — 왕복이자 경쟁입니다.ReturnValues를 쓰세요. UPDATED_*는 건드린 속성만 반환합니다 — 항목 전체가 필요하면ALL_*을 쓰세요.PutItem/DeleteItem은 새 값을 반환할 수 없습니다 —NONE/ALL_OLD만 됩니다.ReturnValues는 조건의 대체물이 아닙니다 — 쓰기를 가드하려면 조건 표현식을 추가하고, 그 효과를 다시 읽으려면ReturnValues를 쓰세요. 둘은 함께 쓸 수 있습니다.- 관련: 업데이트 표현식, 원자적 카운터.
스크립트로 두 호출을 짜지 않고 편집하고 전후를 보고 싶으신가요? DynoTable을 받아 항목을 직접 편집해 보세요.


