DynamoDB 데이터 타입
모든 DynamoDB 속성은 와이어 형식에서 한두 글자짜리 타입 코드로 태그가 붙는다. 타입이 값의 저장 방식과 항목 크기 계산 방식을 모두 좌우하기 때문에 이 집합을 아는 것이 중요하다.
DynamoDB는 어떤 데이터 타입을 지원하나?
DynamoDB는 세 가지 범주에 걸쳐 열 가지 데이터 타입을 지원한다. 스칼라는 String(S), Number(N), Binary(B), Boolean(BOOL), Null(NULL)이다. 문서는 다른 타입을 중첩하는 Map(M)과 List(L)다. 세트는 String Set(SS), Number Set(NS), Binary Set(BS)으로, 순서가 없고 동종이며 비어 있을 수 없다. 키가 될 수 있는 것은 S, N, B뿐이다.
| 코드 | 타입 | 범주 | JSON / JS 대응 | 예시 (DynamoDB-JSON) |
|---|---|---|---|---|
S | String | 스칼라 | string | {"S": "Ada"} |
N | Number | 스칼라 | number | {"N": "37"} |
B | Binary | 스칼라 | Uint8Array / base64 | {"B": "ZGF0YQ=="} |
BOOL | Boolean | 스칼라 | boolean | {"BOOL": true} |
NULL | Null | 스칼라 | null | {"NULL": true} |
M | Map | 문서 | object | {"M": {"k": {"S": "v"}}} |
L | List | 문서 | array | {"L": [{"N": "1"}]} |
SS | String set | 세트 | — (JSON 타입 없음) | {"SS": ["a", "b"]} |
NS | Number set | 세트 | — | {"NS": ["1", "2"]} |
BS | Binary set | 세트 | — | {"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만 가능하다. boolean, 세트, 맵, 리스트로는 키를 만들 수 없다. 값을
하나의 S로 이어 붙여(예: ORDER#2026#42) "복합" 키를 모델링한다.
알아둘 만한 한계
- 항목은 최대 400 KB — 모든 속성 이름과 값(중첩된 것 포함)을 합산한다.
- 숫자는 최대 38자리의 정밀도를 갖는다(양수 또는 음수).
- 맵과 리스트는 최대 32단계 깊이까지 중첩된다.
- 세트는 비어 있지 않고 동종이다 — 빈 세트도,
S와N을 섞는 것도 안 된다.
타입이 비용에 영향을 주는 이유
항목 크기는 속성 이름 바이트와 값 바이트의 합이며, 각 타입은 크기가 다르게 계산된다 — 숫자는 압축되고, boolean과 null은 1바이트이며, 맵과 리스트는 요소마다 오버헤드가 붙는다. 그 크기는 읽기/쓰기 용량 단위로 올림된다. 실제 항목의 크기는 항목 크기 계산기로 측정하자.
DynoTable에서 직접 해보기
위의 세트-대-리스트 구분은 도구들이 대개 감추는 부분이다. DynoTable의 항목 편집기는 형식 토글로 이를 명시적으로 드러낸다.
- Plain JSON — 원시값은 그대로 유지되지만(
"age": 30), 세트는 왕복 변환에서 살아남도록 타입 래퍼를 유지한다:"tags": { "SS": ["a", "b"] },"scores": { "NS": ["1.5", "2.5"] }. 일상적인 편집에 읽기 좋은 형식이다. - DynamoDB JSON — 표준 AWS 형식으로, 모든 값이 타입 태그를
가진다:
"age": { "N": "30" },"name": { "S": "alice" }.
둘 사이를 전환하면 각 스칼라, 문서, 세트 타입이 와이어에서 정확히 어떻게 표현되는지
볼 수 있다 — 그리고 세트 타입에는 일반 JSON 대응이 없으므로, 이 토글은 항목 전체를
손으로 마샬링하지 않고 SS/NS/BS를 직접 작성할 수 있는 유일한 방법이다.

항목을 편집하면서 모든 속성의 타입과 실시간 바이트 수를 확인하고 — SQL Workbench에서 타입이 있는 속성을 가로질러 필터링하거나 집계하려면 DynoTable을 사용해 보자. Workbench는 각 타입 태그를 대신 읽어 준다. 앱 없이 마샬링된 데이터를 변환하려면 DynamoDB-JSON 변환기가 브라우저에서 같은 왕복 변환을 수행한다.


