프로그래밍/Amazon

Dynamo DB 공식 문서 정리 1편 - 핵심 구성 요소

Jay Tech 2020. 4. 18. 22:46

AWS에서 사용할 수 있는 Dynamo DB 에 대한 내용 정리 1편 핵심 구성 요소 입니다. 필요한 내용을들을 선별 하여 정리하였습니다.

핵심 구성 요소 (Core Components)

다이나모 디비에서 테이블, 항목 및 속성은 핵심 구성요소입니다. 테이블은 항목의 집합이고 각 항목은 속성의 집합입니다. 다이나모 디비는 primary key를 이용하여 각 항목을 고유하게 식별하고 보조 인덱스를 이용하여 유연하게 쿼리를 만들수 있게 해줍니다.

테이블 (Table)

테이블은 여타 데이터베이스와 마찬가지로 생각하면 됩니다.

항목 (Items)

항목은 모든 다른 항목들 중에서 고유하게 식별할 수 있는 속성들의 집합입니다. 다이나모 디비에서는 테이블에 저장하는 항목의 수의 제한이 없습니다.

속성 (Attributes)

각 항목은 하나 이상의 속성으로 구성됩니다. 예를들어 People 테이블 항목에는 사람의 id, 이름 등이 속성으로 될 수 있습니다.

공식 문서에서는 테이블 예시로 설명을 합니다. 조금 더 간편하게 알아볼 수 있도록 RDB와 다른 내용을 중점적으로 정리하였습니다. 가장 큰 차이점은 정해진 스키마가 없다는 점입니다. 예시를 볼까요.

 

People 이라는 테이블입니다.

 

Person 테이블

 

Person이라는 테이블에는 여러 속성들이 있습니다. 테이블에는 Primary Key (=기본키) 가 있습니다. 바로 PersonId 죠. 이 기본키를 제외하고는 People 에는 스키마가 없습니다. 위의 항목은 Adress에서 끝인데 밑의 항목은 FavoriteColor 라는 속성도 있는 것을 알 수 있습니다.

대부분의 속성은 scalar(스칼라) 입니다. 이는 문자열 혹은 숫자같이 하나의 값만 가질 수 있다는 겁니다. 그리고 내포속성을 가집니다. 내포속성이란 Address라는 속성처럼 depth를 가지고 있는 속성을 의미합니다. 다이나모 디비는 32 depth 까지 지원합니다.

 

다음 스키마는 Music 이라는 스키마입니다.

 

Music 테이블

 

굵게 볼드 처리되어 있는 속성은 Artist와 SontTitle 입니다. Music 테이블의 기본 키는 이 두개의 속성입니다. 이 기본키만 제외하면 다른 속성들은 정의할 필요가 없습니다.

이 키에 대해서 조금 더 알아볼까요.

기본 키

다이나모는 기본적으로 두 가지 키를 지원합니다. 바로 파티션 키와 정렬키입니다.

 

Partition Key (파티션키) 는 해시 키 라고도 할 수 있습니다. 즉 어떤 테이블이 파티션 키로만 구성되어 있다면 모든 항목은 이 파티션 키 하나만으로 식별할 수 있습니다. 위에서 설명한 Person 테이블 처럼 말이죠. PersonId로 모든 항목을 식별가능합니다. 해시 키라고도 부른는 이유는 다이나모 디비가 내부적으로 해시함수를 사용하기 때문입니다.

 

Sort Key (정렬키) 라는 것도 있습니다. 위에서 설명한 Music 테이블에서 SongTitle이 정렬키 입니다. 즉 Artists는 한명인데 노래가 여러개 인거죠. 파티션키와 정렬키로 구성된 테이블은 파티션키와 정렬키를 입력하면 원하는 항목에 바로 액세스 가능합니다. 이 파티션 키 + 정렬키를 합쳐서 복합 기본키라고 부릅니다. 이 복합 기본키로 쿼리를 더 유연하게 작성할 수 있습니다. 즉 작곡가명과 노래의 범위를 줘서 노래의 일부를 검색한다는지 하는 경우가 있을 수 있습니다.

보조 인덱스

테이블에서 기본 키에 대한 쿼리 뿐만 아니라 대체 키를 통해서 테이블의 데이터 쿼리를 할 수 있습니다.

  • Global Secondary Index: 기본 키 (파티션 키 + 정렬 키) 가 테이블의 기본 키와 다를 수 있는 경우
  • Local Secondary Index: 테이블과 파티션 키는 동일하지만 정렬키는 다른 인덱스

참고로 다이나모 디비는 테이블당 20개의 글로벌 보조 인덱스 5개의 로컬 보조 인덱스의 제한이 있습니다.

 

 

Music 이라는 테이블에 현재는 기본 키가 Artist와 SongTitle 입니다. 하지만 쿼리를 Genre로 주고 싶습니다.

 

 

이런식으로 보조 인덱스를 생성하여 사용할 수 있습니다. 이 인덱스 에서는 Genere는 파티션 키이고 AlbumTitle은 정렬키 입니다.

다이나모 디비 API (DynamoDB API)

다이나모 디비를 빠르게 이해하기 위해서는 다이나모 디비가 어떤 것들을 지원해주는지 알아야 합니다.

CRUD

기본적으로 다이나모 디비에 CRUD 작업이 어떻게 되는지 살펴봅시다. (Update, Delete는 생략합니다)

 

Create

  • PutItem: 테이블에 단일 항목을 씁니다. 최소 조건은 기본 키입니다. 기본키만 명시하면 다른 속성들은 쓰지않아도 됩니다. 즉 기본키만 명시하면 됩니다.
  • BatchWriteItem: 테이블에 최대 25개의 항목을 쓸 수 있습니다. 많은 양을 쓸 때 PutItem 개별 호출보다는 한방에 써서 네트워크 왕복을 한 번만 하게 끔 만드는 것이 더 효율적입니다. 하나 이상의 테이블에서 여러 항목을 삭제하는 경우에도 이것을 사용할 수 있습니다.

Read

  • GetItem: 테이블에서 단일 항목을 가져옵니다. 기본키를 지정해서 읽어올 수 있습니다. 전체 또는 일부가 반환됩니다.
  • BatchGetItem: 하나 이상의 테이블에서 최대 100개의 항목을 가져옵니다.
  • Query: 특정 파티션 키가 있는 모든 항목을 가져옵니다. 추가적으로 위에서 설명한 정렬키를 추가해서 조회가 가능합니다.
  • Scan: 지정한 테이블 또는 인덱스의 모든 항목을 가져옵니다. 전체 항목 또는 속성 일부만 가져옵니다. 쿼리와의 차이는 키가 없이도 조회 가능하지만 모든 테이블을 스캔해야 하는 단점이 있습니다.
  • (쿼리와 스캔의 자세한 차이는 추후 추가 정리 예정입니다)

읽기 일관성 (Read Consistency)

(참고로 리전에 따라 테이블 이름이 같더라도 다르게 인식됩니다.)

 

  • Eventually Consistent Reads (최종적 일관된 읽기): 다이나모 테이블을 읽을 때 응답은 최근의 쓰기 작업이 반영이 되어 있지 않을 수도 있습니다. 하지만 계속 읽기 요청을 반복하면 최신 데이터가 반영된 응답을 받게 됩니다.
  • Strongly Consistent Reads (강력한 일관된 읽기): 다이나모 테이블을 읽을 때 이전 쓰기 작업을 항상 반영합니다. 하지만 네트워크 지연이나 중단이 발생한 경우 500에러를 던질 수 있습니다. 위의 최종적 일관된 읽기 보다 시간이 좀 더 걸릴 수 있습니다.

보통 1초 이내에 모든 스토리지 위치의 데이터가 일관성을 갖게 됩니다. 참고로 디폴트는 최종적 일관된 읽기입니다. 다이나모에서 제공하는 읽기 작업에는 ConsistentRead 라는 파리미터를 제공하는데 이걸 true 로 하면 강력한 일관된 읽기를 사용합니다. (자세한 요금 정책은 공식 문서를 참고하세요)

읽기/쓰기 요금제 (Read/Write Capacity Mode)

On Demand Mode (온디맨드 모드)

온 디맨드 모드는 용량 제한없이 쓴만큼 내는 요금입니다. 애플리케이션 트래픽이 예측 불가할 때 사용합니다. 아주 간략히 이야기하면 이전 피크 트래픽의 최대 2배용량을 수용합니다. 즉 이전에 초당 5만회가 발생한 경우 초당 최대 10만회 까지 수용할 수 있습니다. (이 모드를 쓴다면 자세한 내용은 공식 문서를 참고하세요)

Provisioning Mode (프로비저닝 모드)

프로비저닝 모드는 애플리케이션에서 사용하는 초당 읽기/쓰기 횟수를 지정합니다. 애플리케이션 트래픽이 예측 가능할 때 사용합니다.

 

출처: https://docs.aws.amazon.com/dynamodb/index.html