-
Notifications
You must be signed in to change notification settings - Fork 0
DDB 페이징하는 법 정리
Lucy Oh edited this page Sep 11, 2023
·
5 revisions
Written by Jisoo Oh
공식 문서에도 언급되어 있지만, DynamoDB의 단일 쿼리 작업은 최대 1MB
의 데이터만 가져올 수 있습니다. 그렇기에 우리 어플리케이션에서 프로필 탭에서 자신이 찍힌 게시글과 찍은 게시글을 조회할 때 다음과 같은 페이징이 필요하다고 판단하여 리팩토링을 진행하게 되었습니다!
- 물론 성능 측면도 고려해보았을 때, 페이징은 언젠가 해야되리라 생각하고 있었음 ..
다음과 같이 Page Size를 지정하고 쿼리를 보내면?
aws dynamodb query --table-name Movies \
--projection-expression "title" \
--key-condition-expression "#y = :yyyy" \
--expression-attribute-names '{"#y":"year"}' \
--expression-attribute-values '{":yyyy":{"N":"1993"}}' \
--page-size 5 \
--debug
만약 5개 결과가 결과 그룹의 전부가 아니면 다음과 같이 LastEvaluatedKey
가 반환됩니다.
- LastEvaluatedKey는 다음 Query 요청에 대한 ExclusiveStartKey로 사용함으로써 다음 그룹을 가져오는 데 사용합니다!
- 만약 다음 결과값이 없으면 LastEvaluatedKey에 null 값이 반환됩니다.
2017-07-07 11:13:15,603 - MainThread - botocore.parsers - DEBUG - Response body:
b'{"Count":5,"Items":[{"title":{"S":"A Bronx Tale"}},
{"title":{"S":"A Perfect World"}},{"title":{"S":"Addams Family Values"}},
{"title":{"S":"Alive"}},{"title":{"S":"Benny & Joon"}}],
"LastEvaluatedKey":{"year":{"N":"1993"},"title":{"S":"Benny & Joon"}},
"ScannedCount":5}'
DynamoDBQueryExpression<Publish> query = new DynamoDBQueryExpression<Publish>()
.withKeyConditionExpression("#PK = :val1 and begins_with(#SK, :val2)")
.withFilterExpression("#STATUS = :val3")
.withExpressionAttributeValues(eav)
.withExpressionAttributeNames(ean)
.withLimit(12)
.withExclusiveStartKey(exclusiveStartKey)
.withScanIndexForward(false); // desc
- limit : 12개로 한정
- exclusiveStartKey : 시작키 설정 | null로 설정할 경우, 처음부터 가져옴.
다음과 같이 Map 형태로 이루어져 있음.
- 클라에게 String 값으로 받은 뒤, Map을 만들어 쿼리하는 형식으로 코드를 작성함.
Map<String, AttributeValue> exclusiveStartKey