DynamoDB "Can Not Use Both Expression and Non-Expression Parameters" — 표현식 매개변수와 비표현식 매개변수를 모두 사용할 수 없습니다.
TL;DR — 귀하의 요청은 레거시 매개변수(KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator)와 해당 표현식(KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) 같은 통화에서. DynamoDB는 두 제품군을 혼합하는 것을 금지합니다. 기존 매개변수를 제거하고 표현식만 사용하세요.
무엇을 의미하는가
ValidationException: Can not use both expression and non-expression parameters in
the same request: Non-expression parameters: {KeyConditions} Expression
parameters: {KeyConditionExpression}
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Can not use both expression and non-expression parameters in the same request: Non-expression parameters: {KeyConditions} Expression parameters: {KeyConditionExpression}DynamoDB에는 2세대 매개변수가 있습니다. 레거시 계열(KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator)은 표현식보다 우선합니다. 식 계열(KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression)이 이를 대체했습니다. 단일 요청은 하나의 계열에 커밋되어야 합니다. 개발자 가이드에서는 관련 없는 문제를 다루는 경우에도 DynamoDB가 "단일 호출에서 레거시 조건부 매개변수와 표현식 매개변수를 혼합하는 것을 허용하지 않는다"고 명시하고 있습니다.
왜 발생하는가
- 반 마이그레이션된 코드 —
KeyConditionExpression를 추가했지만 동일한 params 개체에 이전KeyConditions을 남겨 두었습니다. - 투영 충돌 —
ProjectionExpression옆에AttributesToGet(레거시). - 필터 충돌 —
FilterExpression옆에ScanFilter/QueryFilter. - 쓰기 충돌 —
ConditionExpression/UpdateExpression와 함께Expected/AttributeUpdates. - 표현식 형식을 설정하는 동안 레거시 기본값을 주입하는 헬퍼 라이브러리입니다.
어떻게 해결하는가
- 레거시 매개변수를 삭제합니다. 다음과 같은 표현식 형식만 유지합니다:
KeyConditionExpressionoverKeyConditions,FilterExpressionoverScanFilter/QueryFilter,ProjectionExpressionoverAttributesToGet,ConditionExpression/UpdateExpressionoverExpected/AttributeUpdates. - 값을 자리 표시자로 이동 — 레거시 인라인 값은
ExpressionAttributeValues(:v)가 되고 예약된/복잡한 이름은ExpressionAttributeNames(#n)이 됩니다. - 전체 매개변수 개체를 감사하세요 — 충돌은 단지 동일한 것이 아니라 두 개의 다른 문제(예: 레거시 프로젝션 + 표현식 키 조건) 사이에 있을 수 있습니다.
- 어디서나 표현식을 선호합니다 — AWS는 이전 버전과의 호환성을 위해서만 레거시 매개변수를 유지하고 모든 새 코드에 대해 표현식 매개변수를 권장합니다. 표현식을 표준화하면 이러한 종류의 오류를 피할 수 있습니다.
- 헬퍼 라이브러리에서 레거시 기본값을 제거합니다. 일부 SDK 래퍼는 명시적으로 비활성화하지 않는 한 여전히
AttributesToGet또는KeyConditions를 주입합니다.
DynoTable에서 실행
DynoTable의 쿼리 패널은 표현식 매개변수만 사용합니다. 생성된 요청에는 레거시 KeyConditions 또는 ScanFilter 필드가 없습니다. ⌘K가 있는 테이블을 열고 쿼리 또는 스캔을 작성한 다음 내보낸 KeyConditionExpression 및 속성 맵을 마이그레이션에 복사합니다.
이전 SDK 코드를 리팩터링하기 전에 Query Builder을 사용하여 표현식 전용 요청의 프로토타입을 만드세요. 스테이징(⌘S)을 사용하면 쓰기를 커밋하지 않고도 라이브 데이터에 대해 새 쿼리를 테스트할 수 있습니다. ⌘P로 프로필을 전환합니다. 설정 → 프로필에서 연결 테스트를 사용하여 구성합니다. Connect to AWS 및 Install을 참조하세요. 레거시 KeyConditions 및 ScanFilter 매개변수는 DynoTable 생성 요청의 어디에도 표시되지 않습니다. SDK 래퍼가 계속 주입하는 경우 전체 params 객체를 기록하고 호출이 DynamoDB에 도달하기 전에 모든 레거시 키를 삭제합니다.
출처
- Legacy DynamoDB conditional parameters (2026-07-13 인증)
- Query — Amazon DynamoDB API Reference (2026-07-13 인증)
관련 오류
- Cannot specify projection when Select is COUNT — 상호 배타적인 또 다른 매개변수 조합.
- Query key condition not supported — 잘못된
KeyConditionExpression입니다. - 코드 예: Query in Node.js — 마이그레이션할 표현식 전용 쿼리입니다.
- 학습: Key condition expressions · Expression names & values
참고 자료
- Legacy DynamoDB conditional parameters — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- PutItem — Amazon DynamoDB API Reference
- Using expressions in DynamoDB — Amazon DynamoDB Developer Guide
위에 링크된 공식 AWS 문서를 기준으로 2026년 7월 13일에 마지막으로 확인되었습니다.