Amazon DynamoDB는 완전관리형 서버리스 NoSQL 데이터베이스다. 파티션 키 설계, 글로벌/로컬 보조 인덱스(GSI/LSI) 활용이 성능의 핵심이다.
키 설계
기본 키 유형:
1. 단순 기본 키: Partition Key만 (유일해야 함)
2. 복합 기본 키: Partition Key + Sort Key
파티션 키 설계 원칙:
- 높은 카디널리티: user_id, UUID 등
- 균등 분산: 특정 키로 집중 방지 (핫 파티션)
- 핫 파티션 대응: 키 샤딩 (user_id#0 ~ user_id#9)
단일 테이블 설계 패턴
python
import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('AppData')
# 단일 테이블 설계: 여러 엔티티를 하나의 테이블에
# PK SK 데이터
# USER#001 PROFILE {name, email}
# USER#001 ORDER#2024-01 {amount, status}
# USER#001 ORDER#2024-02 {amount, status}
# PRODUCT#A DETAIL {name, price}
# 사용자 주문 조회
response = table.query(
KeyConditionExpression=
Key('PK').eq('USER#001') &
Key('SK').begins_with('ORDER#')
)
# 삽입 (다양한 엔티티)
table.put_item(Item={
'PK': 'USER#001',
'SK': 'ORDER#2024-01-15',
'GSI1PK': 'STATUS#PENDING', # GSI용 키
'GSI1SK': '2024-01-15',
'amount': 99.99,
'status': 'PENDING'
})
GSI vs LSI 비교
| 항목 | GSI (글로벌 보조 인덱스) | LSI (로컬 보조 인덱스) |
|---|
| 파티션 키 | 별도 지정 가능 | 기본 테이블과 동일 |
| 정렬 키 | 자유롭게 지정 | 다른 속성 사용 가능 |
| 생성 시점 | 생성/이후 모두 | 테이블 생성 시만 |
| 용량 | 독립 처리량 | 테이블 공유 |
| 일관성 | 최종 일관성 | 강한 일관성 지원 |
python
# GSI 쿼리: 상태별 주문 조회 (다른 파티션 키)
response = table.query(
IndexName='GSI1',
KeyConditionExpression=
Key('GSI1PK').eq('STATUS#PENDING') &
Key('GSI1SK').between('2024-01-01', '2024-01-31')
)
DynamoDB Streams + Lambda 패턴
python
# 변경 이벤트 처리 (CDC)
def lambda_handler(event, context):
for record in event['Records']:
if record['eventName'] == 'INSERT':
new_item = record['dynamodb']['NewImage']
# 검색 인덱스 업데이트, 알림 발송 등
elif record['eventName'] == 'MODIFY':
old = record['dynamodb']['OldImage']
new = record['dynamodb']['NewImage']
# 변경 감지 처리
관련 문서