

 AWS SDK for .NET V3가 유지 관리 모드로 전환되었습니다.

[AWS SDK for .NET V4](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html)로 마이그레이션하는 것이 좋습니다. 마이그레이션 방법에 대한 자세한 내용과 정보는 [유지 관리 모드 공지](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/)를 참조하세요.

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

# Amazon DynamoDB NoSQL 데이터베이스 사용
<a name="dynamodb-intro"></a>

**참고**  
이 항목의 프로그래밍 모델은 .NET Framework와 .NET(Core) 모두에 제공되지만 호출 규칙은 동기식이든 비동기식이든 서로 다릅니다.

는에서 제공하는 빠른 NoSQL 데이터베이스 서비스인 Amazon DynamoDB를 AWS SDK for .NET 지원합니다 AWS. SDK는 DynamoDB와 통신하기 위해 *하위 레벨* 모델, *문서* 모델, *객체 지속성* 모델이라는 세 가지 프로그래밍 모델을 제공합니다.

다음 정보는 이러한 모델과 해당 API를 소개하고 이러한 모델과 해당 API를 어떻게, 언제 사용하는지에 대한 예제를 제공하며 AWS SDK for .NET의 추가 DynamoDB 프로그래밍 리소스에 대한 링크를 제공합니다.

## 하위 수준 모델
<a name="dynamodb-intro-apis-low-level"></a>

하위 레벨 프로그래밍 모델은 DynamoDB 서비스에 대한 직접적인 호출을 래핑합니다. [Amazon.DynamoDBv2](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/NDynamoDBv2.html) 네임스페이스를 통해 이 모델에 액세스합니다.

세 모델 중에서 하위 수준 모델은 사용자가 코드 대부분을 작성해야 합니다. 예를 들면 .NET 데이터 형식을 동등한 DynamoDB 데이터 형식으로 전환해야 합니다. 그러나 이 모델을 사용하면 대부분의 기능에 액세스할 수 있습니다.

다음 예제에서는 하위 레벨 모델을 사용하여 DynamoDB에서 테이블을 생성하고 테이블을 수정하며 테이블에 항목을 삽입하는 방법을 보여줍니다.

### 표 생성
<a name="dynamodb-intro-apis-low-level-create-table"></a>

다음 예제에서는 `CreateTable` 클래스의 `AmazonDynamoDBClient` 메서드를 사용하여 테이블을 생성합니다. `CreateTable` 메서드에서는 필수 항목 속성 이름, 기본 키 정의, 처리 용량과 같은 특성이 저장된 `CreateTableRequest` 클래스의 인스턴스를 사용합니다. `CreateTable` 메서드는 `CreateTableResponse` 클래스의 인스턴스를 반환합니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();

Console.WriteLine("Getting list of tables");
List<string> currentTables = client.ListTables().TableNames;
Console.WriteLine("Number of tables: " + currentTables.Count);
if (!currentTables.Contains("AnimalsInventory"))
{
    var request = new CreateTableRequest
    {
        TableName = "AnimalsInventory",
        AttributeDefinitions = new List<AttributeDefinition>
      {
        new AttributeDefinition
        {
          AttributeName = "Id",
          // "S" = string, "N" = number, and so on.
          AttributeType = "N"
        },
        new AttributeDefinition
        {
          AttributeName = "Type",
          AttributeType = "S"
        }
      },
        KeySchema = new List<KeySchemaElement>
      {
        new KeySchemaElement
        {
          AttributeName = "Id",
          // "HASH" = hash key, "RANGE" = range key.
          KeyType = "HASH"
        },
        new KeySchemaElement
        {
          AttributeName = "Type",
          KeyType = "RANGE"
        },
      },
        ProvisionedThroughput = new ProvisionedThroughput
        {
            ReadCapacityUnits = 10,
            WriteCapacityUnits = 5
        },
    };

    var response = client.CreateTable(request);

    Console.WriteLine("Table created with request ID: " +
      response.ResponseMetadata.RequestId);
}
```

### 테이블이 수정할 준비가 되었는지 확인
<a name="dynamodb-intro-apis-low-level-verify-table"></a>

테이블은 변경 또는 수정 전에 미리 그러한 작업을 할 준비가 되어 있어야 합니다. 다음 예제에서는 하위 레벨 모델을 사용하여 DynamoDB의 테이블이 준비되는지 확인하는 방법을 보여줍니다. 이 예제에서 확인할 대상 테이블은 `DescribeTable` 클래스의 `AmazonDynamoDBClient` 메서드를 통해 참조됩니다. 코드는 5초마다 테이블의 `TableStatus` 속성에 대한 값을 확인합니다. 상태가 `ACTIVE`로 설정되어 있으면 테이블은 수정할 준비가 된 것입니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();      
var status = "";

do
{
  // Wait 5 seconds before checking (again).
  System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));
        
  try
  {
    var response = client.DescribeTable(new DescribeTableRequest
    {
      TableName = "AnimalsInventory"
    });

    Console.WriteLine("Table = {0}, Status = {1}",
      response.Table.TableName,
      response.Table.TableStatus);

    status = response.Table.TableStatus;
  }
  catch (ResourceNotFoundException)
  {
    // DescribeTable is eventually consistent. So you might
    //   get resource not found. 
  }

} while (status != TableStatus.ACTIVE);
```

### 테이블에 항목 삽입
<a name="dynamodb-intro-apis-low-level-insert-item"></a>

다음 예제에서는 하위 레벨 모델을 사용하여 DynamoDB의 테이블에 두 개의 항목을 삽입합니다. 각 항목은 `PutItem` 클래스의 인스턴스를 사용해 `AmazonDynamoDBClient` 클래스의 `PutItemRequest` 메서드를 통해 삽입됩니다. `PutItemRequest` 클래스의 두 인스턴스 각각은 일련의 항목 속성 값과 함께 항목이 삽입될 테이블의 이름을 사용합니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();

var request1 = new PutItemRequest
{
  TableName = "AnimalsInventory",
  Item = new Dictionary<string, AttributeValue>
  {
    { "Id", new AttributeValue { N = "1" }},
    { "Type", new AttributeValue { S = "Dog" }},
    { "Name", new AttributeValue { S = "Fido" }}
  }
};

var request2 = new PutItemRequest
{
  TableName = "AnimalsInventory",
  Item = new Dictionary<string, AttributeValue>
  {
    { "Id", new AttributeValue { N = "2" }},
    { "Type", new AttributeValue { S = "Cat" }},
    { "Name", new AttributeValue { S = "Patches" }}
  }
};
        
client.PutItem(request1);
client.PutItem(request2);
```

## 문서 모델
<a name="dynamodb-intro-apis-document"></a>

문서 프로그래밍 모델을 사용하면 DynamoDB에서 데이터 작업을 더 쉽게 수행할 수 있습니다. 이 모델은 테이블과 테이블 내 항목에 접근하기 위한 목적으로 고안되었습니다. [Amazon.DynamoDBv2.DocumentModel](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/NDynamoDBv2DocumentModel.html) 네임스페이스를 통해 이 모델에 액세스합니다.

하위 레벨 프로그래밍 모델에 비해 문서 모델은 DynamoDB 데이터에 대해 더 쉽게 코딩할 수 있습니다. 예를 들어, 여러 가지 .NET 데이터 형식을 동등한 DynamoDB 데이터 형식으로 전환할 필요가 없습니다. 그러나 이 모델에서는 하위 수준 프로그래밍 모델과 같은 개수의 기능에 액세스하지는 못합니다. 예를 들면 이 모델을 사용하여 테이블의 항목을 생성, 검색, 업데이트 및 삭제할 수 있습니다. 그러나 테이블을 생성하려면 하위 수준 모델을 사용해야 합니다. 객체 지속성 모델에 비해 이 모델은 .NET 객체를 저장, 로드 및 쿼리할 코드를 더 많이 작성해야 합니다.

DynamoDB 문서 프로그래밍 모델에 대한 자세한 내용은 [Amazon DynamoDB 개발자 안내서](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/)의 [.NET: 문서 모델](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKMidLevel.html)을 참조하세요.

다음 섹션에서는 원하는 DynamoDB 테이블의 표현을 생성하는 방법에 대한 정보와 문서 모델을 사용하여 테이블에 항목을 삽입하고 테이블에서 항목을 가져오는 방법에 대한 예를 제공합니다.

### 테이블 표현 생성
<a name="dynamodb-intro-apis-document-table"></a>

이 문서 모델을 사용하여 데이터 작업을 수행하려면 먼저 특정 테이블을 나타내는 `Table` 클래스의 인스턴스를 만들어야 합니다. 이렇게 하는 두 가지 기본 방법이 있습니다.

**LoadTable 방법**

첫 번째 메커니즘은 다음 예제와 마찬가지로 [https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TTable.html](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TTable.html) 클래스의 정적 `LoadTable` 메서드 중 하나를 사용하는 것입니다.

```
var client = new AmazonDynamoDBClient();
Table table = Table.LoadTable(client, "Reply");
```

**참고**  
이 메커니즘은 작동하지만 특정 조건에서는 콜드 스타트 및 스레드 풀 동작으로 인해 추가 지연 시간이나 교착 상태가 발생할 수 있습니다. 이러한 동작에 대한 자세한 내용은 [AWS SDK for .NET에 대한 향상된 DynamoDB 초기화 패턴](https://aws.amazon.com/blogs/developer/improved-dynamodb-initialization-patterns-for-the-aws-sdk-for-net/) 블로그 게시물을 참조하세요.

**TableBuilder**

대체 메커니즘인 [https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TTableBuilder.html](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TTableBuilder.html) 클래스는 [ AWSSDK.DynamoDBv2 NuGet 패키지의 버전 3.7.203](https://www.nuget.org/packages/AWSSDK.DynamoDBv2/3.7.203)에 도입되었습니다. 이 메커니즘은 특정 암시적 메서드 호출, 특히 `DescribeTable` 메서드를 제거하여 위에서 언급한 동작을 해결할 수 있습니다. 이 메커니즘은 다음 예제와 비슷한 방식으로 사용됩니다.

```
var client = new AmazonDynamoDBClient();
var table = new TableBuilder(client, "Reply")
    .AddHashKey("Id", DynamoDBEntryType.String)
    .AddRangeKey("ReplyDateTime", DynamoDBEntryType.String)
    .AddGlobalSecondaryIndex("PostedBy-Message-index", "Author", DynamoDBEntryType.String, "Message", DynamoDBEntryType.String)
    .Build();
```

이 대체 메커니즘에 대한 자세한 내용은 [AWS SDK for .NET에 대한 향상된 DynamoDB 초기화 패턴](https://aws.amazon.com/blogs/developer/improved-dynamodb-initialization-patterns-for-the-aws-sdk-for-net/) 블로그 게시물을 참조하세요.

### 테이블에 항목 삽입
<a name="dynamodb-intro-apis-document-insert-item"></a>

다음 예제에서는 `PutItemAsync` 클래스의 `Table` 메서드를 통해 응답이 Reply 테이블에 삽입됩니다. `PutItemAsync` 메서드는 `Document` 클래스의 인스턴스를 취하고, `Document` 클래스는 단지 초기화된 속성을 모아놓은 것입니다.

```
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;

// Create a representation of the "Reply" table
//  by using one of the mechanisms described previously.

// Then, add a reply to the table.
var newReply = new Document();
newReply["Id"] = Guid.NewGuid().ToString();
newReply["ReplyDateTime"] = DateTime.UtcNow;
newReply["PostedBy"] = "Author1";
newReply["Message"] = "Thank you!";

await table.PutItemAsync(newReply);
```

### 테이블에서 항목 가져오기
<a name="dynamodb-intro-apis-document-get-item"></a>

다음 예제에서는 `GetItemAsync` 클래스의 `Table` 메서드를 통해 응답을 가져옵니다. 가져올 응답을 결정하기 위해 `GetItemAsync` 메서드는 대상 응답의 해시 및 범위 프라이머리 키를 사용합니다.

```
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;

// Create a representation of the "Reply" table
//  by using one of the mechanisms described previously.

// Then, get a reply from the table
//  where "guid" is the hash key and "datetime" is the range key.
var reply = await table.GetItemAsync(guid, datetime);
Console.WriteLine("Id = " + reply["Id"]);
Console.WriteLine("ReplyDateTime = " + reply["ReplyDateTime"]);
Console.WriteLine("PostedBy = " + reply["PostedBy"]);
Console.WriteLine("Message = " + reply["Message"]);
```

앞서 본 예제에서는 `WriteLine` 메서드를 위해 테이블 값을 문자열로 묵시적으로 변환합니다. `DynamoDBEntry` 클래스의 다양한 "As[type]" 메서드를 사용하여 명시적인 변환을 할 수 있습니다. 예를 들면 다음과 같이 `AsGuid()` 메서드를 통해 `Id`에 대한 값을 `Primitive` 데이터 형식에서 GUID로 묵시적으로 변환할 수 있습니다.

```
var guid = reply["Id"].AsGuid();
```

## 객체 지속성 모델
<a name="dynamodb-intro-apis-object-persistence"></a>

객체 지속성 프로그래밍 모델은 특히 DynamoDB에서 .NET 객체를 저장, 로드 및 쿼리하기 위해 설계되었습니다. [Amazon.DynamoDBv2.DataModel](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/NDynamoDBv2DataModel.html) 네임스페이스를 통해 이 모델에 액세스합니다.

세 가지 모델 중에서 객체 지속성 모델은 DynamoDB 데이터를 저장, 로드 또는 쿼리할 때마다 가장 쉽게 코딩할 수 있습니다. 예를 들면 DynamoDB 데이터 형식을 직접 작업할 수 있습니다. 그러나 이 모델에서는 DynamoDB에서 .NET 객체를 저장, 로드 및 쿼리하는 작업에만 액세스할 수 있습니다. 예를 들면 이 모델을 사용하여 테이블의 항목을 생성, 검색, 업데이트 및 삭제할 수 있습니다. 그러나 먼저 하위 수준 모델을 사용하여 테이블을 생성한 후 이 모델을 사용하여 .NET 클래스를 테이블로 매핑해야 합니다.

DynamoDB 객체 지속성 프로그래밍 모델에 대한 자세한 내용은 [Amazon DynamoDB 개발자 안내서](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/)의 [.NET: 객체 지속성 모델](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html)을 참조하세요.

다음 예제에서는 DynamoDB 항목을 나타내는 .NET 클래스를 정의하고, 항목을 DynamoDB 테이블에 삽입할 .NET 클래스의 인스턴스를 사용하며, .NET 클래스의 인스턴스를 사용하여 테이블에서 항목을 가져오는 방법을 보여줍니다.

### 테이블의 항목을 나타내는 .NET 클래스 정의
<a name="dynamodb-intro-apis-object-persistence-net-class-item"></a>

다음 클래스 정의의 예제에서 `DynamoDBTable` 속성은 테이블 이름을 지정하고, `DynamoDBHashKey` 및 `DynamoDBRangeKey` 속성은 테이블의 해시 및 범위 프라이머리 키를 만듭니다. `DynamoDBGlobalSecondaryIndexHashKey` 속성은 특정 작성자의 답변에 대한 쿼리를 구성할 수 있도록 정의됩니다.

```
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;

[DynamoDBTable("Reply")]
public class Reply
{
    [DynamoDBHashKey]
    public string Id { get; set; }

    [DynamoDBRangeKey(StoreAsEpoch = false)]
    public DateTime ReplyDateTime { get; set; }

    [DynamoDBGlobalSecondaryIndexHashKey("PostedBy-Message-Index",
        AttributeName ="PostedBy")]
    public string Author { get; set; }

    [DynamoDBGlobalSecondaryIndexRangeKey("PostedBy-Message-Index")]
    public string Message { get; set; }
}
```

### 객체 지속성 모델을 위한 컨텍스트 생성
<a name="dynamodb-intro-apis-object-persistence-context"></a>

DynamoDB에 대한 객체 지속성 프로그래밍 모델을 사용하려면 컨텍스트를 생성해야 합니다. 이 컨텍스트는 DynamoDB에 대한 연결을 제공하고, 테이블 액세스, 다양한 작업 수행, 쿼리 실행을 가능하게 합니다.

**기본 컨텍스트**

다음 예제에서는 가장 기본적인 컨텍스트를 만드는 방법을 보여줍니다.

```
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;

var client = new AmazonDynamoDBClient();
var context = new DynamoDBContext(client);
```

**DisableFetchingTableMetadata 속성이 포함된 컨텍스트**

다음 예제는 `DescribeTable` 메서드에 대한 암시적 호출을 방지하기 위해 `DynamoDBContextConfig` 클래스의 `DisableFetchingTableMetadata` 속성을 추가로 설정하는 방법을 보여줍니다.

```
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;

var client = new AmazonDynamoDBClient();
var context = new DynamoDBContext(client, new DynamoDBContextConfig
{
    DisableFetchingTableMetadata = true
});
```

첫 번째 예제와 같이 `DisableFetchingTableMetadata` 속성을 `false`(기본값)로 설정하면 `Reply` 클래스에서 테이블 항목의 키 및 인덱스 구조를 설명하는 속성을 생략할 수 있습니다. 대신 `DescribeTable` 메서드에 대한 암시적 호출을 통해 이러한 속성을 유추합니다. `DisableFetchingTableMetadata`를 `true`로 설정하면 두 번째 예제에서 볼 수 있듯이, `SaveAsync` 및 `QueryAsync`와 같은 객체 지속성 모델의 메서드는 `Reply` 클래스에 정의된 속성에 전적으로 의존합니다. 이 경우 `DescribeTable` 메서드에 대한 호출은 발생하지 않습니다.

**참고**  
특정 조건에서 `DescribeTable` 메서드에 대한 호출은 콜드 스타트 및 스레드 풀 동작으로 인해 추가 지연 시간이나 교착 상태가 발생할 수 있습니다. 이러한 이유로 해당 메서드에 대한 호출을 피하는 것이 유리한 경우도 있습니다.  
이러한 동작에 대한 자세한 내용은 [AWS SDK for .NET에 대한 향상된 DynamoDB 초기화 패턴](https://aws.amazon.com/blogs/developer/improved-dynamodb-initialization-patterns-for-the-aws-sdk-for-net/) 블로그 게시물을 참조하세요.

### .NET 클래스의 인스턴스를 사용하여 테이블에 항목을 삽입
<a name="dynamodb-intro-apis-object-persistence-net-insert-item"></a>

이 예제에서는 해당 항목을 나타내는 .NET 클래스의 초기화 인스턴스를 취하는 `SaveAsync` 클래스의 `DynamoDBContext` 메서드를 통해 항목이 삽입됩니다.

```
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;

// Create an appropriate context for the object persistence programming model,
//  examples of which have been described earlier.

// Create an object that represents the new item.
var reply = new Reply()
{
    Id = Guid.NewGuid().ToString(),
    ReplyDateTime = DateTime.UtcNow,
    Author = "Author1",
    Message = "Thank you!"
};

// Insert the item into the table.
await context.SaveAsync<Reply>(reply, new DynamoDBOperationConfig
{
    IndexName = "PostedBy-Message-index"
});
```

### .NET 클래스의 인스턴스를 사용하여 테이블에서 항목을 가져오기
<a name="dynamodb-intro-apis-object-persistence-net-get-item"></a>

이 예제에서는 `DynamoDBContext` 클래스의 `QueryAsync` 메서드를 사용하여 "Author1"의 모든 레코드를 찾는 쿼리를 만듭니다. 그런 다음 쿼리의 `GetNextSetAsync` 메서드를 통해 항목을 검색합니다.

```
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;

// Create an appropriate context for the object persistence programming model,
//  examples of which have been described earlier.

// Construct a query that finds all replies by a specific author.
var query = context.QueryAsync<Reply>("Author1", new DynamoDBOperationConfig
{
    IndexName = "PostedBy-Message-index"
});

// Display the result.
var set = await query.GetNextSetAsync();
foreach (var item in set)
{
    Console.WriteLine("Id = " + item.Id);
    Console.WriteLine("ReplyDateTime = " + item.ReplyDateTime);
    Console.WriteLine("PostedBy = " + item.Author);
    Console.WriteLine("Message = " + item.Message);
}
```

### 객체 지속성 모델에 대한 추가 정보
<a name="dynamodb-intro-apis-object-persistence-more-into"></a>

위에 표시된 예제와 설명에는 `DisableFetchingTableMetadata`라는 `DynamoDBContext` 클래스의 속성이 포함되는 경우가 있습니다. [AWSSDK.DynamoDBv2 NuGet 패키지 버전 3.7.203](https://www.nuget.org/packages/AWSSDK.DynamoDBv2/3.7.203)에 도입된 이 속성을 사용하면 콜드 스타트 및 스레드 풀 동작으로 인해 추가 지연 시간이나 교착 상태가 발생할 수 있는 특정 조건을 피할 수 있습니다. 자세한 내용은 [AWS SDK for .NET에 대한 향상된 DynamoDB 초기화 패턴](https://aws.amazon.com/blogs/developer/improved-dynamodb-initialization-patterns-for-the-aws-sdk-for-net/) 블로그 게시물을 참조하세요.

다음은 이 속성에 대한 몇 가지 추가 정보입니다.
+ .NET Framework를 사용하는 경우 `app.config` 또는 `web.config` 파일에서 이 속성을 전역적으로 설정할 수 있습니다.
+ 다음 예제와 같이 [https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Amazon/TAWSConfigsDynamoDB.html](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Amazon/TAWSConfigsDynamoDB.html) 클래스를 사용하여 이 속성을 전역적으로 설정할 수 있습니다.

  ```
  // Set the DisableFetchingTableMetadata property globally
  // before constructing any context objects.
  AWSConfigsDynamoDB.Context.DisableFetchingTableMetadata = true;
  
  var client = new AmazonDynamoDBClient();
  var context = new DynamoDBContext(client);
  ```
+ 경우에 따라 DynamoDB 속성을 .NET 클래스에 추가할 수 없습니다(예: 클래스가 종속성으로 정의된 경우). 이러한 경우에도 `DisableFetchingTableMetadata` 속성을 계속 활용할 수 있습니다. 이렇게 하려면 `DisableFetchingTableMetadata` 속성과 함께 [https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TTableBuilder.html](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/DynamoDBv2/TTableBuilder.html) 클래스를 사용합니다. 또한 `TableBuilder` 클래스는 [ AWSSDK.DynamoDBv2 NuGet 패키지의 버전 3.7.203](https://www.nuget.org/packages/AWSSDK.DynamoDBv2/3.7.203)에 도입되었습니다.

  ```
  // Set the DisableFetchingTableMetadata property globally
  // before constructing any context objects.
  AWSConfigsDynamoDB.Context.DisableFetchingTableMetadata = true;
  
  var client = new AmazonDynamoDBClient();
  var context = new DynamoDBContext(client);
  
  var table = new TableBuilder(client, "Reply")
      .AddHashKey("Id", DynamoDBEntryType.String)
      .AddRangeKey("ReplyDateTime", DynamoDBEntryType.String)
      .AddGlobalSecondaryIndex("PostedBy-Message-index", "Author", DynamoDBEntryType.String,
          "Message", DynamoDBEntryType.String)
      .Build();
  
  // This registers the "Reply" table we constructed via the builder.
  context.RegisterTableDefinition(table);
  
  // Now operations like this will work,
  // even if the Reply class was not annotated with this index.
  var query = context.QueryAsync<Reply>("Author1", new DynamoDBOperationConfig()
  {
      IndexName = "PostedBy-Message-index"
  });
  ```

## 추가 정보
<a name="dynamodb-intro-more-info"></a>

 ** AWS SDK for .NET 를 사용하여 DynamoDB 프로그래밍, 정보 및 예제**
+  [DynamoDB API](http://blogs.aws.amazon.com/net/post/Tx17SQHVEMW8MXC/DynamoDB-APIs) 
+  [DynamoDB 시리즈 시작](http://blogs.aws.amazon.com/net/post/Tx2XQOCY08QMTKO/DynamoDB-Series-Kickoff) 
+  [DynamoDB 시리즈 - 문서 모델](http://blogs.aws.amazon.com/net/post/Tx2R0WG46GQI1JI/DynamoDB-Series-Document-Model) 
+  [DynamoDB 시리즈 - 변환 스키마](http://blogs.aws.amazon.com/net/post/Tx2TCOGWG7ARUH5/DynamoDB-Series-Conversion-Schemas) 
+  [DynamoDB 시리즈 - 객체 지속성 모델](http://blogs.aws.amazon.com/net/post/Tx20L86FLMBW51P/DynamoDB-Series-Object-Persistence-Model) 
+  [DynamoDB 시리즈 - 표현식](http://blogs.aws.amazon.com/net/post/TxZQM7VA9AUZ9L/DynamoDB-Series-Expressions) 
+  [Amazon DynamoDB 및에서 표현식 사용 AWS SDK for .NET](dynamodb-expressions.md) 
+  [Amazon DynamoDB의 JSON 지원](dynamodb-json.md) 

 **하위 레벨 모델 정보 및 예제** 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 테이블 작업](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetWorkingWithTables.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 항목 작업](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetItemCRUD.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 테이블 쿼리](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetQuerying.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 테이블 스캔](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetScanning.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 로컬 보조 인덱스 작업](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSILowLevelDotNet.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 글로벌 보조 인덱스 작업](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSILowLevelDotNet.html) 

 **문서 모델, 정보 및 예제** 
+  [DynamoDB 데이터 형식](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes) 
+  [DynamoDBEntry](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TDynamoDBv2DocumentModelDynamoDBEntry.html) 
+  [.NET: 문서 모델](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKMidLevel.html) 

 **객체 지속성 모델 정보 및 예제** 
+  [.NET: 객체 지속성 모델](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html) 

 **기타 유용한 정보** 
+ .NET Aspire를 통한 Amazon DynamoDB 로컬 개발에 대한 자세한 내용은 [.NET Aspire와 AWS 통합](aspire-integrations.md) 섹션을 참조하세요.

**Topics**
+ [

## 하위 수준 모델
](#dynamodb-intro-apis-low-level)
+ [

## 문서 모델
](#dynamodb-intro-apis-document)
+ [

## 객체 지속성 모델
](#dynamodb-intro-apis-object-persistence)
+ [

## 추가 정보
](#dynamodb-intro-more-info)
+ [표현식 사용](dynamodb-expressions.md)
+ [JSON 지원](dynamodb-json.md)

# Amazon DynamoDB 및에서 표현식 사용 AWS SDK for .NET
<a name="dynamodb-expressions"></a>

**참고**  
이 주제의 정보는 .NET Framework 및 AWS SDK for .NET 버전 3.3 이하를 기반으로 하는 프로젝트에만 해당됩니다.

다음 코드 예제에서는를 사용하여 표현식으로 DynamoDB AWS SDK for .NET 를 프로그래밍하는 방법을 보여줍니다. *표현식*은 DynamoDB 테이블의 항목에서 읽을 속성을 나타냅니다. 또한 항목을 쓸 때도 표현식을 사용하여 충족해야 할 조건(*조건부 업데이트*라고도 함)을 나타내고 속성을 업데이트하는 방식을 나타낼 수 있습니다. 일부 업데이트 예에서는 속성을 새 값으로 바꾸거나 새 데이터를 목록이나 맵에 추가합니다. 자세한 내용은 [표현식을 사용하여 항목 읽기 및 쓰기](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.html)를 참조하십시오.

**Topics**
+ [

## 샘플 데이터
](#dynamodb-expressions-sample-data)
+ [

## 표현식 및 항목의 기본 키를 사용한 단일 항목 조회
](#dynamodb-expressions-get-item)
+ [

## 표현식 및 테이블의 기본 키를 사용한 다수 항목 조회
](#dynamodb-expressions-query)
+ [

## 표현식 및 기타 항목 속성을 사용한 다수 항목 조회
](#dynamodb-expressions-scan)
+ [

## 항목 출력
](#dynamodb-expressions-print-item)
+ [

## 표현식을 사용한 항목 생성 및 교체
](#dynamodb-expressions-put-item)
+ [

## 표현식을 사용한 항목 업데이트
](#dynamodb-expressions-update-item)
+ [

## 표현식을 사용한 항목 삭제
](#dynamodb-expressions-delete-item)
+ [

## 추가 정보
](#dynamodb-expressions-resources)

## 샘플 데이터
<a name="dynamodb-expressions-sample-data"></a>

이 주제의 코드 예제는 `ProductCatalog`라는 DynamoDB 테이블에 있는 다음 두 가지 예제 항목에 의존합니다. 이 항목들은 가상의 자전거 점포 카탈로그에 있는 제품 항목에 대한 정보를 알려줍니다. 이러한 항목은 [사례 연구: ProductCatalog 항목](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.CaseStudy.html)에서 제공하는 예제를 기반으로 합니다. `BOOL`, `L`, `M`, `N`, `NS`, `S`, `SS`과 같은 데이터 형식 서술자는 [JSON 데이터 형식](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataFormat.html)의 서술자와 일치합니다.

```
{
  "Id": {
    "N": "205"
  },
  "Title": {
    "S": "20-Bicycle 205"
  },
  "Description": {
    "S": "205 description"
  },
  "BicycleType": {
    "S": "Hybrid"
  },
  "Brand": {
    "S": "Brand-Company C"
  },
  "Price": {
    "N": "500"
  },
  "Gender": {
    "S": "B"
  },
  "Color": {
    "SS": [
      "Red",
      "Black"
    ]
  },
  "ProductCategory": {
    "S": "Bike"
  },
  "InStock": {
    "BOOL": true
  },
  "QuantityOnHand": {
    "N": "1"
  },
  "RelatedItems": {
    "NS": [
      "341",
      "472",
      "649"
    ]
  },
  "Pictures": {
    "L": [
      {
        "M": {
          "FrontView": {
            "S": "http://example/products/205_front.jpg"
          }
        }
      },
      {
        "M": {
          "RearView": {
            "S": "http://example/products/205_rear.jpg"
          }
        }
      },
      {
        "M": {
          "SideView": {
            "S": "http://example/products/205_left_side.jpg"
          }
        }
      }
    ]
  },
  "ProductReviews": {
    "M": {
      "FiveStar": {
        "SS": [
          "Excellent! Can't recommend it highly enough! Buy it!",
          "Do yourself a favor and buy this."
        ]
      },
      "OneStar": {
        "SS": [
          "Terrible product! Do not buy this."
        ]
      }
    }
  }
},
{
  "Id": {
    "N": "301"
  },
  "Title": {
    "S": "18-Bicycle 301"
  },
  "Description": {
    "S": "301 description"
  },
  "BicycleType": {
    "S": "Road"
  },
  "Brand": {
    "S": "Brand-Company C"
  },
  "Price": {
    "N": "185"
  },
  "Gender": {
    "S": "F"
  },
  "Color": {
    "SS": [
      "Blue",
      "Silver"
    ]
  },
  "ProductCategory": {
    "S": "Bike"
  },
  "InStock": {
    "BOOL": true
  },
  "QuantityOnHand": {
    "N": "3"
  },
  "RelatedItems": {
    "NS": [
      "801",
      "822",
      "979"
    ]
  },
  "Pictures": {
    "L": [
      {
        "M": {
          "FrontView": {
            "S": "http://example/products/301_front.jpg"
          }
        }
      },
      {
        "M": {
          "RearView": {
            "S": "http://example/products/301_rear.jpg"
          }
        }
      },
      {
        "M": {
          "SideView": {
            "S": "http://example/products/301_left_side.jpg"
          }
        }
      }
    ]
  },
  "ProductReviews": {
    "M": {
      "FiveStar": {
        "SS": [
          "My daughter really enjoyed this bike!"
        ]
      },
      "ThreeStar": {
        "SS": [
          "This bike was okay, but I would have preferred it in my color.",
	      "Fun to ride."
        ]
      }
    }
  }
}
```

## 표현식 및 항목의 기본 키를 사용한 단일 항목 조회
<a name="dynamodb-expressions-get-item"></a>

다음 예제에는 `Amazon.DynamoDBv2.AmazonDynamoDBClient.GetItem`의 `Id`가 있는 항목을 조회하여 출력하는 데 사용할 `205` 메서드와 일련의 표현식이 포함되어 있습니다. 항목 속성 중에서 `Id`, `Title`, `Description`, `Color`, `RelatedItems`, `Pictures`, `ProductReviews` 속성만 반환됩니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();
var request = new GetItemRequest
{
  TableName = "ProductCatalog",
  ProjectionExpression = "Id, Title, Description, Color, #ri, Pictures, #pr",
  ExpressionAttributeNames = new Dictionary<string, string>
  {
    { "#pr", "ProductReviews" },
    { "#ri", "RelatedItems" }
  },
  Key = new Dictionary<string, AttributeValue>
  {
    { "Id", new AttributeValue { N = "205" } }
  },
};
var response = client.GetItem(request);

// PrintItem() is a custom function.
PrintItem(response.Item);
```

앞서 다룬 예제에서 `ProjectionExpression` 속성은 반환될 속성을 지정합니다. `ExpressionAttributeNames` 속성에서는 `#pr` 속성을 나타낼 자리표시자 `ProductReviews`과 `#ri` 속성을 나타낼 자리표시자 `RelatedItems`를 지정합니다. `PrintItem`에 대한 호출은 [항목 인쇄](#dynamodb-expressions-print-item)의 설명과 같이 사용자 지정 함수를 참조합니다.

## 표현식 및 테이블의 기본 키를 사용한 다수 항목 조회
<a name="dynamodb-expressions-query"></a>

다음 예제에는 `Amazon.DynamoDBv2.AmazonDynamoDBClient.Query`의 값이 `Id`보다 큰 경우에 한해 `301`의 `Price`가 있는 항목을 조회하여 출력하는 데 사용할 `150` 메서드와 일련의 표현식이 포함되어 있습니다. 항목의 속성 중에서 반환되는 속성은 `Id`와 `Title`, 그리고 `ThreeStar`의 모든 `ProductReviews` 속성뿐입니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();
var request = new QueryRequest
{
  TableName = "ProductCatalog",
  KeyConditions = new Dictionary<string,Condition>
  {
    { "Id", new Condition()
      {
        ComparisonOperator = ComparisonOperator.EQ,
        AttributeValueList = new List<AttributeValue>
        {
          new AttributeValue { N = "301" }
        }
      }
    }
  },
  ProjectionExpression = "Id, Title, #pr.ThreeStar",
  ExpressionAttributeNames = new Dictionary<string, string>
  {
    { "#pr", "ProductReviews" },
    { "#p", "Price" }
  },
  ExpressionAttributeValues = new Dictionary<string,AttributeValue>
  {
    { ":val", new AttributeValue { N = "150" } }
  },
  FilterExpression = "#p > :val"
};
var response = client.Query(request);

foreach (var item in response.Items)
{
  // Write out the first page of an item's attribute keys and values.
  // PrintItem() is a custom function.
  PrintItem(item);
  Console.WriteLine("=====");
}
```

앞서 다룬 예제에서 `ProjectionExpression` 속성은 반환될 속성을 지정합니다. `ExpressionAttributeNames` 속성은 `ProductReviews` 속성을 나타내는 자리 표시자 `#pr` 및 `Price` 속성을 나타내는 자리 표시자 `#p`를 지정합니다. `#pr.ThreeStar`는 `ThreeStar` 속성만 반환하도록 지정합니다. `ExpressionAttributeValues` 속성에서는 `:val`이라는 값을 나타낼 자리표시자 `150`을 지정합니다. `FilterExpression` 속성은 `#p`(`Price`)가 `:val`(`150`)보다 커야 한다는 조건을 지정합니다. `PrintItem`에 대한 호출은 [항목 인쇄](#dynamodb-expressions-print-item)의 설명과 같이 사용자 지정 함수를 참조합니다.

## 표현식 및 기타 항목 속성을 사용한 다수 항목 조회
<a name="dynamodb-expressions-scan"></a>

다음 예제에는 `Amazon.DynamoDBv2.AmazonDynamoDBClient.Scan`의 `ProductCategory`가 있는 항목을 모두 조회하여 출력하는 데 사용할 `Bike` 메서드와 일련의 표현식이 포함되어 있습니다. 항목의 속성 중에서 반환되는 속성은 `Id`와 `Title`, 그리고 `ProductReviews`의 모든 속성뿐입니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();
var request = new ScanRequest
{
  TableName = "ProductCatalog",
  ProjectionExpression = "Id, Title, #pr",
  ExpressionAttributeValues = new Dictionary<string,AttributeValue>
  {
    { ":catg", new AttributeValue { S = "Bike" } }
  },
  ExpressionAttributeNames = new Dictionary<string, string>
  {
    { "#pr", "ProductReviews" },
    { "#pc", "ProductCategory" }
  },
  FilterExpression = "#pc = :catg",  
};
var response = client.Scan(request);

foreach (var item in response.Items)
{
  // Write out the first page/scan of an item's attribute keys and values.
  // PrintItem() is a custom function.
  PrintItem(item);
  Console.WriteLine("=====");
}
```

앞서 다룬 예제에서 `ProjectionExpression` 속성은 반환될 속성을 지정합니다. `ExpressionAttributeNames` 속성에서는 `#pr` 속성을 나타낼 자리표시자 `ProductReviews`과 `#pc` 속성을 나타낼 자리표시자 `ProductCategory`를 지정합니다. `ExpressionAttributeValues` 속성에서는 `:catg`이라는 값을 나타낼 자리표시자 `Bike`을 지정합니다. `FilterExpression` 속성에서는 `#pc`(`ProductCategory`)가 `:catg`(`Bike`)와 같아야 한다는 조건을 지정합니다. `PrintItem`에 대한 호출은 [항목 인쇄](#dynamodb-expressions-print-item)의 설명과 같이 사용자 지정 함수를 참조합니다.

## 항목 출력
<a name="dynamodb-expressions-print-item"></a>

다음 예제에서는 항목의 속성과 값을 출력하는 방법을 보여줍니다. 이 예제는 [표현식 및 항목의 기본 키를 사용하여 단일 항목 가져오기](#dynamodb-expressions-get-item), [표현식 및 테이블의 기본 키를 사용하여 다중 항목 가져오기](#dynamodb-expressions-query), [표현식 및 기타 항목 속성을 사용하여 다중 항목 가져오기](#dynamodb-expressions-scan) 방법을 보여주는 앞의 예제에서 사용됩니다.

```
// using Amazon.DynamoDBv2.Model;

// Writes out an item's attribute keys and values.
public static void PrintItem(Dictionary<string, AttributeValue> attrs)
{
  foreach (KeyValuePair<string, AttributeValue> kvp in attrs)
  {
    Console.Write(kvp.Key + " = ");
    PrintValue(kvp.Value);
  }
}

// Writes out just an attribute's value.
public static void PrintValue(AttributeValue value)
{
  // Binary attribute value.
  if (value.B != null)
  {
    Console.Write("Binary data");
  }
  // Binary set attribute value.
  else if (value.BS.Count > 0)
  {
    foreach (var bValue in value.BS)
    {
      Console.Write("\n  Binary data");
    }
  }
  // List attribute value.
  else if (value.L.Count > 0)
  {
    foreach (AttributeValue attr in value.L)
    {
      PrintValue(attr);
    }
  }
  // Map attribute value.
  else if (value.M.Count > 0)
  {
    Console.Write("\n");
    PrintItem(value.M);
  }
  // Number attribute value.
  else if (value.N != null)
  {
    Console.Write(value.N);
  }
  // Number set attribute value.
  else if (value.NS.Count > 0)
  {
    Console.Write("{0}", string.Join("\n", value.NS.ToArray()));
  }
  // Null attribute value.
  else if (value.NULL)
  {
    Console.Write("Null");
  }
  // String attribute value.
  else if (value.S != null)
  {
    Console.Write(value.S);
  }
  // String set attribute value.
  else if (value.SS.Count > 0)
  {
    Console.Write("{0}", string.Join("\n", value.SS.ToArray()));
  }
  // Otherwise, boolean value.
  else
  {
    Console.Write(value.BOOL);
  }
 
  Console.Write("\n");
}
```

앞서 다룬 예제에서는 속성을 출력할 정확한 형식을 결정하기 위해 평가할 수 있는 몇 가지 데이터 형식별 속성이 각 속성 값에 있습니다. 이러한 속성에는 [JSON 데이터 형식](DataFormat.html)에 해당하는 `B`, `BOOL`, `BS`, `L`, `M`, `N`, `NS`, `NULL`, `S` 및 `SS`가 포함됩니다. `B`, `N`, `NULL`, `S`와 같은 속성의 경우에는 상응하는 속성이 `null`이 아니라면 그 속성은 상응하는 `null` 아닌 데이터 형식에 대한 것입니다. `BS`, `L`, `M`, `NS`, `SS`와 같은 속성의 경우에는 `Count` 값이 0보다 크다면 그 속성은 상응하는 0 아닌 값 데이터 형식에 대한 것입니다. 그 속성의 데이터 형식별 속성 전체가 `null`이거나 `Count` 값이 0인 경우에 그 속성은 `BOOL` 데이터 형식에 상응하는 것입니다.

## 표현식을 사용한 항목 생성 및 교체
<a name="dynamodb-expressions-put-item"></a>

다음 예제에는 `Amazon.DynamoDBv2.AmazonDynamoDBClient.PutItem`의 `Title`이 있는 항목을 업데이트하는 데 사용할 `18-Bicycle 301` 메서드와 일련의 표현식이 포함되어 있습니다. 항목이 아직 없으면 새 항목이 추가됩니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();
var request = new PutItemRequest
{
  TableName = "ProductCatalog",
  ExpressionAttributeNames = new Dictionary<string, string>
  {
    { "#title", "Title" }
  },
  ExpressionAttributeValues = new Dictionary<string, AttributeValue>
  {
    { ":product", new AttributeValue { S = "18-Bicycle 301" } }
  },
  ConditionExpression = "#title = :product", 
  // CreateItemData() is a custom function.
  Item = CreateItemData()
};
client.PutItem(request);
```

앞서 다룬 예제에서 `ExpressionAttributeNames` 속성은 `#title` 속성을 나타낼 자리표시자 `Title`을 지정합니다. `ExpressionAttributeValues` 속성에서는 `:product`이라는 값을 나타낼 자리표시자 `18-Bicycle 301`을 지정합니다. `ConditionExpression` 속성에서는 `#title`(`Title`)가 `:product`(`18-Bicycle 301`)와 같아야 한다는 조건을 지정합니다. `CreateItemData`에 대한 호출은 다음과 같은 사용자 지정 함수를 참조합니다.

```
// using Amazon.DynamoDBv2.Model;

// Provides a sample item that can be added to a table.
public static Dictionary<string, AttributeValue> CreateItemData()
{
  var itemData = new Dictionary<string, AttributeValue>
  {
    { "Id", new AttributeValue { N = "301" } },
    { "Title", new AttributeValue { S = "18\" Girl's Bike" } },
    { "BicycleType", new AttributeValue { S = "Road" } },
    { "Brand" , new AttributeValue { S = "Brand-Company C" } },
    { "Color", new AttributeValue { SS = new List<string>{ "Blue", "Silver" } } },
    { "Description", new AttributeValue { S = "301 description" } },
    { "Gender", new AttributeValue { S = "F" } },
    { "InStock", new AttributeValue { BOOL = true } },
    { "Pictures", new AttributeValue { L = new List<AttributeValue>{ 
      { new AttributeValue { M = new Dictionary<string,AttributeValue>{
        { "FrontView", new AttributeValue { S = "http://example/products/301_front.jpg" } } } } },
      { new AttributeValue { M = new Dictionary<string,AttributeValue>{
        { "RearView", new AttributeValue {S = "http://example/products/301_rear.jpg" } } } } },
      { new AttributeValue { M = new Dictionary<string,AttributeValue>{
        { "SideView", new AttributeValue { S = "http://example/products/301_left_side.jpg" } } } } }
    } } },
    { "Price", new AttributeValue { N = "185" } },
    { "ProductCategory", new AttributeValue { S = "Bike" } },
    { "ProductReviews", new AttributeValue { M = new Dictionary<string,AttributeValue>{
      { "FiveStar", new AttributeValue { SS = new List<string>{
        "My daughter really enjoyed this bike!" } } },
      { "OneStar", new AttributeValue { SS = new List<string>{
        "Fun to ride.",
        "This bike was okay, but I would have preferred it in my color." } } }
    } } },
    { "QuantityOnHand", new AttributeValue { N = "3" } },
    { "RelatedItems", new AttributeValue { NS = new List<string>{ "979", "822", "801" } } }
  };

  return itemData;
}
```

앞서 다룬 예제에서 샘플 데이터가 있는 예제 항목은 호출자에게 반환됩니다. 일련의 속성과 해당 값은 [JSON 데이터 형식](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataFormat.html)에 해당하는 `BOOL`, `L`, `M`, `N`, `NS`, `S` 및 `SS` 등의 데이터 유형을 사용하여 구성됩니다.

## 표현식을 사용한 항목 업데이트
<a name="dynamodb-expressions-update-item"></a>

다음 예제에는 `Amazon.DynamoDBv2.AmazonDynamoDBClient.UpdateItem`의 `Title`가 있는 항목에 대해 `18" Girl's Bike`을 `Id`로 변경하는 데 사용할 `301` 메서드와 일련의 표현식이 포함되어 있습니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();
var request = new UpdateItemRequest
{
  TableName = "ProductCatalog",
  Key = new Dictionary<string,AttributeValue>
  {
     { "Id", new AttributeValue { N = "301" } }
  },
  ExpressionAttributeNames = new Dictionary<string, string>
  {
    { "#title", "Title" }
  },
  ExpressionAttributeValues = new Dictionary<string, AttributeValue>
  {
    { ":newproduct", new AttributeValue { S = "18\" Girl's Bike" } }
  },
  UpdateExpression = "SET #title = :newproduct"
};
client.UpdateItem(request);
```

앞서 다룬 예제에서 `ExpressionAttributeNames` 속성은 `#title` 속성을 나타낼 자리표시자 `Title`을 지정합니다. `ExpressionAttributeValues` 속성에서는 `:newproduct`이라는 값을 나타낼 자리표시자 `18" Girl's Bike`을 지정합니다. `UpdateExpression` 속성에서는 `#title`(`Title`)을 `:newproduct`(`18" Girl's Bike`)로 변경하도록 지정합니다.

## 표현식을 사용한 항목 삭제
<a name="dynamodb-expressions-delete-item"></a>

다음 예제에는 항목의 `Title`이 `18-Bicycle 301`인 경우에 한해 `Id`가 `301`인 항목을 삭제하는 데 사용할 `Amazon.DynamoDBv2.AmazonDynamoDBClient.DeleteItem` 메서드와 일련의 표현식이 포함되어 있습니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();
var request = new DeleteItemRequest
{
  TableName = "ProductCatalog",
  Key = new Dictionary<string,AttributeValue>
  {
     { "Id", new AttributeValue { N = "301" } }
  },
  ExpressionAttributeNames = new Dictionary<string, string>
  {
    { "#title", "Title" }
  },
  ExpressionAttributeValues = new Dictionary<string, AttributeValue>
  {
    { ":product", new AttributeValue { S = "18-Bicycle 301" } }
  },
  ConditionExpression = "#title = :product"
};
client.DeleteItem(request);
```

앞서 다룬 예제에서 `ExpressionAttributeNames` 속성은 `#title` 속성을 나타낼 자리표시자 `Title`을 지정합니다. `ExpressionAttributeValues` 속성에서는 `:product`이라는 값을 나타낼 자리표시자 `18-Bicycle 301`을 지정합니다. `ConditionExpression` 속성에서는 `#title`(`Title`)이 `:product`(`18-Bicycle 301`)와 같아야 한다는 조건을 지정합니다.

## 추가 정보
<a name="dynamodb-expressions-resources"></a>

자세한 내용 및 코드 예제는 다음을 참조하십시오.
+  [DynamoDB 시리즈 - 표현식](http://blogs.aws.amazon.com/net/post/TxZQM7VA9AUZ9L/DynamoDB-Series-Expressions) 
+  [프로젝션 식을 사용하여 항목 속성 액세스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html) 
+  [속성 이름 및 값에 자리 표시자 사용](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html) 
+  [조건식을 사용하여한 조건 지정](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html) 
+  [업데이트 식을 사용하여 항목 및 속성 수정](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 항목 작업](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetItemCRUD.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 테이블 쿼리](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetQuerying.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 테이블 스캔](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetScanning.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 로컬 보조 인덱스 작업](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSILowLevelDotNet.html) 
+  [AWS SDK for .NET 하위 수준 API를 사용하여 글로벌 보조 인덱스 작업](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSILowLevelDotNet.html) 

# Amazon DynamoDB의 JSON 지원
<a name="dynamodb-json"></a>

**참고**  
이 주제의 정보는 .NET Framework 및 AWS SDK for .NET 버전 3.3 이하를 기반으로 하는 프로젝트에만 해당됩니다.

는 Amazon DynamoDB로 작업할 때 JSON 데이터를 AWS SDK for .NET 지원합니다. 따라서 DynamoDB 테이블에서 JSON 형식 데이터를 더 쉽게 가져올 수 있으며 JSON 문서를 테이블에 더 쉽게 삽입할 수 있습니다.

**Topics**
+ [

## DynamoDB 테이블에서 JSON 형식으로 데이터 가져오기
](#dynamodb-json-get-table-data)
+ [

## DynamoDB 테이블에 JSON 형식 데이터 삽입
](#dynamodb-json-insert-table-data)
+ [

## JSON으로 DynamoDB 데이터 형식 변환
](#dynamodb-json-datatypes)
+ [

## 추가 정보
](#dynamodb-json-more-info)

## DynamoDB 테이블에서 JSON 형식으로 데이터 가져오기
<a name="dynamodb-json-get-table-data"></a>

다음 예제에서는 DynamoDB 테이블에서 JSON 형식으로 데이터를 가져오는 방법을 보여줍니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.DocumentModel;

var client = new AmazonDynamoDBClient();
var table = Table.LoadTable(client, "AnimalsInventory");
var item = table.GetItem(3, "Horse");

var jsonText = item.ToJson();
Console.Write(jsonText);
      
// Output:
//   {"Name":"Shadow","Type":"Horse","Id":3}

var jsonPrettyText = item.ToJsonPretty();
Console.WriteLine(jsonPrettyText);
      
// Output:
//   {
//     "Name" : "Shadow",
//     "Type" : "Horse",
//     "Id"   : 3
//   }
```

앞의 예제에서는 `Document` 클래스의 `ToJson` 메서드가 테이블의 항목을 JSON 형식 문자열로 변환합니다. 해당 항목은 `Table` 클래스의 `GetItem` 메서드를 통해 가져옵니다. 가져올 항목을 결정하기 위해 이 예제에서는 `GetItem` 메서드가 대상 항목의 해시 및 범위 기본 키를 사용합니다. 항목을 가져올 테이블을 결정하기 위해 `Table` 클래스의 `LoadTable` 메서드는 DynamoDB에서 `AmazonDynamoDBClient` 클래스의 인스턴스와 대상 테이블의 이름을 사용합니다.

## DynamoDB 테이블에 JSON 형식 데이터 삽입
<a name="dynamodb-json-insert-table-data"></a>

다음 예제에서는 JSON 형식을 사용하여 DynamoDB 테이블에 항목을 삽입하는 방법을 보여줍니다.

```
// using Amazon.DynamoDBv2;
// using Amazon.DynamoDBv2.DocumentModel;

var client = new AmazonDynamoDBClient();
var table = Table.LoadTable(client, "AnimalsInventory");
var jsonText = "{\"Id\":6,\"Type\":\"Bird\",\"Name\":\"Tweety\"}";
var item = Document.FromJson(jsonText);

table.PutItem(item);
```

앞의 예제에서는 `FromJson` 클래스의 `Document` 메서드가 JSON 형식 문자열을 항목으로 변환합니다. 해당 항목은 이 항목을 포함하는 `PutItem` 클래스의 인스턴스를 사용하는 `Table` 클래스의 `Document` 메서드를 통해 테이블에 삽입됩니다. 항목을 삽입할 테이블을 결정하기 위해 `Table` 클래스의 `LoadTable` 메서드가 호출되어 DynamoDB에서 `AmazonDynamoDBClient` 클래스의 인스턴스와 대상 테이블의 이름을 지정합니다.

## JSON으로 DynamoDB 데이터 형식 변환
<a name="dynamodb-json-datatypes"></a>

`Document` 클래스의 `ToJson` 메서드를 호출한 다음 그 결과로 얻은 JSON 데이터에서 `FromJson` 메서드를 호출하여 JSON 데이터를 `Document` 클래스의 인스턴스로 다시 변환할 때마다 일부 DynamoDB 데이터 형식은 예상대로 변환되지 않습니다. 구체적으로 설명하면 다음과 같습니다.
+ DynamoDB 세트(`SS`, `NS` 및 `BS` 유형)는 JSON 어레이로 변환됩니다.
+ DynamoDB 이진수 스칼라 및 세트(`B` 및 `BS` 형식)는 base64로 인코딩된 JSON 문자열 또는 문자열 목록으로 변환됩니다.

  이 시나리오에서는 `DecodeBase64Attributes` 클래스의 `Document` 메서드를 호출하여 base64로 인코딩된 JSON 데이터를 정확한 이진수 표시로 바꿔야 합니다. 다음 예제에서는 `Document`라는 `Picture` 클래스의 인스턴스에 있는 base64로 인코딩된 이진수 스칼라 항목 속성을 정확한 이진수 표시로 바꿉니다. 또한 이 예제에서는 다음과 같이 `Document`라는 `RelatedPictures` 클래스의 동일한 인스턴스에 있는 base64로 인코딩된 이진수 세트 항목 속성에 대해 동일한 작업을 합니다.

  ```
  item.DecodeBase64Attributes("Picture", "RelatedPictures");
  ```

## 추가 정보
<a name="dynamodb-json-more-info"></a>

를 사용하여 DynamoDB로 JSON을 프로그래밍하는 방법에 대한 자세한 내용과 예제는 다음을 AWS SDK for .NET참조하세요.
+  [DynamoDB JSON 지원](https://aws.amazon.com/blogs/developer/dynamodb-json-support/) 
+  [Amazon DynamoDB 업데이트 - JSON, 확장 프리 티어, 유연한 조정, 대규모 항목](https://aws.amazon.com/blogs/aws/dynamodb-update-json-and-more/) 