DynamoDB의 표현식 속성 이름
표현식 속성 이름은 Amazon DynamoDB 표현식에서 실제 속성 이름의 대체 이름으로 사용하는 자리 표시자입니다. 표현식 속성 이름은 파운드 기호(#
)로 시작해야 하며, 그 뒤에 하나 이상의 영숫자와 밑줄(_
) 문자가 이어져야 합니다.
이 단원에서는 표현식 속성 이름을 사용해야 하는 여러 가지 상황에 대해 설명합니다.
참고
이 단원의 예제에서는 AWS Command Line Interface(AWS CLI)를 사용합니다. 프로그래밍 언어별 코드 예제에 대한 자세한 내용은 DynamoDB 및 AWS SDK 시작하기 섹션을 참조하세요.
예약어
경우에 따라 DynamoDB 예약어와 충돌하는 속성 이름을 포함하는 표현식을 작성해야 할 때가 있습니다. 전체 예약어 목록은 DynamoDB의 예약어를 참조하십시오.
예를 들어, 다음 AWS CLI 예제는 COMMENT
가 예약어이기 때문에 실패합니다.
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Comment"
이 문제를 해결하려면 Comment
를 #c
와 같은 표현식 속성 이름으로 대체할 수 있습니다. #
(파운드 기호)가 필요하며 이 기호는 속성 이름의 자리 표시자임을 나타냅니다. 이제 AWS CLI 예제는 다음과 같습니다.
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#c" \ --expression-attribute-names '{"#c":"Comment"}'
참고
속성 이름이 숫자로 시작하거나 공백을 포함하거나 예약어를 포함하는 경우, 반드시 표현식 속성 이름을 사용하여 표현식에서 해당 속성의 이름을 대체해야 합니다.
특수 문자가 포함된 속성 이름
식에서 점(".")은 문서 경로의 특수 문자로 해석됩니다. 하지만 DynamoDB에서는 점 문자 및 하이픈('-')과 같은 기타 특수 문자를 속성 이름의 일부로 사용할 수도 있습니다. 이러한 사용은 경우에 따라 의미가 명확하지 않을 수도 있습니다. 설명을 위해 ProductCatalog
항목에서 Safety.Warning
속성을 가져오려 한다고 가정합니다(표현식 사용 시 항목 속성 지정 참조).
프로젝션 표현식을 사용하여 Safety.Warning
에 액세스하려 한다고 가정하겠습니다.
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Safety.Warning"
DynamoDB는 예상 문자열("Always wear a
helmet
")이 아닌 빈 결과를 반환합니다. 이는 DynamoDB가 표현식의 점을 문서 경로 구분 기호로 해석하기 때문입니다. 이 경우 표현식 속성 이름(#sw
)을 Safety.Warning
의 대체 이름으로 정의해야 합니다. 그러고 나면 다음 프로젝션 표현식을 사용할 수 있습니다.
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#sw" \ --expression-attribute-names '{"#sw":"Safety.Warning"}'
그러면 DynamoDB에서 정확한 결과가 반환됩니다.
참고
속성 이름에 점('.') 또는 하이픈('-') 이 포함된 경우 반드시 표현식 속성 이름을 사용하여 표현식에서 해당 속성의 이름을 대체해야 합니다.
중첩 속성
다음 프로젝션 표현식을 사용하여 중첩 속성 ProductReviews.OneStar
에 액세스하려 한다고 가정합니다.
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.OneStar"
결과에는 예상되는 별 한 개 제품 평가가 모두 포함됩니다.
하지만 식 속성 이름을 대신 사용하기로 결정한 경우에는 어떻게 될까요? 예를 들어 #pr1star
의 대체 이름으로 ProductReviews.OneStar
를 정의한다면 어떻게 될까요?
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr1star" \ --expression-attribute-names '{"#pr1star":"ProductReviews.OneStar"}'
DynamoDB에서 예상된 별 한 개 평가 맵 대신에 비어 있는 결과가 반환됩니다. 이는 DynamoDB가 속성의 이름 안에서 표현식 속성 이름의 점을 문자로 해석하기 때문입니다. DynamoDB가 표현식 속성 이름 #pr1star
를 평가할 때 ProductReviews.OneStar
가 스칼라 속성을 나타낸다고 결정하는데, 이는 의도와는 다릅니다.
올바른 접근법은 문서 경로의 각 요소에 대해 하나의 표현식 속성 이름을 정의하는 것입니다.
-
#pr — ProductReviews
-
#1star — OneStar
이제 프로젝션 표현식에 #pr.#1star
를 사용할 수 있습니다.
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.#1star" \ --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'
그러면 DynamoDB에서 정확한 결과가 반환됩니다.
속성 이름 반복
표현식 속성 이름은 동일한 속성 이름을 반복적으로 참조해야 할 때 도움이 됩니다. 예를 들어 ProductCatalog
항목에서 리뷰 몇 개를 검색하는 다음 식을 살펴보겠습니다.
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"
식을 간소화하기 위해 ProductReviews
를 #pr
과 같은 식 속성 이름으로 대체할 수 있습니다. 수정된 표현식은 다음과 같습니다.
-
#pr.FiveStar, #pr.ThreeStar, #pr.OneStar
aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \ --expression-attribute-names '{"#pr":"ProductReviews"}'
식 속성 이름을 정의하는 경우 전체 식에서 해당 식 속성 이름을 일관되게 사용해야 합니다. 또한 #
기호를 생략하면 안 됩니다.