DB

[DynamoDB] DynamoDB의 구성 요소들(key, index)

폭풍저그김탁구 2022. 1. 14. 14:51

MySql을 쓰다가, DynamoDB로 넘어오게 되었다. 지금까지 써본 DB라고는 RDBMS가 전부였으니 이런 NoSql의 개념이 너무나도 어려웠었다. 특히 정보가 적은 DynamoDB는 더더욱 그랬다. 만약 내가 AWS를 쓰고 있지 않았다면 얘를 쓸 일은 없었을듯 하다...ㅋㅋㅋ

 

스키마, 칼럼으로 이뤄진 RDBMS를 사용하다, key-value라는 형태를 가진 DynamoDB를 마주하게 되면 자꾸 RDBMS의 개념을 다이나모에 대입하게 된다. 처음엔 key가 칼럼명이고, value는 그 값이라고 생각했는데 오히려 그러니 이해가 더더욱 안 되었다.

 


[DynamoDB의 구성]

 

다이나모도 역시 테이블로 구성이 되어있다. 스키마가 없는 테이블. RDBMS의 한 row를 다이나모에서는 item이라고 보면 된다. 

 

 


 

 

* 파티션키(Partition Key)와 정렬키(Sort Key)

 

스키마가 없지만 기본 키는 있다. 그게 바로 파티션키와 정렬키이다. 이들은 테이블 생성 시 만들어야 하는 key이며, 전자는 필수, 후자는 선택적이다.

 

'다이나모는 내부 해시 함수에 대한 입력으로 파티션을 나눈다' 가 공식 문서의 설명인데, 무슨 소리인지는 모르겠다. 그냥 해시를 쓰고, 파티션을 나눈다 정도로 이해했다. 거기서 필요한 것이 이 '파티션키'이다.

 

그럼 파티션을 나눈 후엔, 어떤 방법으로 데이터를 정렬할까? 이름에서 알다 싶이, 정렬 키로 정렬한다.

쉽게 말해 파티션키는 대분류, 정렬키는 소분류 정도로 생각하면 좋을듯 하다.

 

파티션키는 =(equal)검색만 가능하고, 정렬키는 간단한 연산자를 사용한 쿼리까지 가능하다.

 

 


 

 

* 글로벌 보조 인덱스(GSI)

그럼 기본키 말고는 쿼리가 불가능할까? 이때 사용하는 것이 이 보조 인덱스이다. MySql의 join, 외래키, 임시 테이블 등의 역할을 얘가 해주는 것이다.

 

글로벌 보조 인덱스 외에, 로컬 보조 인덱스도 있다. 둘의 차이는

  • 글로벌 보조 인덱스 - 파티션 키 및 정렬 키가 테이블과 다를 수 있는 인덱스입니다.
  • 로컬 보조 인덱스 - 기본 테이블과 파티션 키는 동일하지만 정렬 키가 다른 인덱스입니다.

라고 공식 문서에서 말해주고 있다. 로컬과 같은 파티션을 쓰면 로컬 보조 인덱스, 아예 다르면 글로벌 보조 인덱스라는 뜻이다. 나는 복잡한 쿼리는 작성하지 않아서 로컬은 거의 사용하지 않았는데, 쿼리 성능을 위해서라면 로컬도 잘 써야할 것 같다.

 

GSI란 그래서 어떨 때 사용하는 걸까? 공식문서의 예제가 아주 이해가 잘 되게 만들어져서, 그걸 사용해보겠다.

 

예를 들어

이런 테이블이 있다. 파티션키는 UserId, 정렬키는 GameTitle이다.

 

여기서 나는 게임(GameTitle)마다의 유저 순위를 알고 싶다.

만약 인덱스를 사용하지 않는다면 Scan을 해야 한다(파티션 키를 사용하지 않으므로)(Scan은 말그대로 전 항목을 검색하는 것인데, 매우 비효율적이라 최대한 지양해야 한다)

 

그럼 GameTitle이 파티션 키이면 금방 찾을 수 있지 않은가? 맞다. 이때 GSI를 쓴다. 아래처럼 말이다.

파티션키가 GameTitle이고, 정렬키가 TopScore인 GSI

 

여기서 원래 테이블의 기본키 속성은 언제나 인덱스로 프로젝션(...?)되므로 함께 표시된다.

 

하지만 보조 인덱스로는 쿼리 검색만 가능하고, 수정은 안 된다. 보조 인덱스로 검색 -> 파티션키 찾아서 -> 그 파티션키로 업데이트 의 루트를 지내야 한다.

 

 


 

열심히 써놨지만, AWS 공부는 역시 공식 문서가 답이다... 공식 문서 보다 보면 이 불친절함과 답답함에 한글 블로그를 헤매게 되는데, 결국 다시 독스로 돌아온다.

불친절함과 자세함 사이 그 어딘가... 공식문서를 꼭 잘 읽어보자! 당신이 블로그에서 찾을 수 있는 글 모두 여기에 있다. 

 

https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Introduction.html

 

Amazon DynamoDB란? - Amazon DynamoDB

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

많은 도움이 된 블로그 글

- 파티션 키, 정렬 키

https://pearlluck.tistory.com/528

 

[DynamoDB] DynamoDB란? 파티션키와 정렬키

DynamoDB란? 완전관리형 NoSQL기반 데이터베이스 서비스. Key-Value형태를 제공하며 스키마가 따로 정해져 있지 않음. 장점 JSON형태로 데이터를 저장하고, 수평확장(Scale-out)이 쉽고 유연하다. 질의 속

pearlluck.tistory.com

 

- 보조 인덱스

https://velog.io/@hanseul/AWS-DynamoDB-%EC%82%AC%EC%9A%A9%EA%B8%B0

 

AWS DynamoDB 사용기_보조 인덱스 사용 위주로

AWS DynamoDB의 보조 인덱스 사용법

velog.io