

# DynamoDB의 표현식 속성 이름(별칭)
<a name="Expressions.ExpressionAttributeNames"></a>

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

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

**참고**  
이 섹션의 예제에서는 AWS Command Line Interface(AWS CLI)를 사용합니다.

**Topics**
+ [예약어](#Expressions.ExpressionAttributeNames.ReservedWords)
+ [특수 문자가 포함된 속성 이름](#Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters)
+ [중첩 속성](#Expressions.ExpressionAttributeNames.NestedAttributes)
+ [속성 이름 반복 참조](#Expressions.ExpressionAttributeNames.RepeatingAttributeNames)

## 예약어
<a name="Expressions.ExpressionAttributeNames.ReservedWords"></a>

경우에 따라 DynamoDB 예약어와 충돌하는 속성 이름을 포함하는 표현식을 작성해야 할 때가 있습니다. 전체 예약어 목록은 [DynamoDB의 예약어](ReservedWords.md)를 참조하세요.

예를 들어, 다음 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"}'
```

**참고**  
속성 이름이 숫자로 시작하거나 공백을 포함하거나 예약어를 포함하는 경우, *반드시* 표현식 속성 이름을 사용하여 표현식에서 해당 속성의 이름을 대체해야 합니다.

## 특수 문자가 포함된 속성 이름
<a name="Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters"></a>

식에서 점(".")은 문서 경로의 특수 문자로 해석됩니다. 하지만 DynamoDB에서는 점 문자 및 하이픈('-')과 같은 기타 특수 문자를 속성 이름의 일부로 사용할 수도 있습니다. 이러한 사용은 경우에 따라 의미가 명확하지 않을 수도 있습니다. 설명을 위해 `Safety.Warning` 항목에서 `ProductCatalog` 속성을 가져오려 한다고 가정합니다([DynamoDB에서 표현식 사용 시 항목 속성 참조](Expressions.Attributes.md) 참조).

프로젝션 표현식을 사용하여 `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에서 정확한 결과가 반환됩니다.

**참고**  
속성 이름에 점('.') 또는 하이픈('-') 이 포함된 경우 *반드시* 표현식 속성 이름을 사용하여 표현식에서 해당 속성의 이름을 대체해야 합니다.

## 중첩 속성
<a name="Expressions.ExpressionAttributeNames.NestedAttributes"></a>

중첩된 속성 `ProductReviews.OneStar`에 액세스하려고 한다고 가정해 보겠습니다. 표현식 속성 이름에서 DynamoDB는 점(".")을 속성 이름 내의 문자로 취급합니다. 중첩된 속성을 참조하려면 문서 경로에 있는 각 요소의 표현식 속성 이름을 정의합니다.
+ `#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에서 정확한 결과가 반환됩니다.

## 속성 이름 반복 참조
<a name="Expressions.ExpressionAttributeNames.RepeatingAttributeNames"></a>

표현식 속성 이름은 동일한 속성 이름을 반복적으로 참조해야 할 때 도움이 됩니다. 예를 들어 `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"}'
```

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