DynamoDB의 가장 기본적인 데이터 모델링 원칙인 Key-Value에 대해 알아보자.
Key-Value 데이터 저장소는 정보가 사전(dictionary) 또는 해시 테이블(hash table) 형태로 저장되는 데이터 저장 설계 방식이다.
◦ 키(key)는 데이터스토어 전체에서 고유하며 최적화된 인덱스 부분이다.
◦ 값(value)은 키를 보완하는 부분으로, 함께 키-값 쌍을 이룬다. 값은 'foobar'와 같은 단일 텍스트 문자열일 수도 있고, 서로 내포된 복잡한 데이터 타입(예: JSON 객체)을 포함하는 거대한 데이터 덩어리일 수도 있다.
◦ DynamoDB는 키-값 데이터스토어이므로, Key-Value 쌍을 조회하는 것이 가장 강력한 기능 중 하나이다.
◦ 모든 DynamoDB 테이블 항목(item)은 기본 키(primary key)를 고유 식별자로 가진다.
◦ 이 기본 키는 단일 파티션 키(partition key)로만 구성되거나, 파티션 키와 정렬 키(sort key)의 조합으로 구성될 수 있다.
◦ 여기서 기본 키는 '키'의 역할을 하며, 항목의 나머지 모든 속성들은 '값'의 역할을 한다.
Singleton operation(싱글톤 작업)은 단일 항목에 대해서만 작동하는 DynamoDB API를 의미한다. 각 Singleton operation은 정확히 0개 또는 1개의 항목에 대해서만 수행된다.
0개의 항목
: 작업 대상 항목이 존재하지 않을 경우를 포함한다. 예를 들어, DeleteItem API를 호출했는데 해당 기본 키 값을 가진 항목이 테이블에 없는 경우에도, 데이터에는 아무런 영향이 없지만 HTTP 200 상태 코드의 성공적인 응답이 반환된다.
1개의 항목: 작업 대상 항목이 존재하고, 해당 항목에 대해 삽입(PutItem), 업데이트(UpdateItem), 삭제(DeleteItem) 등의 작업이 수행될 경우이다.
주요 싱글톤 API는 다음과 같다:
이러한 싱글톤 작업은 항상 테이블 기본 키의 모든 값을 필요로 한다.
예를 들어, 기본 키가 파티션 키와 정렬 키로 구성된 테이블에 대해 작업할 경우, 두 키의 완전한 값을 모두 제공해야 단일 항목을 고유하게 식별하고 작업할 수 있다.
DynamoDB의 파티셔닝 로직은 Consistent Hashing을 통해 구현된다.
DynamoDB가 방대한 양의 데이터를 효율적으로 저장하고 검색할 수 있도록 하는 핵심적인 메커니즘이다.
Scalar Types: 단일 값을 나타내는 데이터 유형
테이블의 파티션 키나 정렬 키, 보조 인덱스의 키로 지정할 수 있는 데이터 타입은 스칼라 타입뿐.
Document Types: could be complex and nested and may contain multiple other same or distinct data types within, such as what you may find in JSON objects.
자주 수정하지 않는 정적인 데이터에 적합.
1) 언제 Map/List 써도 되는가?
"address": { "street": "123 Main St", "city": "Seoul", "postalCode": "12345" }➡ 주소를 하나의 맵으로 묶는 게 자연스러움.
2) 언제 안 쓰는 게 좋은가?
"tags": ["tag1", "tag2", "tag3"]➡ DynamoDB에서 리스트 내부를 자유롭게 쿼리하거나 필터링하기 어렵기 때문에, 차라리
"tag1#tag2#tag3"같은 문자열이나, 별도 아이템으로 분리하는 게 더 효율적일 수 있음.
Set Types: 동일한 유형의 Scalar Element를 포함
처리량(Throughput): DynamoDB는 provisioned mode와 on-demand mode의 두 가지 용량 모드를 지원한다. 기본적으로 AWS 계정-리전 수준에서 초당 80,000 읽기/쓰기, 테이블당 초당 40,000 읽기/쓰기 제한이 있으며, AWS Support를 통해 조정 가능하다.
항목 크기(Item sizes): 개별 항목의 크기는 최대 400KB로 제한된다. 400KB를 초과하는 데이터는 의미 있는 방식으로 여러 개의 작은 청크로 분해하거나, 페이로드를 압축하거나, Amazon S3와 같은 객체 저장소로 오프로드하고 DynamoDB에서 객체 경로를 참조하는 등의 설계 패턴을 사용해야 한다.
예약어(Reserved words): DynamoDB는 대소문자를 구분하지 않는 예약어 목록을 가지고 있다.
For example, YEAR is one of the reserved words in that list. Thus, to read an item where the partition key attribute name is year (case-insensitive), I will need to use a placeholder such as #year_placeholder for it in my KeyConditionExpression and pass the actual name within the ExpressionAttributeNames parameter.
페이지 크기(Page sizes): Query/Scan 또는 PartiQL ExecuteStatement와 같은 다중 항목 읽기 작업은 단일 API 호출로 최대 1MB의 항목을 반환할 수 있다. 1MB를 초과하는 결과는 LastEvaluatedKey와 같은 페이지네이션 토큰을 통해 가져올 수 있다.