DynamoDB 개념정리

HubCodes·2020년 2월 22일
1

AWS 공식 문서상에 적혀 있는 DynamoDB에 대해 개인적으로 공부하며 작성했던 노트입니다. 대부분 공식 문서 상의 내용을 제 입맛에 맞게 각색한 것으로, 공식 문서의 전체를 커버하고 있지는 않습니다. 다만 잊어버리지 않기 위한 용도로 생각해 주세요. 일부 내용(예: 리스트의 n번째 원소에 접근하기 위해 list[n] 과 같이 한다) 들은 빠져 있습니다.

Naming rules & Data types

Naming rules

  • 모든 이름은 UTF-8 인코딩이어야 하며, 대소문자를 구별한다.
  • 테이블 이름 및 인덱스 이름은 3자 이상, 255자 이하로 이루어져야 한다.
  • 테이블 이름 및 인덱스 이름은 다음 문자만 포함할 수 있다.
    • a-z
    • A-Z
    • 0-9
    • _ (underscore)
    • - (dash)
    • .(dot)
  • 속성 이름은 1자 이상, 255자 이하이다.

Reserved words

참조

Data types

DynamoDB의 데이터 타입은 크게 3가지로 분류할 수 있습니다.

  • Scalar type : 하나의 값만 표현합니다. 숫자, 문자열, Binary, Boolean, null
  • Document type : 트리 형태로 표현 가능한 중첩된 구조
  • Set type : 집합 (포함된 항목들은 고유해야 한다)

1. Scalar types

Number

최대 38자리까지 지원합니다. 이 제한을 초과할 시 예외가 발생합니다. DynamoDB에서 숫자는 가변 길이로 표현되며 0으로 시작하거나 끝나면 0은 잘립니다. (정해진 표현 범위를 벗어나는 만큼 0으로 끝나면 잘린다는 뜻으로 받아들였습니다)

Number의 최대 범위는 1E-130 ~ 9.9999999999999999999999999999999999999E+125 이고,
최소 범위는 -9.9999999999999999999999999999999999999E+125 ~ -1E-130 입니다.

숫자형을 사용해 날짜 또는 타임스탬프를 표현할 수 있습니다. (예: 유닉스 시간)

String

문자열은 UTF-8 인코딩을 사용합니다. 문자열 길이는 0을 초과해야 하며, 다른 속성의 크기와 갯수에 따라 400KB의 최대 DynamoDB 항목 크기 제한으로 제약됩니다. 또한, 기본 키가 문자열이라면 다음과 같은 제약이 추가됩니다.

  • 파티션 키의 최대 길이는 2KB
  • 정렬 키의 최대 길이는 1KB

DynamoDB는 문자 코드 값의 크기로 문자열 비교를 수행합니다. "a"(0x61)"A"(0x45)보다 큽니다.

문자열을 이용해도 날짜 혹은 타임스탬프를 표현할 수 있습니다. (예: ISO 8601)

Binary

실행 파일이나 압축 파일, 이미지와 같은 모든 이진 데이터를 저장하기 위한 타입입니다. 비교시에는 각 바이트를 unsigned char 로 간주한 다음 대소를 비교합니다. 크기는 문자열과 마찬가지로 0 초과, 항목 내 다른 속성의 크기에 따라 최대 400KB 제약을 갖습니다.

바이너리를 기본 키로 사용하는 경우에도 문자열과 같이 파티션 키일 경우 2KB, 정렬 키일 경우 1KB 제약을 갖습니다.

애플리케이션 상에서 바이너리 데이터를 DynamoDB로 보내기 전에는 Base64로 인코딩해야 합니다.

Boolean

either true or false (값)

Null

unknown or undefined (개념)

2. Document types

문서 타입에는 List와 Map이 있습니다. 이 둘은 서로 중첩 가능하며, 32단계까지 중첩 가능합니다. 리스트와 맵 안의 값의 갯수는 제한이 없지만 400KB의 항목 크기 제한은 유념해야 할 것입니다.

속성 값에 빈 문자열이나 공집합은 허용되지 않지만, 빈 리스트나 빈 맵은 허용됩니다.

List

순서 있는 값들의 모음입니다. 대괄호[...] 로 묶습니다. JSON 배열과 유사합니다.

Map

unordered K-V pair의 모음입니다. JSON 객체와 유사합니다.

3. Set types

숫자 집합, 문자열 집합, 이진수 집합을 지원합니다. 집합 내 모든 원소의 타입은 동일해야 합니다. 집합 내 값의 수에는 제한이 없지만, 400KB를 유념해야 합니다. 집합 내 원소들은 유일해야 합니다.

DynamoDB Stream

스트림은 테이블의 데이터 수정 이벤트를 캡처하는 선택적 기능입니다. 각 이벤트는 스트림 레코드에 나타납니다. 테이블에 스트림을 활성화하면 다음과 같은 이벤트 중 하나가 발생할 때마다 스트림 레코드가 기록됩니다.

  • 테이블에 새로운 항목이 추가될 경우 모든 속성을 포함하여 캡처
  • 항목이 업데이트되면 수정 이전의 인스턴스, 수정 이후의 인스턴스 캡처
  • 항목이 삭제되면 삭제 직전에 전체 항목 캡처

각 스트림 레코드에는 테이블의 이름, 이벤트 타임스탬프와 같이 다른 메타데이터들도 포함되어 있습니다. 스트림 레코드는 24시간 TTL을 가지고 있습니다.

스트림과 Lambda를 이용하여 트리거를 만들 수도 있습니다. 고객 정보가 들어 있는 Customers 테이블이 있다고 할 때, 테이블에 스트림을 설정한 다음 람다 함수와 연결할 수 있기 때문입니다.

Key

Partition Key

하나의 속성으로 구성되는 기본 키입니다. 해시 키 라고도 불립니다. DynamoDB가 내부적으로 Item을 저장할 파티션을 결정할 때 해시 함수에 파티션 키를 넣은 결과를 사용하기 때문입니다. 파티션 키 외, 다른 키가 없는 테이블에서는 어떤 Item도 동일한 파티션 키를 가질 수 없습니다. (아래 Partition Key & Sort Key 참조)

Partition Key & Sort Key

복합 기본 키는 두 개의 속성으로 구성됩니다. 첫 번째 속성은 파티션 키이고, 두 번째 속성은 정렬 키입니다. 파티션 키가 같은 항목들은 정렬 키 값을 기준으로 정렬되어 저장됩니다. 파티션 키와 정렬 키로 구성되어 있는 테이블에서는 두 개의 항목이 동일한 파티션 키 값을 가질 수 있지만, 두 아이템 간 정렬 키 값은 달라야 합니다. 정렬 키는 범위 키 로도 불립니다.

Secondary Index

보조 인덱스는 기본 키에 대한 쿼리 뿐 아니라 대체 키를 사용하여 테이블의 데이터에 대한 쿼리를 할 수 있는 방법을 제공합니다. DynamoDB에서 제공하는 인덱스는 두 가지입니다:

  • GSI : 파티션 키 및 정렬 키가 테이블의 파티션 키 및 정렬 키와 다를 수 있다.
  • LSI : 테이블과 파티션 키는 동일하지만 정렬 키가 다르다.

GSI는 RDB에 비유하자면 와 가깝습니다.

테이블당 각각 최대 5개의 보조 인덱스를 정의할 수 있습니다. LSI만 살펴보도록 하겠습니다.

LSI (Local secondary index)

동일한 키(해시 키) 값을 가지고 있는 항목들 사이의 정렬은 정렬 키(범위 키) 를 기준으로 해서 일어납니다. (여기서는 subject)

LSI대체 정렬 키를 말합니다. 즉, 테이블의 기본 정렬 키와 다릅니다.

위 그림에서, LastPostDateTime을 대체 정렬 키로 사용하였습니다.

모든 LSI는 다음 조건을 충족해야 합니다.

  • 파티션 키는 기본 테이블의 키와 동일하다.
  • 정렬 키는 하나의 원자값 속성으로 이루어진다.
  • 기본 테이블의 정렬 키가 인덱스로 프로젝션되며, 이 인덱스는 키가 아닌 속성이다.
속성 프로젝션

만약 웹 페이지를 ForumName이 S3인 모든 스레드와 각 스레드에 대한 답글 수의 리스트로 채우고, 최근 답글부터 시작하여 마지막 답글 날짜/시간을 기준으로 정렬하려는 경우를 가정해 봅시다. 그 목록에는 다음과 같은 속성들이 필요할 것입니다.

  • Subject
  • Replies
  • LastPostDateTime

프로젝션이란 테이블에서 보조 인덱스로 복사되는 속성 집합을 의미합니다. 테이블의 파티션 키와 정렬 키는 항상 인덱스로 프로젝션되지만, 나머지 속성들은 사용자가 지정한 옵션에 따라 프로젝션 여부를 결정할 수 있습니다. 옵션에는 3가지가 있습니다:

  • KEYS_ONLY : 파티션 키, 정렬 키, 인덱스 키 값으로만 구성된다.
  • INCLUDE : 키 외에 다른 속성을 지정하여 보조 인덱스에 추가한다.
  • ALL : 원본 테이블의 모든 속성이 추가된다. 이 프로젝션은 보조 인덱스의 크기를 최대화한다.

위 글에서 사용된 이미지들의 원 저작자는 amazon이며, CC BY-SA 4.0에 의해 이를 명시합니다. 원 저작물의 출처는 다음과 같습니다:
dynamodb docs github link
Local secondary index 단락 첫 번째 이미지
Local secondary index 단락 두 번째 이미지
속성 프로젝션 단락 이미지

profile
양질의 기술 컨텐츠를 만들고 싶습니다

0개의 댓글