표현식에서 사용되지 않는 ExpressionAttributeNames에 제공된 값
TL;DR — 표현식이 참조하지 않는 이름 자리 표시자를 ExpressionAttributeNames(예: #status)에 선언했습니다. DynamoDB에서는 선언된 모든 별칭을 KeyConditionExpression, FilterExpression, UpdateExpression, ConditionExpression 또는 ProjectionExpression에서 사용해야 합니다. 사용하지 않는 별칭을 제거하거나 이를 참조해야 했던 표현식을 수정하세요.
무엇을 의미하는가
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in
expressions: keys: {#status}
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in expressions: keys: {#status}ExpressionAttributeNames은 속성 이름 별칭에 대한 대체 맵입니다(예약어 또는 특수 문자가 있는 이름에 필요함). DynamoDB는 엄격한 양방향 계약을 적용합니다. 표현식에 사용하는 모든 별칭은 선언되어야 하며 **그리고** 선언하는 모든 별칭은 사용해야 합니다. 참조되지 않은 남은 항목이 이 HTTP 400ValidationException`을 트리거합니다. 이는 클라이언트 측이며 맵이 표현식과 일치할 때까지 재시도할 수 없습니다.
왜 발생하는가
- 표현식을 편집한 후 오래된 별칭이 남음 — 표현식에서
#status = :s를 제거했지만 이름 맵에서#status을 삭제하는 것을 잊었습니다. - 과도하게 선언된 생성된 맵 — 매핑 레이어는 최종 표현식이 건드리지 않는 속성이라도 모든 속성에 대한 별칭을 내보냈습니다.
- 별칭은 이름이 아니라 값 맵에 있습니다 —
:status(값)을 의미했지만#status(이름)으로 선언했습니다. - 오타 불일치 — 지도에서는
#status를 선언하는 반면 표현식에서는#stat를 사용하므로#status는 기술적으로 사용되지 않습니다.
어떻게 해결하는가
ExpressionAttributeNames의 메시지 이름에서 사용하지 않는 별칭을 삭제합니다.- 표현식과 함께 지도를 고정 상태로 유지 — 표현식이 실제로 참조하는 경우에만
#name을 선언합니다. - 이름과 값이 혼동되는지 확인하세요 —
#-별칭은ExpressionAttributeNames에 있고:-자리 표시자는ExpressionAttributeValues에 있습니다. - 요청을 다시 생성하여 이름, 값 및 표현식 텍스트가 직접 조립되지 않고 함께 작성되도록 합니다.
DynoTable에서 검사
DynoTable은 업데이트 및 필터 편집기에서 예약된 속성 이름을 별칭으로 지정합니다. 출력의 모든 #placeholder는 표현식에서 참조됩니다. ⌘K로 테이블을 열고, 항목을 편집하고, 생성된 ExpressionAttributeNames 지도를 복사하세요.
reserved words checker에서 실패한 SDK 요청을 교차 확인합니다. # 접두사가 필요한 이름에 대한 별칭 맵을 인쇄합니다. ⌘P로 프로필을 전환합니다. Connect to AWS 및 Install를 참조하세요.
출처
- Expression attribute names (aliases) in DynamoDB (2026-07-13 인증)
- Reserved words in DynamoDB (2026-07-13 인증)
재현하기
어떤 표현도 참조하지 않는 ExpressionAttributeNames 항목:
await client.send(
new UpdateItemCommand({
TableName: 'orders',
Key: {pk: {S: 'ORDER#1'}, sk: {S: 'META'}},
UpdateExpression: 'SET stat = :v', // note: 'stat', not '#unused'
ExpressionAttributeNames: {'#unused': 'status'},
ExpressionAttributeValues: {':v': {S: 'shipped'}}
})
);실제 출력:
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in expressions: keys: {#unused}
HTTP 400메시지에는 문제가 있는 키의 이름이 지정되어 있으며, 이는 다른 내용을 읽지 않고도 조치를 취할 수 있는 몇 가지 DynamoDB 검증 오류 중 하나입니다. 일반적으로 편집으로 인해 표현식에서 자리 표시자가 제거되었지만 해당 선언은 남겨진 후에 나타납니다.
관련 오류
- Value provided in ExpressionAttributeValues unused in expressions —
:value자리 표시자에도 동일한 규칙이 적용됩니다. - The provided expression refers to an attribute that does not exist in the item — 표현식이 존재하지 않는 항목 속성을 읽습니다.
- Attribute name is a reserved keyword — 애초에
#-별칭이 필요한 이유. - 학습: Expression names & values
참고 자료
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
위에 링크된 공식 AWS 문서를 기준으로 2026년 7월 13일에 마지막으로 확인되었습니다.
JavaScript용 AWS SDK v3.1095.0을 사용하여 DynamoDB Local 2.x에 대해 2026년 7월 26일 재현 — 위 출력은 그대로입니다.