DynamoDB
contents
1. DynamoDB란 무엇인가?
DynamoDB는 AWS에서 제공하는 완전 관리형 서버리스 NoSQL 데이터베이스입니다.
- 유형: Key-Value 및 Document 스토어.
- 핵심 철학: "어떤 규모에서든 일관된 한 자릿수 밀리초(ms) 지연 시간 보장."
- No Operations (운영 불필요): Cassandra(노드/클러스터를 직접 관리해야 함)와 달리, DynamoDB는 순수 서버리스입니다. 테이블만 생성하면 AWS가 뒤에서 하드웨어 프로비저닝, 패치, 확장을 알아서 처리합니다.
2. 핵심 구성 요소
- Table: 데이터의 집합 (예:
Users). - Item: 테이블 내의 하나의 행(Row). (SQL과 달리 각 아이템은 서로 다른 속성을 가질 수 있습니다.)
- Attribute: 데이터 필드 (예:
email,age). - Schema-less (스키마리스): Primary Key(기본 키) 만 처음에 정의하면 됩니다. 나머지 속성(컬럼)은 나중에 자유롭게 추가할 수 있습니다.
3. Primary Key (가장 중요한 결정)
DynamoDB에서는 Primary Key(PK)를 어떻게 정의하느냐에 따라 쿼리 할 수 있는 방식이 완전히 결정됩니다. 두 가지 유형이 있습니다.
A. 파티션 키 (단일 기본 키)
- 구조: 하나의 속성만 사용 (예:
UserId). - 동작: DynamoDB는 이 키에 해시 함수를 적용하여 데이터를 어떤 물리적 파티션(서버)에 저장할지 결정합니다.
- 제약: 이 키를 가진 아이템은 하나만 존재할 수 있습니다.
- 쿼리: 정확한 ID를 입력해야만 데이터를 찾을 수 있습니다. (
UserId = '123').
B. 파티션 키 + 정렬 키 (복합 기본 키)
- 구조: 두 개의 속성을 사용.
- Partition Key (파티션 키): (예:
Artist). 분산 저장용. - Sort Key (정렬 키): (예:
SongTitle). 해당 파티션 내에서 정렬용.
- Partition Key (파티션 키): (예:
- 제약: (파티션 키 + 정렬 키)의 조합이 유일해야 합니다. 같은 Artist의 노래를 여러 개 저장할 수 있습니다.
- 쿼리: Artist로 검색하고, SongTitle로 범위 검색(Range Query)을 할 수 있습니다 (예: "Taylor Swift의 노래 중 'L'로 시작하는 곡").
4. 보조 인덱스 (쿼리의 유연성)
기본적으로는 Primary Key로만 효율적인 조회가 가능합니다. 다른 컬럼(예: Email)으로 조회하려면 보조 인덱스가 필요합니다.
A. 로컬 보조 인덱스 (LSI)
- 제약: 반드시 테이블을 생성할 때 함께 생성해야 합니다. 나중에 추가할 수 없습니다.
- 구조: 원본 테이블과 동일한 파티션 키를 쓰지만, 다른 정렬 키를 가집니다.
- 범위: 쿼리는 단일 파티션 내로 제한됩니다.
B. 글로벌 보조 인덱스 (GSI)
- 유연성: 언제든지 생성할 수 있습니다.
- 구조: 원본과 완전히 다른 파티션 키와 정렬 키를 가질 수 있습니다.
- 동작: 새로운 키 구조를 가진 "그림자 테이블"을 별도로 생성하여 데이터를 복제합니다.
- 비용: GSI를 위한 스토리지와 쓰기 용량 비용을 별도로 지불해야 합니다.
5. 용량 모드 (요금 및 성능)
A. 온디맨드 모드 (On-Demand)
- 방식: 쓴 만큼만(요청 건당) 돈을 냅니다.
- 추천: 트래픽을 예측할 수 없거나, 스타트업, 새로운 애플리케이션.
- 장점: 계획 불필요. 즉각적인 오토 스케일링.
B. 프로비저닝 모드 (Provisioned)
- 방식: "초당 읽기 500회, 쓰기 100회(RCU/WCU)가 필요해"라고 미리 설정합니다.
- 추천: 꾸준하고 예측 가능한 트래픽 (예: 매일 사용량이 일정한 인기 앱).
- 장점: 부하를 정확히 예측할 수 있다면 훨씬 저렴합니다.
6. 일관성 모델
DynamoDB는 내구성을 위해 데이터를 3개의 가용 영역(AZ)에 복제합니다.
- 최종 일관성 (Eventually Consistent - 기본값):
- 가장 빠르고 저렴 (0.5 RCU).
- 위험: 쓰기 직후에 바로 읽으면, 아직 3개 존에 전파되지 않아서 과거 데이터를 읽을 수도 있습니다.
- 강력한 일관성 (Strongly Consistent):
- 느리고 비쌈 (1.0 RCU).
- 보장: 항상 최신 데이터를 읽습니다.
7. 고급 기능
- DynamoDB Streams:
- 데이터 변경 사항(수정 내역)을 시간 순서대로 캡처합니다.
- 활용: 새 유저가 추가될 때마다 AWS Lambda 함수를 트리거하여 환영 이메일을 발송.
- TTL (Time To Live):
- 특정 시간이 지나면 아이템을 자동으로 삭제합니다 (예: 세션 토큰, 임시 로그). 비용은 무료입니다.
- DAX (DynamoDB Accelerator):
- DynamoDB를 위한 완전 관리형 인메모리 캐시입니다.
- 이점: 응답 시간을 밀리초에서 마이크로초 단위로 줄여줍니다.
- Global Tables:
- 멀티 리전, 멀티 액티브 복제입니다.
- 미국 동부(US-East)에 쓰고, 유럽 서부(Europe-West)에서 즉시 읽을 수 있습니다.
8. 싱글 테이블 디자인 (Single Table Design)
SQL에서는 데이터를 정규화(User 테이블, Order 테이블 분리)합니다.
DynamoDB 고급 사용자는 극강의 조회 속도를 위해 모든 엔티티를 하나의 테이블에 때려 넣습니다.
- 개념:
PK,SK같은 일반적인 이름을 키로 사용합니다. - 예시:
- 유저 행:
PK="USER#123",SK="PROFILE" - 주문 행:
PK="USER#123",SK="ORDER#999"
- 유저 행:
- 이점: 단 한 번의 요청(
PK="USER#123"조회)으로 유저 프로필과 최근 주문 내역을 동시에 가져올 수 있습니다.
references