Amazon DynamoDB NoSQL 데이터베이스 사용 - AWS SDK for .NET

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

Amazon DynamoDB NoSQL 데이터베이스 사용

참고

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

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

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

하위 수준 모델

하위 레벨 프로그래밍 모델은 DynamoDB 서비스에 대한 직접적인 호출을 래핑합니다. Amazon.DynamoDBv2 네임스페이스를 통해 이 모델에 액세스합니다.

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

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

표 생성

다음 예제에서는 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); }

테이블이 수정할 준비가 되었는지 확인

테이블은 변경 또는 수정 전에 미리 그러한 작업을 할 준비가 되어 있어야 합니다. 다음 예제에서는 하위 레벨 모델을 사용하여 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);

테이블에 항목 삽입

다음 예제에서는 하위 레벨 모델을 사용하여 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);

문서 모델

문서 프로그래밍 모델을 사용하면 DynamoDB에서 데이터 작업을 더 쉽게 수행할 수 있습니다. 이 모델은 테이블과 테이블 내 항목에 접근하기 위한 목적으로 고안되었습니다. Amazon.DynamoDBv2를 통해 이 모델에 액세스할 수 있습니다. DocumentModel네임스페이스.

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

DynamoDB 문서 프로그래밍 모델에 대한 자세한 내용은 Amazon DynamoDB 개발자 안내서.NET: 문서 모델을 참조하세요.

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

테이블 표현 생성

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

LoadTable 메서드

첫 번째 메커니즘은 다음 예제와 마찬가지로 Table 클래스의 정적 LoadTable 메서드 중 하나를 사용하는 것입니다.

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

이 메커니즘은 작동하지만 특정 조건에서는 콜드 스타트 및 스레드 풀 동작으로 인해 추가 지연 시간이나 교착 상태가 발생할 수 있습니다. 이러한 동작에 대한 자세한 내용은 AWS SDK for .NET에 대한 향상된 DynamoDB 초기화 패턴 블로그 게시물을 참조하세요.

TableBuilder

대체 메커니즘인 TableBuilder클래스는 .DynamoDBv2 패키지 버전 3.7.203에 AWSSDK 도입되었습니다. NuGet 이 메커니즘은 특정 암시적 메서드 호출, 특히 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 초기화 패턴 블로그 게시물을 참조하세요.

테이블에 항목 삽입

다음 예제에서는 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);

테이블에서 항목 가져오기

다음 예제에서는 GetItemAsync 클래스의 Table 메서드를 통해 응답을 가져옵니다. GetItemAsync메서드는 대상 응답의 기본 키를 사용하여 get에 대한 응답을 결정합니다. hash-and-range

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();

객체 지속성 모델

객체 지속성 프로그래밍 모델은 특히 DynamoDB에서 .NET 객체를 저장, 로드 및 쿼리하기 위해 설계되었습니다. Amazon.DynamoDBv2를 통해 이 모델에 액세스할 수 있습니다. DataModel네임스페이스.

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

DynamoDB 객체 지속성 프로그래밍 모델에 대한 자세한 내용은 Amazon DynamoDB 개발자 안내서.NET: 객체 지속성 모델을 참조하세요.

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

테이블의 항목을 나타내는 .NET 클래스 정의

다음 클래스 정의 예제에서 DynamoDBTable 속성은 테이블 이름을 지정하고, DynamoDBHashKeyDynamoDBRangeKey 속성은 테이블의 hash-and-range 기본 키를 모델링합니다. 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; } }

객체 지속성 모델을 위한 컨텍스트 생성

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 메서드에 대한 암시적 호출을 통해 이러한 속성을 유추합니다. DisableFetchingTableMetadatatrue로 설정하면 두 번째 예제에서 볼 수 있듯이, SaveAsyncQueryAsync와 같은 객체 지속성 모델의 메서드는 Reply 클래스에 정의된 속성에 전적으로 의존합니다. 이 경우 DescribeTable 메서드에 대한 호출은 발생하지 않습니다.

참고

특정 조건에서 DescribeTable 메서드에 대한 호출은 콜드 스타트 및 스레드 풀 동작으로 인해 추가 지연 시간이나 교착 상태가 발생할 수 있습니다. 이러한 이유로 해당 메서드에 대한 호출을 피하는 것이 유리한 경우도 있습니다.

이러한 동작에 대한 자세한 내용은 AWS SDK for .NET에 대한 향상된 DynamoDB 초기화 패턴 블로그 게시물을 참조하세요.

.NET 클래스의 인스턴스를 사용하여 테이블에 항목을 삽입

이 예제에서는 해당 항목을 나타내는 .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 클래스의 인스턴스를 사용하여 테이블에서 항목을 가져오기

이 예제에서는 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); }

객체 지속성 모델에 대한 추가 정보

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

다음은 이 속성에 대한 몇 가지 추가 정보입니다.

  • .NET Framework를 사용하는 경우 app.config 또는 web.config 파일에서 이 속성을 전역적으로 설정할 수 있습니다.

  • 다음 예제와 같이 AWSConfigsDynamoDB 클래스를 사용하여 이 속성을 전역적으로 설정할 수 있습니다.

    // 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 속성과 함께 TableBuilder 클래스를 사용합니다. 이 클래스는 .DynamoDBv2 패키지 버전 3.7.203에도 도입되었습니다. TableBuilder AWSSDK NuGet

    // 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" });

추가 정보

를 사용하여 DynamoDB 정보 및 예제를 AWS SDK for .NET 프로그래밍하기**

하위 레벨 모델 정보 및 예제

문서 모델 정보 및 예제

객체 지속성 모델 정보 및 예제