

이제 AWS Mobile SDK for Unity가에 포함됩니다 AWS SDK for .NET. 이 가이드에서는 Mobile SDK for Unity의 아카이브 버전을 참조합니다. 자세한 내용은 [ AWS Mobile SDK for Unity란 무엇입니까?](what-is-unity-plugin.md) 섹션을 참조하세요.

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

# Amazon DynamoDB
<a name="dynamodb"></a>

 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/)는 속도가 빠르고 확장성이 뛰어나며 비용 효과적인 비 관계형 데이터베이스 서비스입니다. DynamoDB는 기존 데이터 스토리지의 확장성 제한을 없애면서도 낮은 지연 시간과 예측 가능한 성능을 유지합니다. DynamoDB에 대한 자세한 내용은 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/)를 참조하십시오.

AWS Mobile SDK for Unity는 DynamoDB에서의 작업을 위한 상위 수준 라이브러리를 제공합니다. 또한 하위 수준 DynamoDB API에 대해 직접 요청을 생성할 수 있지만, 대부분의 사용 사례에서는 상위 수준 라이브러리가 권장됩니다. AmazonDynamoDBClient는 상위 수준 라이브러리에서 특히 유용한 부분입니다. 이 클래스를 사용하여 다양한 생성, 읽기, 업데이트 및 삭제(CRUD) 작업을 수행하고 쿼리를 실행할 수 있습니다.

**참고**  
이 문서의 일부 샘플에서는 ResultText라는 텍스트 상자 변수를 사용하여 추적 출력을 표시하는 것으로 가정합니다.

## Amazon DynamoDB 통합
<a name="integrating-amazon-dynamodb"></a>

Unity 애플리케이션에서 DynamoDB를 사용하려면 Unity SDK를 프로젝트에 추가해야 합니다. 아직 추가하지 않은 경우 [Unity용 SDK를 다운로드](https://aws.amazon.com/mobile/sdk/)하여 [AWS Mobile SDK for Unity 설정](setup-unity.md)의 지침을 따릅니다. Amazon Cognito Identity를 사용하여 애플리케이션에 임시 AWS 자격 증명을 제공할 것을 권장합니다. 이러한 자격 증명은 앱이 AWS 서비스 및 리소스에 액세스하도록 허용합니다.

애플리케이션에서 DynamoDB를 사용하려면 올바른 권한을 설정해야 합니다. 다음 IAM 정책은 사용자가 [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)으로 식별되는 특정 DynamoDB 테이블 내 항목에 대해 삭제, 가져오기, 내보내기, 스캔 및 업데이트 작업을 수행하도록 허용합니다.

```
{
"Statement": [{
    "Effect": "Allow",
    "Action": [
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Scan",
        "dynamodb:UpdateItem"
    ],
    "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"
}]
}
```

이 정책은 Cognito 자격 증명 풀에 할당된 역할에 적용되어야 하지만, ** `Resource` ** 값을 DynamoDB 테이블의 올바른 ARN으로 바꿔야 합니다. Cognito가 새 자격 증명 풀에 대한 역할을 자동으로 생성하며 [IAM 콘솔](https://console.aws.amazon.com/iam/)에서 이 역할에 정책을 적용할 수 있습니다.

앱의 필요에 따라 허용되는 작업을 추가 또는 제거해야 합니다. IAM 정책에 대한 자세한 내용은 [IAM 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_Introduction.html)을 참조하세요. DynamoDB 고유 정책에 대한 자세한 내용은 [IAM을 사용하여 DynamoDB 리소스에 대한 액세스 제어](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html)를 참조하십시오.

## DynamoDB 테이블 생성
<a name="create-a-dynamodb-table"></a>

이제 권한과 자격 증명이 설정되었으므로 애플리케이션을 위한 DynamoDB 테이블을 생성해 보겠습니다. 테이블을 생성하려면 [DynamoDB 콘솔](https://console.aws.amazon.com/dynamodb/home)로 이동하여 다음 단계를 수행합니다.

1. **테이블 만들기**를 클릭합니다.

1. 테이블 이름으로 `Bookstore`를 입력합니다.

1. 기본 키 유형으로 **해시**를 선택합니다.

1. **번호**를 선택하고 해시 속성 이름으로 `id`를 입력합니다. **계속**을 클릭합니다.

1. **계속**을 다시 클릭하여 인덱스 추가를 건너뜁니다.

1. 읽기 용량을 `10`, 쓰기 용량을 `5`로 설정합니다. **계속**을 클릭합니다.

1. 알림 이메일을 입력하고 **계속**을 클릭하여 처리량 경보를 생성합니다.

1. **생성**을 클릭합니다. DynamoDB가 데이터베이스를 생성합니다.

## DynamoDB 클라이언트 생성
<a name="create-a-dynamodb-client"></a>

앱이 DynamoDB 테이블과 상호 작용하려면 클라이언트가 필요합니다. 다음과 같이 기본 DynamodDB 클라이언트를 생성할 수 있습니다.

```
var credentials = new CognitoAWSCredentials(IDENTITY_POOL_ID, RegionEndpoint.USEast1);
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials);
DynamoDBContext Context = new DynamoDBContext(client);
```

AmazonDynamoDBClient 클래스는 DynamoDB API의 진입점입니다. 이 클래스는 다양한 작업 중에서도 테이블을 생성, 설명, 업데이트 및 삭제하기 위한 인스턴스 메서드를 제공합니다. 컨텍스트는 클라이언트에 대한 추상화 계층을 추가하며, 객체 지속성 모델과 같은 추가 기능을 사용할 수 있게 합니다.

## 테이블 설명
<a name="describe-a-table"></a>

DynamoDB 테이블에 대한 설명을 가져오려면 다음 코드를 사용할 수 있습니다.

```
resultText.text +=("\n*** Retrieving table information ***\n");
       var request = new DescribeTableRequest
       {
           TableName = @"ProductCatalog"
       };
       Client.DescribeTableAsync(request, (result) =>
       {
               if (result.Exception != null)
               {
                       resultText.text += result.Exception.Message;
                       Debug.Log(result.Exception);
                       return;
               }
               var response = result.Response;
               TableDescription description = response.Table;
               resultText.text += ("Name: " + description.TableName + "\n");
               resultText.text += ("# of items: " + description.ItemCount + "\n");
               resultText.text += ("Provision Throughput (reads/sec): " +
                   description.ProvisionedThroughput.ReadCapacityUnits + "\n");
               resultText.text += ("Provision Throughput (reads/sec): " +
                   description.ProvisionedThroughput.WriteCapacityUnits + "\n");

       }, null);
   }
```

이 예제에서는 클라이언트 및 DescribeTableRequest 객체를 생성하고 테이블의 이름을 ** `TableName` ** 속성에 할당한 다음 요청 객체를 AmazonDynamoDBClient 객체에 대한 DescribeTableAsync 메서드에 전달합니다. 또한 DescribeTableAsync는 비동기 작업이 완료되면 호출되는 위임을 수임할 수 있습니다.

**참고**  
AmazonDynamoDBClient에 대한 모든 비동기 메서드는 비동기 작업이 완료되면 호출되는 위임을 수임할 수 있습니다.

## 객체 저장
<a name="save-an-object"></a>

객체를 DynamoDB에 저장하려면 AmazonDynamoDBClient 객체의 SaveAsync<T> 메서드를 사용합니다. 여기서 T는 저장할 객체의 유형입니다.

앞서 데이터베이스 ‘Bookstore’를 직접적으로 호출하였으므로 이 주제에 맞춰 도서 관련 속성을 기록하는 데이터 모델을 구현하겠습니다. 다음은 데이터 모델을 정의하는 클래스입니다.

```
[DynamoDBTable("ProductCatalog")]
    public class Book
    {
        [DynamoDBHashKey]   // Hash key.
        public int Id { get; set; }
        [DynamoDBProperty]
        public string Title { get; set; }
        [DynamoDBProperty]
        public string ISBN { get; set; }
        [DynamoDBProperty("Authors")]    // Multi-valued (set type) attribute.
        public List<string> BookAuthors { get; set; }
    }
```

물론, 실제 서점 애플리케이션에는 저자, 가격 등과 같은 추가 필드가 필요합니다. 도서 클래스는 [DynamoDBTable] 속성으로 데코레이트되는데, 이는 도서 객체가 기록될 데이터베이스 테이블을 정의합니다. 도서 클래스의 각 인스턴스에 대한 키는 [DynamoDBHashKey] 속성을 사용하여 식별됩니다. 속성은 [DynamoDBProperty] 속성으로 식별되며, 이들은 데이터베이스 테이블에서 속성이 기록될 열을 지정합니다. 모델이 구성되었으므로 도서 객체를 생성, 검색, 업데이트 및 삭제하기 위한 몇 가지 메서드를 작성할 수 있습니다.

## 도서 생성
<a name="create-a-book"></a>

```
private void PerformCreateOperation()
{
    Book myBook = new Book
    {
        Id = bookID,
        Title = "object persistence-AWS SDK for.NET SDK-Book 1001",
        ISBN = "111-1111111001",
        BookAuthors = new List<string> { "Author 1", "Author 2" },
    };

    // Save the book.
    Context.SaveAsync(myBook,(result)=>{
        if(result.Exception == null)
            resultText.text += @"book saved";
    });
}
```

## 도서 검색
<a name="retrieve-a-book"></a>

```
private void RetrieveBook()
{
    this.displayMessage += "\n*** Load book**\n";
    Context.LoadAsync<Book>(bookID,
                             (AmazonDynamoResult<Book> result) =>
    {
        if (result.Exception != null)
        {

            this.displayMessage += ("LoadAsync error" +result.Exception.Message);
            Debug.LogException(result.Exception);
            return;
        }
        _retrievedBook = result.Response;
        this.displayMessage += ("Retrieved Book: " +
                                "\nId=" + _retrievedBook.Id +
                                "\nTitle=" + _retrievedBook.Title +
                                "\nISBN=" + _retrievedBook.ISBN);
        string authors = "";
        foreach(string author in _retrievedBook.BookAuthors)
            authors += author + ",";
        this.displayMessage += "\nBookAuthor= "+ authors;
        this.displayMessage += ("\nDimensions= "+ _retrievedBook.Dimensions.Length + " X " +
                                _retrievedBook.Dimensions.Height + " X " +
                                _retrievedBook.Dimensions.Thickness);

    }, null);
}
```

## 도서 업데이트
<a name="update-a-book"></a>

```
private void PerformUpdateOperation()
{
    // Retrieve the book.
    Book bookRetrieved = null;
    Context.LoadAsync<Book>(bookID,(result)=>
    {
        if(result.Exception == null )
        {
            bookRetrieved = result.Result as Book;
            // Update few properties.
            bookRetrieved.ISBN = "222-2222221001";
            // Replace existing authors list with this
            bookRetrieved.BookAuthors = new List<string> { "Author 1", "Author x" };
            Context.SaveAsync<Book>(bookRetrieved,(res)=>
            {
                if(res.Exception == null)
                     resultText.text += ("\nBook updated");
            });
        }
   });
}
```

## 도서 삭제
<a name="delete-a-book"></a>

```
private void PerformDeleteOperation()
{
    // Delete the book.
    Context.DeleteAsync<Book>(bookID,(res)=>
    {
        if(res.Exception == null)
        {
            Context.LoadAsync<Book>(bookID,(result)=>
            {
                 Book deletedBook = result.Result;
                 if(deletedBook==null)
                     resultText.text += ("\nBook is deleted");
            });
        }
   });
}
```