입문3분 분량

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)
SString스칼라string{"S": "Ada"}
NNumber스칼라number{"N": "37"}
BBinary스칼라Uint8Array / base64{"B": "ZGF0YQ=="}
BOOLBoolean스칼라boolean{"BOOL": true}
NULLNull스칼라null{"NULL": true}
MMap문서object{"M": {"k": {"S": "v"}}}
LList문서array{"L": [{"N": "1"}]}
SSString set세트— (JSON 타입 없음){"SS": ["a", "b"]}
NSNumber set세트{"NS": ["1", "2"]}
BSBinary set세트{"BS": ["ZA=="]}

스칼라

  • S — 문자열(UTF-8. 문자 수가 아니라 바이트 길이로 크기가 정해진다).
  • N — 숫자. 정밀도를 위해 문자열로 전송되며 최대 38자리다.
  • B — 바이너리. base64로 인코딩되어 전송된다.
  • BOOLtrue / 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단계 깊이까지 중첩된다.
  • 세트는 비어 있지 않고 동종이다 — 빈 세트도, SN을 섞는 것도 안 된다.

타입이 비용에 영향을 주는 이유

항목 크기는 속성 이름 바이트와 값 바이트의 합이며, 각 타입은 크기가 다르게 계산된다 — 숫자는 압축되고, 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를 직접 작성할 수 있는 유일한 방법이다.

숫자 세트와 문자열 세트를 가진 항목, 그리고 Plain-JSON / DynamoDB-JSON 토글을 보여 주는 DynoTable의 항목 편집기.
숫자 세트와 문자열 세트를 가진 항목, 그리고 Plain-JSON / DynamoDB-JSON 토글을 보여 주는 DynoTable의 항목 편집기.

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

업데이트됨