DynamoDB를 내림차순으로 쿼리하는 법
기본적으로 DynamoDB Query는 항목을 오름차순 정렬 키 순으로 반환합니다. 하지만
대부분의 "최신을 줘" 액세스 패턴은 그 반대 — 최신순을 원합니다. 그 스위치는 Query에
달린 단 하나의 불리언, **ScanIndexForward**입니다. false로 설정하면 같은 쿼리가
파티션을 역순으로 읽습니다.
매개변수 하나지만 사람들을 헷갈리게 합니다. 사후에 결과를 정렬하는 것(DynamoDB는 그러지 않습니다)과 혼동하기 쉽고, 이름이 그것이 제어하는 것과 거꾸로 읽히기 때문입니다.
DynamoDB를 내림차순으로 쿼리하려면 어떻게 하나요?
Query에 **ScanIndexForward=false**를 설정하세요. 기본적으로 DynamoDB는 항목을 오름차순 정렬 키 순으로 반환합니다. 이 불리언 하나를 뒤집으면 파티션을 역순으로 읽어, 정렬 키가 타임스탬프나 시퀀스일 때 최신순 결과를 얻습니다. 순서만 바뀔 뿐 어느 항목이 일치하는지는 그대로이고, 역순 읽기 비용은 정순과 동일합니다.
ScanIndexForward=true(기본값) → 오름차순 정렬 키 순.ScanIndexForward=false→ 내림차순 — 정렬 키가 타임스탬프나 시퀀스일 때 최신순.- 순서에만 영향을 줍니다. 어느 항목이 일치하는지는 아닙니다 — 그건 여전히 키 조건이 정합니다.
- 공짜입니다. 역순은 정순과 같은 비용입니다. DynamoDB는 어느 쪽이든 파티션의 저장된 순서를 읽습니다.
Limit과 함께 쓰세요 — 한 번의 저렴한 읽기로 "가장 최근 N개"를 얻습니다.
문제: "최신을 먼저 보여 줘"
멀티플레이어 리더보드를 운영하며 각 플레이어의 점수 이벤트를 하나의 파티션 키 아래, 증가하는 타임스탬프로 정렬해 저장한다고 합시다:
PK: GAME#42 SK: SCORE#2026-06-27T10:00:00Z points
PK: GAME#42 SK: SCORE#2026-06-27T10:05:00Z points
PK: GAME#42 SK: SCORE#2026-06-27T10:09:00Z points대시보드는 가장 최근 점수가 필요합니다. GAME#42에 대한 평범한 Query는 그것을
오래된 순으로 반환하므로, 전부 읽어 앱에서 뒤집고 싶어집니다 — 낭비이고, Limit을
추가하는 순간 깨집니다. DynamoDB는 그것을 최신순으로 곧장 건네줄 수 있습니다.
ScanIndexForward의 작동 방식
파티션 안의 항목은 물리적으로 정렬 키 순으로 저장됩니다. Query는 그 순서를
따라 걷고, ScanIndexForward는 걷는 방향만 고릅니다:
true(기본값) — 가장 낮은 정렬 키에서 시작해 위로 걷습니다(오름차순).false— 가장 높은 정렬 키에서 시작해 아래로 걷습니다(내림차순).
결정적으로, 이것은 테이블이 아니라 읽기의 속성입니다 — 같은 항목, 같은 키 조건,
방향만 반대일 뿐. 그리고 DynamoDB는 이미 정렬된 데이터 위에서 방향만 고르므로,
내림차순 읽기는 오름차순과
정확히 같은 비용
입니다. Limit=10과 짝지으면 단 한 번의 최소 비용 Query로 "가장 최근 점수 이벤트
10개"를 얻습니다.
미묘한 점 하나: 내림차순 결과 집합을 뒤로 페이지 넘길 때도
LastEvaluatedKey/ExclusiveStartKey 커서는 여전히 동작합니다 — 같은 스캔의 모든
페이지에서 ScanIndexForward=false를 일관되게 유지하기만 하세요. 안 그러면 커서
방향과 순서가 어긋납니다.
DynoTable에서 쿼리 만들기
키 조건 자체를 조립하려면(그리고 일치하는 속성 이름/값 맵을 보려면) DynamoDB 표현식 빌더를 쓰세요.
DynoTable에서는 선택한 키로 탭을 읽고, 탭의 토글로 정렬 방향을 설정합니다 —
ScanIndexForward를 손으로 쓸 필요가 없습니다. 토글을 뒤집어 최신순 결과를 미리 보세요.

함정 + 다음 단계
ScanIndexForward는 뒤집을 뿐, 임의 속성으로 정렬하지 않습니다. 순서는 항상 정렬 키 기준입니다 — 다른 것으로 정렬하려면 그 속성을 (흔히 GSI를 통해) 정렬 키로 두어야 합니다.- 앱에서 전부-읽고-뒤집지 마세요 — 플래그를 설정하고
Limit을 추가하세요. - 여러 페이지 스캔 중에는 플래그를 일관되게 유지하세요 — 안 그러면 커서가 순서와 싸웁니다.
- 숫자를 최신순으로? 정렬 키가 올바르게 정렬되는지 확인하세요 — 숫자를 0으로 채워 사전식 순서가 일치하게 하세요.
- 관련: 정렬 키 전략과 페이지네이션.
API 매개변수를 건드리지 않고 결과 순서를 뒤집고 싶으신가요? DynoTable을 받아 테이블을 직접 쿼리해 보세요.


