AWS 공식 문서상에 적혀 있는 DynamoDB에 대해 개인적으로 공부하며 작성했던 노트입니다. 대부분 공식 문서 상의 내용을 제 입맛에 맞게 각색한 것으로, 공식 문서의 전체를 커버하고 있지는 않습니다. 다만 잊어버리지 않기 위한 용도로 생각해 주세요. 일부 내용(예: 리스트의 n번째 원소에 접근하기 위해 list[n]
과 같이 한다) 들은 빠져 있습니다.
a-z
A-Z
0-9
_
(underscore)-
(dash).
(dot)DynamoDB의 데이터 타입은 크게 3가지로 분류할 수 있습니다.
최대 38자리까지 지원합니다. 이 제한을 초과할 시 예외가 발생합니다. DynamoDB에서 숫자는 가변 길이로 표현되며 0으로 시작하거나 끝나면 0은 잘립니다. (정해진 표현 범위를 벗어나는 만큼 0으로 끝나면 잘린다는 뜻으로 받아들였습니다)
Number의 최대 범위는 1E-130 ~ 9.9999999999999999999999999999999999999E+125
이고,
최소 범위는 -9.9999999999999999999999999999999999999E+125 ~ -1E-130
입니다.
숫자형을 사용해 날짜 또는 타임스탬프를 표현할 수 있습니다. (예: 유닉스 시간)
문자열은 UTF-8 인코딩을 사용합니다. 문자열 길이는 0을 초과해야 하며, 다른 속성의 크기와 갯수에 따라 400KB의 최대 DynamoDB 항목 크기 제한으로 제약됩니다. 또한, 기본 키가 문자열이라면 다음과 같은 제약이 추가됩니다.
DynamoDB는 문자 코드 값의 크기로 문자열 비교를 수행합니다. "a"(0x61)
은 "A"(0x45)
보다 큽니다.
문자열을 이용해도 날짜 혹은 타임스탬프를 표현할 수 있습니다. (예: ISO 8601)
실행 파일이나 압축 파일, 이미지와 같은 모든 이진 데이터를 저장하기 위한 타입입니다. 비교시에는 각 바이트를 unsigned char
로 간주한 다음 대소를 비교합니다. 크기는 문자열과 마찬가지로 0 초과, 항목 내 다른 속성의 크기에 따라 최대 400KB 제약을 갖습니다.
바이너리를 기본 키로 사용하는 경우에도 문자열과 같이 파티션 키일 경우 2KB, 정렬 키일 경우 1KB 제약을 갖습니다.
애플리케이션 상에서 바이너리 데이터를 DynamoDB로 보내기 전에는 Base64로 인코딩해야 합니다.
either true
or false
(값)
unknown
or undefined
(개념)
문서 타입에는 List와 Map이 있습니다. 이 둘은 서로 중첩 가능하며, 32단계까지 중첩 가능합니다. 리스트와 맵 안의 값의 갯수는 제한이 없지만 400KB의 항목 크기 제한은 유념해야 할 것입니다.
속성 값에 빈 문자열이나 공집합은 허용되지 않지만, 빈 리스트나 빈 맵은 허용됩니다.
순서 있는 값들의 모음입니다. 대괄호[...]
로 묶습니다. JSON 배열과 유사합니다.
unordered K-V pair의 모음입니다. JSON 객체와 유사합니다.
숫자 집합, 문자열 집합, 이진수 집합을 지원합니다. 집합 내 모든 원소의 타입은 동일해야 합니다. 집합 내 값의 수에는 제한이 없지만, 400KB를 유념해야 합니다. 집합 내 원소들은 유일해야 합니다.
스트림은 테이블의 데이터 수정 이벤트를 캡처하는 선택적 기능입니다. 각 이벤트는 스트림 레코드에 나타납니다. 테이블에 스트림을 활성화하면 다음과 같은 이벤트 중 하나가 발생할 때마다 스트림 레코드가 기록됩니다.
각 스트림 레코드에는 테이블의 이름, 이벤트 타임스탬프와 같이 다른 메타데이터들도 포함되어 있습니다. 스트림 레코드는 24시간 TTL을 가지고 있습니다.
스트림과 Lambda를 이용하여 트리거를 만들 수도 있습니다. 고객 정보가 들어 있는 Customers 테이블이 있다고 할 때, 테이블에 스트림을 설정한 다음 람다 함수와 연결할 수 있기 때문입니다.
하나의 속성으로 구성되는 기본 키입니다. 해시 키 라고도 불립니다. DynamoDB가 내부적으로 Item을 저장할 파티션을 결정할 때 해시 함수에 파티션 키를 넣은 결과를 사용하기 때문입니다. 파티션 키 외, 다른 키가 없는 테이블에서는 어떤 Item도 동일한 파티션 키를 가질 수 없습니다. (아래 Partition Key & Sort Key 참조)
복합 기본 키는 두 개의 속성으로 구성됩니다. 첫 번째 속성은 파티션 키이고, 두 번째 속성은 정렬 키입니다. 파티션 키가 같은 항목들은 정렬 키 값을 기준으로 정렬되어 저장됩니다. 파티션 키와 정렬 키로 구성되어 있는 테이블에서는 두 개의 항목이 동일한 파티션 키 값을 가질 수 있지만, 두 아이템 간 정렬 키 값은 달라야 합니다. 정렬 키는 범위 키 로도 불립니다.
보조 인덱스는 기본 키에 대한 쿼리 뿐 아니라 대체 키를 사용하여 테이블의 데이터에 대한 쿼리를 할 수 있는 방법을 제공합니다. DynamoDB에서 제공하는 인덱스는 두 가지입니다:
GSI는 RDB에 비유하자면 뷰와 가깝습니다.
테이블당 각각 최대 5개의 보조 인덱스를 정의할 수 있습니다. LSI만 살펴보도록 하겠습니다.
동일한 키(해시 키) 값을 가지고 있는 항목들 사이의 정렬은 정렬 키(범위 키) 를 기준으로 해서 일어납니다. (여기서는 subject)
LSI는 대체 정렬 키를 말합니다. 즉, 테이블의 기본 정렬 키와 다릅니다.
위 그림에서, LastPostDateTime을 대체 정렬 키로 사용하였습니다.
모든 LSI는 다음 조건을 충족해야 합니다.
만약 웹 페이지를 ForumName이 S3인 모든 스레드와 각 스레드에 대한 답글 수의 리스트로 채우고, 최근 답글부터 시작하여 마지막 답글 날짜/시간을 기준으로 정렬하려는 경우를 가정해 봅시다. 그 목록에는 다음과 같은 속성들이 필요할 것입니다.
프로젝션이란 테이블에서 보조 인덱스로 복사되는 속성 집합을 의미합니다. 테이블의 파티션 키와 정렬 키는 항상 인덱스로 프로젝션되지만, 나머지 속성들은 사용자가 지정한 옵션에 따라 프로젝션 여부를 결정할 수 있습니다. 옵션에는 3가지가 있습니다:
KEYS_ONLY
: 파티션 키, 정렬 키, 인덱스 키 값으로만 구성된다.INCLUDE
: 키 외에 다른 속성을 지정하여 보조 인덱스에 추가한다.ALL
: 원본 테이블의 모든 속성이 추가된다. 이 프로젝션은 보조 인덱스의 크기를 최대화한다.위 글에서 사용된 이미지들의 원 저작자는 amazon이며, CC BY-SA 4.0에 의해 이를 명시합니다. 원 저작물의 출처는 다음과 같습니다:
dynamodb docs github link
Local secondary index 단락 첫 번째 이미지
Local secondary index 단락 두 번째 이미지
속성 프로젝션 단락 이미지