

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 표현식 및 조건 사용
<a name="ddb-en-client-expressions"></a>

DynamoDB 향상된 클라이언트 API의 표현식은 [DynamoDB 식](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.html)을 Java로 표현한 것입니다.

DynamoDB 향상된 클라이언트 API는 세 가지 유형의 식을 사용합니다.

[표현식](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/Expression.html)  
`Expression` 클래스는 조건과 필터를 정의할 때 사용됩니다.

[https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryConditional.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryConditional.html)  
이 유형의 표현식은 쿼리 작업의 [주요 조건](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.KeyConditionExpressions)을 나타냅니다.

[https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/update/UpdateExpression.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/update/UpdateExpression.html)  
이 클래스는 DynamoDB [업데이트 표현식](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)을 작성하는 데 도움이 되며, 현재 항목을 업데이트할 때 확장 프레임워크에서 사용됩니다.

## 표현 해부학
<a name="ddb-en-client-expressions-compoonents"></a>

표현식은 다음과 같이 구성됩니다.
+ 문자열 표현식(필수). 문자열에는 속성 이름 및 속성 값에 대한 자리 표시자 이름이 있는 DynamoDB 논리 표현식이 포함되어 있습니다.
+ 표현식 값 맵(일반적으로 필수).
+ 표현식 이름 맵(선택 사항).

빌더를 사용하여 다음과 같은 일반적인 형식을 취하는 `Expression` 객체를 생성합니다.

```
Expression expression = Expression.builder()
                            .expression({{<String>}})
                            .expressionNames({{<Map>}})
                            .expressionValues({{<Map>}})
                           .build()
```

`Expression`는 일반적으로 표현식 값의 맵이 필요합니다. 맵은 문자열 표현식의 자리 표시자 값을 제공합니다. 맵 키는 콜론(`:`) 이 붙은 자리 표시자 이름으로 구성되며 맵 값은 [AttributeValue](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/model/AttributeValue.html)의 인스턴스입니다. [AttributeValues](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/internal/AttributeValues.html) 클래스에는 리터럴에서 `AttributeValue` 인스턴스를 생성할 수 있는 편리한 메서드가 있습니다. 또는 `AttributeValue.Builder`를 사용하여 `AttributeValue` 인스턴스를 생성할 수도 있습니다.

다음 코드 조각은 주석 줄 2 뒤에 두 개의 항목이 있는 맵을 보여줍니다. `expression()` 메서드에 전달된 문자열(주석 줄 1 뒤에 표시됨)에는 DynamoDB가 작업을 수행하기 전에 확인하는 자리 표시자가 포함되어 있습니다. *가격*은 허용 가능한 속성 이름이므로 이 코드 조각에는 표현식 이름 맵이 포함되어 있지 않습니다.

```
    public static void scanAsync(DynamoDbAsyncTable productCatalog) {
        ScanEnhancedRequest request = ScanEnhancedRequest.builder()
                .consistentRead(true)
                .attributesToProject("id", "title", "authors", "price")
                .filterExpression(Expression.builder()
                        // 1. :min_value and :max_value are placeholders for the values provided by the map
                        .expression("price >= :min_value AND price <= :max_value")
                        // 2. Two values are needed for the expression and each is supplied as a map entry.
                        .expressionValues(
                                Map.of( ":min_value", numberValue(8.00),
                                        ":max_value", numberValue(400_000.00)))
                        .build())
                .build();
```

DynamoDB 테이블의 속성 이름이 예약어이거나, 숫자로 시작하거나, 공백이 포함된 경우에는 `Expression`에 대해 표현식 이름 맵이 필요합니다.

예를 들어 이전 코드 예제의 속성 이름이 `price`가 `1price`인 경우 다음의 예제와 같이 예제를 수정해야 합니다.

```
        ScanEnhancedRequest request = ScanEnhancedRequest.builder()
                .filterExpression(Expression.builder()
                        .expression("#price >= :min_value AND #price <= :max_value")
                        .expressionNames( Map.of("#price", "1price") )
                        .expressionValues(
                                Map.of(":min_value", numberValue(8.00),
                                        ":max_value", numberValue(400_000.00)))
                        .build())
                .build();
```

표현식 이름의 자리 표시자는 파운드 기호(`#`)로 시작합니다. 표현식 이름 맵의 항목은 자리 표시자를 키로 사용하고 속성 이름을 값으로 사용합니다. 맵은 `expressionNames()` 메서드를 사용하여 표현식 빌더에 추가됩니다. DynamoDB는 작업을 수행하기 전에 속성 이름을 확인합니다.

문자열 표현식에 함수를 사용하는 경우에는 표현식 값이 필요하지 않습니다. 표현식 함수의 예는 `attribute_exists({{<attribute_name>}})`과 같습니다.

다음 예제는 [DynamoDB 함수](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Functions)를 사용하여 `Expression`를 빌드합니다. 이 예제의 표현식 문자열은 자리 표시자를 사용하지 않습니다. 이 표현식은 `movie` 속성 값이 데이터 개체의 `movie` 속성과 같은 항목이 데이터베이스에 이미 존재하는지 확인하는 `putItem` 작업에 사용할 수 있습니다.

```
Expression exp = Expression.builder().expression("attribute_not_exists (movie)").build();
```

DynamoDB 개발자 안내서에는 DynamoDB와 함께 사용되는 [하위 수준 표현식](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.html)에 대한 전체 정보가 포함되어 있습니다.

## 조건 표현식 및 조건문
<a name="ddb-en-client-expressions-cond"></a>

`putItem()`, `updateItem()` 및 `deleteItem()` 메서드를 사용할 때와 트랜잭션 및 배치 작업을 사용할 때는 `[Expression](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/Expression.html)` 객체를 사용하여 DynamoDB가 작업을 진행하기 위해 충족해야 하는 조건을 지정합니다. 이러한 식을 조건식이라고 합니다. 예제는 이 가이드에 나와 있는 [트랜잭션 예제](ddb-en-client-use-multiop-trans.md#ddb-en-client-use-multiop-trans-writeitems-opcondition)의 `addDeleteItem()` 메서드(주석 줄 1 뒤)에 사용된 조건식을 참조하세요.

`query()` 메서드를 사용하여 작업할 경우 조건은 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryConditional.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryConditional.html)로 표현됩니다. `QueryConditional` 클래스에는 DynamoDB에서 읽을 항목을 결정하는 기준을 작성하는 데 도움이 되는 몇 가지 정적 편의 메서드가 있습니다.

`QueryConditionals`의 예제는 이 가이드 [`Query` 메서드 예제](ddb-en-client-use-multirecord.md#ddb-en-client-use-multirecord-query-example) 단원의 첫 번째 코드 예제를 참조하세요.

## 필터 표현식
<a name="ddb-en-client-expressions-filter"></a>

필터 표현식은 스캔 및 쿼리 작업에서 반환되는 항목을 필터링하는 데 사용됩니다.

데이터베이스에서 모든 데이터를 읽은 후 필터 표현식이 적용되므로 읽기 비용은 필터가 없는 것과 동일합니다. *Amazon DynamoDB 개발자 안내서*에는 [쿼리](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.FilterExpression) 및 [스캔](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.FilterExpression) 작업 모두에 필터 표현식을 사용하는 방법에 대한 자세한 정보가 있습니다.

다음 예제는 스캔 요청에 추가된 필터 표현식을 보여줍니다. 기준에 따라 반품되는 품목은 가격이 8.00에서 80.00 사이인 품목으로 제한됩니다.

```
        Map<String, AttributeValue> expressionValues = Map.of(
                ":min_value", numberValue(8.00),
                ":max_value", numberValue(80.00));

        ScanEnhancedRequest request = ScanEnhancedRequest.builder()
                .consistentRead(true)
                // 1. the 'attributesToProject()' method allows you to specify which values you want returned.
                .attributesToProject("id", "title", "authors", "price")
                // 2. Filter expression limits the items returned that match the provided criteria.
                .filterExpression(Expression.builder()
                        .expression("price >= :min_value AND price <= :max_value")
                        .expressionValues(expressionValues)
                        .build())
                .build();
```

## 업데이트 표현식
<a name="ddb-en-client-expressions-update"></a>

DynamoDB 향상된 클라이언트의 `updateItem()` 메서드는 DynamoDB의 항목을 업데이트하는 표준 방법을 제공합니다. 하지만 더 많은 기능이 필요한 경우 [UpdateExpressions](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/update/UpdateExpression.html)는 DynamoDB [업데이트 표현식 구문](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)을 형식에 구애받지 않고 표현할 수 있습니다. 예를 들어 DynamoDB에서 항목을 먼저 읽지 않고 값을 늘리거나 개별 구성원을 목록에 추가하는 데 `UpdateExpressions`을 사용할 수 있습니다. 업데이트 표현식은 `updateItem()` 메서드의 사용자 지정 확장에서 사용할 수 있습니다.

업데이트 표현식을 사용하는 예제는 이 가이드의 [사용자 지정 확장 예제](ddb-en-client-extensions-custom.md)를 참조하세요.

업데이트 표현식에 대한 자세한 내용은 [Amazon DynamoDB 개발자 안내서](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)를 참조하세요.