Amazon DynamoDB
개발자 안내서 (API 버전 2012-08-10)

식 속성 이름

표현식 속성 이름은 Amazon DynamoDB 표현식에서 실제 속성 이름의 대체 이름으로 사용하는 자리 표시자입니다. 표현식 속성 이름은 파운드 기호(#)로 시작해야 하며, 그 뒤에 하나 이상의 영숫자가 이어져야 합니다.

이 단원에서는 표현식 속성 이름을 사용해야 하는 여러 가지 상황에 대해 설명합니다.

참고

이 단원의 예제에서는 AWS Command Line Interface(AWS CLI)를 사용합니다. 프로그래밍 언어별 코드 예제에 대한 자세한 내용은 DynamoDB 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"}'

식 속성 이름을 정의하는 경우 전체 식에서 해당 식 속성 이름을 일관되게 사용해야 합니다. 또한 # 기호를 생략하면 안 됩니다.