중급2분 분량

DynamoDB ReturnValues: 쓰기에서 이전 또는 새 항목 받기

기본적으로 DynamoDB 쓰기는 성공 외에는 아무것도 반환하지 않습니다. 하지만 종종 쓰기 주변의 데이터 — 바꾸기 전의 값이나, 바꾼 뒤의 새 값 — 이 필요합니다. 순진한 해법은 두 번째 GetItem인데, 이는 추가 왕복이자 경쟁입니다: 그 사이에 다른 누군가가 쓸 수 있습니다. DynamoDB는 ReturnValues 매개변수로 둘 다 피합니다. 쓰기 자체의 일부로서 이전 또는 새 항목을 원자적으로 건네주거든요.

DynamoDB에서 ReturnValues는 무엇을 하나요?

ReturnValues는 DynamoDB 쓰기가 같은 호출의 일부로 항목을 돌려주도록 지시해, 두 번째 GetItem과 그로 인한 경쟁 조건을 건너뜁니다. PutItemDeleteItemNONE 또는 ALL_OLD만 받습니다. UpdateItem은 다섯 가지(NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW) 모두를 받아, 이전 또는 새 값을 원자적으로 반환합니다.

  • ReturnValues는 쓰기의 일부로 항목을 반환합니다 — 두 번째 읽기도, 경쟁도 없습니다.
  • NONE(기본값) — 아무것도 반환하지 않습니다.
  • ALL_OLD — 쓰기 직전 그대로의 항목 전체.
  • UPDATED_OLD — 업데이트가 바꾼 속성만, 이전 값.
  • ALL_NEW — 쓰기 직후의 항목 전체.
  • UPDATED_NEW — 바뀐 속성만, 이후 값.
  • PutItem/DeleteItemNONE 또는 ALL_OLD만 받습니다. UpdateItem은 다섯 가지 모두 받습니다.

문제: 방금 덮어쓴 값이 필요함

지원 데스크를 운영하는데 상담원이 티켓 상태를 open에서 pending으로 바꿉니다. 감사 로그는 변경 이전의 상태가 무엇이었는지 기록해야 합니다. ReturnValues가 없다면 이렇게 하겠죠:

  1. GetItem으로 현재 상태를 읽고,
  2. UpdateItem으로 새 상태를 설정.

1단계와 2단계 사이에 다른 상담원이 상태를 바꿀 수 있습니다 — 이제 감사 로그는 낡은 "이전" 값을 기록합니다. 게다가 하나의 논리적 작업에 두 번의 호출입니다. ReturnValues는 이것을, 쓰기 시점에 실제 그러했던 이전 상태를 반환하는 단일 원자적 UpdateItem으로 접어 넣습니다.

다섯 가지 옵션과 각각의 사용처

UpdateItem은 전체를 지원합니다. 선택지는 항목의 어느 부분쓰기의 어느 쪽이 필요한가입니다:

ReturnValues반환사용처
NONE없음항목을 돌려받을 필요가 없을 때(기본값)
ALL_OLD쓰기 전 항목 전체감사 / "방금 무엇을 교체했지?"
UPDATED_OLD쓰기 전 바뀐 속성건드린 필드만 신경 쓸 때
ALL_NEW쓰기 후 항목 전체호출자에게 돌려줄 신선한 항목 전체가 필요할 때
UPDATED_NEW쓰기 후 바뀐 속성방금 증가시킨 카운터/값을 다시 읽을 때

UPDATED_NEW는 일상의 영웅입니다: 업데이트 표현식으로 카운터를 증가시키고 같은 호출에서 새 합계를 다시 읽어들이세요, 경쟁 없이. 지원 티켓 감사라면, ALL_OLD(또는 상태 필드만 로깅한다면 UPDATED_OLD)가 변경 전 상태를 원자적으로 포착합니다.

비대칭에 주목하세요: PutItemDeleteItemNONEALL_OLD만 지원합니다 — 삭제에는 반환할 "새" 값이 없고, put의 새 값은 여러분이 보낸 그것일 뿐입니다. 제자리에서 변형하는 UpdateItem만이 다섯 가지를 모두 제공합니다. AWS 문서가 정확한 행렬을 설명합니다.

DynoTable에서 업데이트 쓰기

UpdateItem과 그 업데이트 표현식을 DynamoDB 표현식 빌더로 시각적으로 조립하세요 — SET/ADD 절과 속성 이름 및 값 맵을 출력합니다. 앱에서는 스테이징된 쓰기가 커밋된 뒤 결과 항목을 DynoTable이 보여 주므로, 새 상태를 곧장 확인합니다.

DynoTable에서 항목의 스테이징된 변경 사항 검토 — 업데이트가 커밋되기 전의 이전 값과 새 값.
DynoTable에서 항목의 스테이징된 변경 사항 검토 — 업데이트가 커밋되기 전의 이전 값과 새 값.

함정 + 다음 단계

  • 변경 주변을 읽으려고 GetItem-후-쓰기를 하지 마세요 — 왕복이자 경쟁입니다. ReturnValues를 쓰세요.
  • UPDATED_*는 건드린 속성만 반환합니다 — 항목 전체가 필요하면 ALL_*을 쓰세요.
  • PutItem/DeleteItem은 새 값을 반환할 수 없습니다NONE/ALL_OLD만 됩니다.
  • ReturnValues는 조건의 대체물이 아닙니다 — 쓰기를 가드하려면 조건 표현식을 추가하고, 그 효과를 다시 읽으려면 ReturnValues를 쓰세요. 둘은 함께 쓸 수 있습니다.
  • 관련: 업데이트 표현식, 원자적 카운터.

스크립트로 두 호출을 짜지 않고 편집하고 전후를 보고 싶으신가요? DynoTable을 받아 항목을 직접 편집해 보세요.

업데이트됨