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.
  • 표현식 형식을 설정하는 동안 레거시 기본값을 주입하는 헬퍼 라이브러리입니다.

어떻게 해결하는가

  1. 레거시 매개변수를 삭제합니다. 다음과 같은 표현식 형식만 유지합니다: KeyConditionExpression over KeyConditions, FilterExpression over ScanFilter/QueryFilter, ProjectionExpression over AttributesToGet, ConditionExpression/UpdateExpression over Expected/AttributeUpdates.
  2. 값을 자리 표시자로 이동 — 레거시 인라인 값은 ExpressionAttributeValues(:v)가 되고 예약된/복잡한 이름은 ExpressionAttributeNames(#n)이 됩니다.
  3. 전체 매개변수 개체를 감사하세요 — 충돌은 단지 동일한 것이 아니라 두 개의 다른 문제(예: 레거시 프로젝션 + 표현식 키 조건) 사이에 있을 수 있습니다.
  4. 어디서나 표현식을 선호합니다 — AWS는 이전 버전과의 호환성을 위해서만 레거시 매개변수를 유지하고 모든 새 코드에 대해 표현식 매개변수를 권장합니다. 표현식을 표준화하면 이러한 종류의 오류를 피할 수 있습니다.
  5. 헬퍼 라이브러리에서 레거시 기본값을 제거합니다. 일부 SDK 래퍼는 명시적으로 비활성화하지 않는 한 여전히 AttributesToGet 또는 KeyConditions를 주입합니다.

DynoTable에서 실행

DynoTable의 쿼리 패널은 표현식 매개변수만 사용합니다. 생성된 요청에는 레거시 KeyConditions 또는 ScanFilter 필드가 없습니다. ⌘K가 있는 테이블을 열고 쿼리 또는 스캔을 작성한 다음 내보낸 KeyConditionExpression 및 속성 맵을 마이그레이션에 복사합니다.

이전 SDK 코드를 리팩터링하기 전에 Query Builder을 사용하여 표현식 전용 요청의 프로토타입을 만드세요. 스테이징(⌘S)을 사용하면 쓰기를 커밋하지 않고도 라이브 데이터에 대해 새 쿼리를 테스트할 수 있습니다. ⌘P로 프로필을 전환합니다. 설정 → 프로필에서 연결 테스트를 사용하여 구성합니다. Connect to AWSInstall을 참조하세요. 레거시 KeyConditionsScanFilter 매개변수는 DynoTable 생성 요청의 어디에도 표시되지 않습니다. SDK 래퍼가 계속 주입하는 경우 전체 params 객체를 기록하고 호출이 DynamoDB에 도달하기 전에 모든 레거시 키를 삭제합니다.

출처

관련 오류

참고 자료

위에 링크된 공식 AWS 문서를 기준으로 2026년 7월 13일에 마지막으로 확인되었습니다.

Console 없이 DynamoDB 작업하기

DynamoDB로는 실행할 수 없는 진짜 SQL(JOINs, GROUP BY, 집계)을 실행하는 빠른 DynamoDB 데스크톱 클라이언트. 시각적 편집과 여러분 자신의 Bedrock 키로 동작하는 AI 에이전트를 제공합니다.

30일 무료 체험, 신용카드 불필요 — 이후 기간 제한 없는 무료 요금제.