DynamoDB 데이터를 보고, 둘러보고, 편집하는 방법
DynamoDB 테이블에 하는 모든 "보기"나 "변경"은 작은 API 작업 집합 중 하나로 매핑됩니다 — GetItem,
Query, Scan, PutItem, UpdateItem, DeleteItem. 그 아래에 관계형 테이블 뷰어는 없습니다:
"테이블 둘러보기"는 문자 그대로 Scan이고, "행 편집하기"는 기본 키에 대한 UpdateItem입니다. 각
클릭이 어떤 작업으로 매핑되는지 아는 것이, 저렴한 읽기와 의도하지 않은 전체 테이블 스캔의 차이입니다.
DynoTable은 바로 이 작업들 위의 GUI입니다 — 와이어에 도달하기 전에 어떤 작업을 실행하려는지, 그리고 비용을 보여줍니다.
DynamoDB 테이블을 둘러보는 방법
"무엇이 들었는지 보려고" 테이블을 여는 것은 **Scan**입니다 — 테이블이나 인덱스의 모든 항목을 읽습니다
(AWS:
"Amazon DynamoDB의 Scan 작업은 테이블이나 보조 인덱스의 모든 항목을 읽습니다"). 작은 테이블에는
괜찮지만, 큰 테이블에서는 query 대 scan에서 다루는 고전적 비용 함정입니다.
단일 Scan은 최대 1 MB의 데이터를 반환한 다음 다음 페이지를 가져올 LastEvaluatedKey를 건넵니다 —
그래서 "테이블 전체 둘러보기"는 사실 페이지네이션 루프입니다
(AWS:
"단일 Scan 요청은 최대 1 MB의 데이터를 검색할 수 있습니다" 그리고 "Scan 응답의
LastEvaluatedKey는 다음 Scan 요청의 ExclusiveStartKey로 사용되어야 합니다"). 커서가 어떻게
작동하고 오프셋 스타일 페이지 번호가 왜 여기 존재하지 않는지는 페이지네이션을
보세요.
DynamoDB 데이터를 필터링/스캔하는 방법
함정: 필터 표현식은 스캔을 아껴주지 않습니다. DynamoDB는 읽기가 완료된 후에 필터를 적용하므로, 유지하는 행만이 아니라 스캔된 모든 항목에 비용을 지불합니다.
필터 표현식은
Scan이 끝난 후 결과가 반환되기 전에 적용됩니다. 따라서Scan은 필터 표현식의 존재 여부와 관계없이 동일한 양의 읽기 용량을 소비합니다. — AWS Scan 문서
응답이 이를 보이게 합니다: ScannedCount는 "ScanFilter가 적용되기 전에 평가된 항목 수"이고
Count는 필터에서 살아남은 것입니다
(AWS).
높은 ScannedCount에 작은 Count는 비효율적인 스캔의 신호입니다.
DynamoDB 테이블을 쿼리하는 방법
**Query**는 저렴하고 표적화된 읽기입니다 — 하지만 파티션 키가 필요합니다.
AWS에
따르면: "파티션 키 속성의 이름과 그 속성의 단일 값을 제공해야 합니다. Query는 그 파티션 키 값을 가진
모든 항목을 반환합니다. 선택적으로 정렬 키 속성을 제공하고 비교 연산자를 사용해 검색 결과를 좁힐 수
있습니다."
그래서 Query는 한 파티션 키 아래의 항목만, 선택적으로 정렬 키 조건으로 좁혀 읽습니다 — 결코 테이블
전체가 아닙니다. 파티션 키가 없으면 Query도 없습니다: 다시 Scan으로 돌아갑니다. 그 선택이
DynamoDB에서 가장 중요한 단일 비용 결정입니다. 전체 분석은
query 대 scan에 있습니다.
플레이스홀더 구문을 손으로 쓰지 않고 KeyConditionExpression / FilterExpression을 조립하려면,
DynamoDB Expression Builder를 사용하세요 — API가 기대하는
정확한 names/values 맵을 내보냅니다.
DynamoDB에서 항목을 편집하는 방법
항목 하나를 편집하는 것은 그 전체 기본 키에 대한 **UpdateItem**입니다. 항목 전체를 다시 쓰는 게
아니라 — 변경하는 속성만 지정하는 업데이트 표현식을 제공합니다:
UpdateItem
Key: { "PK": "USER#42", "SK": "PROFILE" }
UpdateExpression: SET email = :e, updatedAt = :t사람들을 걸려 넘어지게 하는 두 가지 사실, 둘 다 AWS 항목 문서에서:
- 일부가 아니라 전체 기본 키를 지정해야 합니다. 복합 키 테이블에서는 파티션 키 그리고 정렬 키입니다. 임의의 속성으로 "행을 편집"할 수 없습니다 — 그러려면 먼저 키를 찾는 스캔이 필요합니다.
UpdateItem은 upsert입니다. "지정된 키를 가진 항목이 존재하지 않으면UpdateItem은 새 항목을 생성합니다. 그렇지 않으면 기존 항목의 속성을 수정합니다." 키의 오타는 오류를 내는 대신 조용히 새 항목을 생성합니다.
항목을 삭제하는 방법
DeleteItem, 역시 전체 기본 키로 키잉됩니다:
"DeleteItem은 지정된 키를 가진 항목을 삭제합니다"
(AWS).
편집과 같은 규칙 — 전체 키가 필요하므로, "status = 'open'인 모든 행"을 삭제하는 것은 한 번의 호출이
아닙니다. 키를 찾으려고 스캔/쿼리한 다음 각각을 삭제합니다. BatchWriteItem은 최대 25개의
put/delete 요청을 묶습니다
(AWS:
"BatchWriteItem 작업은 최대 25개의 개별 PutItem과 DeleteItem 요청을 포함할 수 있습니다"),
하지만 각각 여전히 하나의 키를 겨눕니다 — DELETE … WHERE는 없습니다.
중첩 / JSON 데이터를 보는 방법
DynamoDB 항목은 타입 태그가 붙은 와이어 형식(DynamoDB-JSON)으로 저장되며, 모든 값은 한두 글자의 타입
디스크립터(S, N, M, L, SS… — 전체 디스크립터 목록은
AWS 데이터 타입 문서에)를
담습니다. 일반 JSON에는 집합 타입이 없으므로, 배열은 문자열 집합(SS)이 아니라 리스트(L)로
왕복합니다 — 표시 버그가 아니라 실제 변환 한계입니다. 전체 타입 맵은
DynamoDB 데이터 타입에 있습니다. DynamoDB-JSON 블롭을 일반 JSON으로,
그리고 다시 변환하려면 DynamoDB JSON 변환기를 사용하세요.
둘러보기와 편집을 넘어: DynamoDB가 못 하는 쿼리
Scan/Query/UpdateItem은 보기와 편집을 커버하지만, 분석할 수는 없습니다 — DynamoDB에는
JOIN, GROUP BY, 또는 COUNT/SUM 같은 집계 함수가 없고,
PartiQL도 이를 더하지 않습니다: 그 SELECT 문법은 그저
SELECT … FROM table [WHERE …] [ORDER BY …]이며, 조인이나 그룹화 절이 없습니다
(AWS PartiQL SELECT 참조),
그래서 각 문장은 단일 Get/Query/Scan/Put/Update/Delete로 매핑됩니다. DynoTable의 SQL Workbench는
여러분의 테이블을 DynamoDB의 실제 쿼리 런타임을 통해 구체화하고 그 위에서 SQL을 실행함으로써 그 빈틈을
채웁니다 — DynamoDB의 액세스 패턴 규칙 내의 SQL — 하지만 일상의 둘러보기와 편집에는 위의 작업들이
전체 도구함입니다.
FAQ
AWS 콘솔 없이 DynamoDB 데이터를 어떻게 보나요?
같은 Scan/Query 호출을 발행하는 데스크톱 GUI를 사용하세요. AWS 콘솔은 페이지된 스캔으로 테이블을
둘러봅니다. DynoTable 같은 전용 클라이언트도 같은 일을 하지만 소비된 용량과 실행 중인 작업을 보여줍니다.
DynamoDB 항목을 어떻게 편집하나요?
변경하는 속성만 지정하는 SET 업데이트 표현식으로 항목의 전체 기본 키에 대해 UpdateItem을
발행하세요. GUI에서는 셀을 인라인 편집하세요 — 대신 그 UpdateItem으로 컴파일됩니다.
왜 필터링이 여전히 전체 스캔 비용이 드나요? DynamoDB가 스캔이 항목을 읽은 후에 필터를 적용하기 때문입니다. 필터링되어 빠진 항목도 여전히 읽고 과금됩니다. 비용을 줄이려면 스캔 대신 파티션 키(또는 GSI)로 쿼리하세요.
여러 항목을 한 번에 갱신할 수 있나요?
한 번의 호출로는 안 됩니다. UpdateItem/DeleteItem은 각각 단일 기본 키를 겨눕니다. UPDATE … WHERE는 없습니다. 키를 모으려고 스캔/쿼리한 다음 각각을 씁니다(BatchWriteItem당 최대 25개).
DynamoDB Local 테이블도 같은 방식으로 둘러볼 수 있나요? 예 — 같은 GUI를 로컬 엔드포인트에 겨누세요. DynamoDB Local을 보세요.
DynamoDB 테이블을 둘러보고, 필터링하고, 인라인 편집하고 — PartiQL이 못 하는 SQL을 실행하고 싶으신가요? DynoTable 다운로드.