DynamoDB 데이터 타입
모든 DynamoDB 속성은 와이어 형식에서 한두 글자의 타입 코드로 태그됩니다. 이 집합을 아는 것이 중요한 이유는, 타입이 값을 저장하는 방식과 항목 크기에 기여하는 방식을 모두 좌우하기 때문입니다.
한눈에 보기
| 코드 | 타입 | 범주 | JSON / JS 대응 | 예시 (DynamoDB-JSON) |
|---|---|---|---|---|
S | 문자열 | 스칼라 | string | {"S": "Ada"} |
N | 숫자 | 스칼라 | number | {"N": "37"} |
B | 바이너리 | 스칼라 | Uint8Array / base64 | {"B": "ZGF0YQ=="} |
BOOL | 불리언 | 스칼라 | boolean | {"BOOL": true} |
NULL | Null | 스칼라 | null | {"NULL": true} |
M | 맵 | 문서 | object | {"M": {"k": {"S": "v"}}} |
L | 리스트 | 문서 | array | {"L": [{"N": "1"}]} |
SS | 문자열 세트 | 세트 | — (JSON 타입 없음) | {"SS": ["a", "b"]} |
NS | 숫자 세트 | 세트 | — | {"NS": ["1", "2"]} |
BS | 바이너리 세트 | 세트 | — | {"BS": ["ZA=="]} |
스칼라
S— 문자열(UTF-8, 문자 수가 아니라 바이트 길이로 크기가 계산됨).N— 숫자, 정밀도를 위해 문자열로 전송됨, 최대 38자리.B— 바이너리, base64로 인코딩되어 전송됨.BOOL—true/false.NULL— 명시적 null 마커.
문서
M— 맵(객체). 중첩된 속성은 각각 고유한 타입 태그를 유지합니다.L— 리스트. 요소는 타입이 섞일 수 있습니다.
{"profile": {"M": {"name": {"S": "Ada"}, "age": {"N": "37"}}}}세트
SS— 문자열 세트,NS— 숫자 세트,BS— 바이너리 세트.
세트는 순서가 없고, 동질적이며, 비어 있을 수 없습니다. 결정적으로 일반 JSON에는 세트 타입이 없습니다 — 배열은 SS/NS가 아니라 항상 리스트(L)로 왕복 변환됩니다. 이는 버그가 아니라 실제 변환 제약입니다. DynamoDB-JSON 변환기 안내를 참조하세요.
어떤 타입이 키가 될 수 있나요?
파티션 키와 정렬 키는 — 테이블과 모든 인덱스에서 — 스칼라여야 하며, S, N, B만 가능합니다. 불리언, 세트, 맵, 리스트로는 키를 만들 수 없습니다. 여러 값을 하나의 S로 이어 붙여 "복합" 키를 모델링하세요(예: ORDER#2026#42).
알아둘 만한 한도
- 항목은 400 KB가 최대입니다 — 중첩된 것을 포함해 모든 속성 이름과 값을 합한 값입니다.
- 숫자는 최대 38자리 정밀도를 가집니다(양수 또는 음수).
- 맵과 리스트는 최대 32단계 깊이로 중첩됩니다.
- 세트는 비어 있지 않고 동질적입니다 — 빈 세트도,
S와N을 섞는 것도 안 됩니다.
타입이 비용에 영향을 주는 이유
항목 크기는 속성 이름 바이트와 값 바이트의 합이며, 각 타입은 크기가 다르게 계산됩니다 — 숫자는 압축되고, 불리언과 null은 1바이트, 맵과 리스트는 요소당 오버헤드를 더합니다. 그 크기는 읽기/쓰기 용량 단위로 올림됩니다. 실제 항목은 항목 크기 계산기로 측정하세요.
DynoTable을 사용해 항목을 편집하는 동안 모든 속성의 타입과 실시간 바이트 수를 확인하고, 각 타입 태그를 대신 읽어 주는 SQL 워크벤치에서 타입이 지정된 속성 전반에 걸쳐 필터링하거나 집계해 보세요.