본문 바로가기
IT

DynamoDB 기본 개념 - 데이터 모델

by 힁구띠 2022. 6. 17.

1. DynamoDB의 데이터 모델

  • 테이블(Table): 아이템의 모음이다. 들어갈 수 있는 아이템의 개수는 제한이 없다. 테이블은 파티션 키(기본키)를 반드시 지정해야 한다. 리전당 생성할 수 있는 테이블 최대 개수는 256개이지만 AWS에 요청하여 더 늘릴 수 있다.
  • 아이템(Item): 아이템은 속성(Attribute) 들의 모음이다. 들어가는 속성의 개수는 제한이 없지만 아이템의 크기는 속성 이름과 값을 포함하여 64KB까지이다. 기본키로 필수 선택되고 필요에 따라 정렬 키를 설정하여 복합키로 활용된다.
  • 속성(Attribute): 속성은 Key-Value 방식이다. 키는 문자열이어야 한다.

데이터 형식은 아래와 같다.

  • 스칼라 데이터 형식(Scalar data types): 숫자(Number), 문자열(String), 바이너리(Binary)가 있다.
    • 숫자: 정수와 실수를 지원하며 실수는 소수점 이하 38자리, 10-128에서 10+126까지이다. 숫자는 0을 Trim 한다.
    • 0.5 ->. 5, 00500 -> 500
    • 문자열: UTF8 형식이며 대소를 비교할 때는 ASCII 코드를 기준으로 한다.
    • 바이너리: 바이너리 데이터는 BASE64 형식으로 인코딩하여 저장하면 된다. 대소를 비교할 때는 각 Byte를 부호 없는 정수로 취급한다.
  • 다중 값 형식(Multi-valued types): 스칼라 데이터 형식의 배열 형태이다. 숫자 세트, 문자열 세트, 바이너리 세트가 있다. 다중 값 형식에 들어가는 값은 중복될 수 없으며 값이 하나라도 들어가 있어야 한다. 값들은 정렬되거나 순서도 저장되지 않는다. 또한 다중 값 형식은 파티션 키로 활용할 수 없다.

DynamoDB에서 조회를 하려면 파티션 키로 인덱스를 생성해야 한다. 파티션 키는 테이블을 생성할 때 반드시 설정해야 한다.

  • 해시(Hash) 형식 파티션 키: 속성 하나를 기본 키로 사용한다. 기본 키의 값은 스칼라 데이터 형식만 가능하다. 조회 시 Equal( = ) 방식만 지원한다. 최대 크기는 2048 Byte이다.
  • 해시(Range) 형식 정렬 키: 속성 두 개를 기본 키로 사용한다. 복합 키라고 한다. 첫 번째 속성은 해시 기본 키로 사용되고 두 번째 속성은 범위 기본 키로 사용한다. Equal, <=, >=, Between 등 지원하며 1024 Byte가 최대 크기이다.

테이블 생성 시, 혹은 테이블 생성 후에 추가 인덱스가 필요하다면 보조 인덱스를 생성할 수 있다.

  • 로컬 인덱스(Local Index): 해시 키는 테이블 인덱스의 해시 파티션 키와 같고, 정렬 키만 다르게 설정하는 것이다. 테이블당 총 5개 이상만 생성할 수 있다. 로컬 인덱스는 테이블을 생성할 때 함께 생성해야 하며 테이블이 생성된 이후에는 추가, 수정, 삭제가 불가능하다. 그리고 로컬 인덱스는 테이블에서 해시 파티션 키와 정렬 키를 사용할 때만 생성할 수 있다. 파티션 크기 제한이 없다.
  • 글로벌 인덱스(Global Index): 파티션 키, 정렬 키 모두 먼저 설정한 테이블 인덱스와 다르게 설정한다. 정렬 키는 생략 가능하다. 20개 이상 생성할 수 없다. 10GB 이하여야 한다.

 

기본키 (파티션키 + 정렬키)와 인덱스 개념도

DynamoDB는 데이터를 읽을 때 Eventually Consistent Read와 Strongly Consistent Read를 사용할 수 있다.

  • Eventually Consistent Read(기본): 읽기 처리량을 최대화하지만 읽은 데이터가 최근 완료된 쓰기 결과를 반영하지 못했을 수도 있다. 쓰기가 데이터의 모든 복사본에 반영되는 것은 보통 1초 정도 내에서 수행이 된다. 최신 데이터를 얻기 위해서는 짧은 시간 내에 읽기를 반복해야 한다.
  • Strongly Consistent Read: 최근 완료된 쓰기 결과가 모두 반영된 데이터를 가져온다.

프로비저닝 된 처리량은 사용자가 원하는 수치를 지정하면 DynamoDB가 알아서 지정된 수치만큼 처리량을 제공해주는 것을 말한다.

  • 필요한 읽기 용량 유닛(Read Capacity Units): 초당 읽은 아이템 수 x KB 단위 아이템 크기(근사치 반올림) (Eventually Consistent Read를 사용하는 경우 초당 읽은 아이템 용량은 두 배가 된다)
  • 필요한 쓰기 용량 유닛(Write Capacity Units): 초당 쓴 아이템 수 x KB 단위 아이템 크기(근사치 반올림)
    • 512 Byte(1KB로 반올림됨)를 초당 200개 항목을 읽으면 혹은 쓰면, 1KB x 200 = 200 Unit
    • 1.5 KB(2KB로 반올림됨)를 초당 200개 항목을 읽으면 혹은 쓰면, 2KB x 200 = 400 Unit

Strongly Consistent Read는 1000 읽기 용량 Unit으로 1KB 아이템을 초당, 1000번 읽을 수 있으며 Eventually Consistent Read는 500 읽기 용량 Unit으로 1KB짜리 아이템을 1000번 읽을 수 있다.

읽기 용량의 Unit 수는 API 호출 수가 아닌 초당 읽은 아이템 수로 결정된다. 500 Unit을 읽는다면, 1KB 아이템을 GetItem으로 500번 호출하는 것과, BatchGetItem으로 아이템 10개씩 50번 호출하는 것은 동일하다.

 

Dynamo의 데이터 조회 방법은 두 가지이며, 한 번에 조회할 수 있는 용량은 1MB이다.

  • Query: 파티션 키와 정렬 키가 있다면 정렬 키까지 조건을 지정하여 원하는 데이터를 가져온다.
  • Scan: 조건 없이 모든 데이터를 조회한다.

댓글