기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon DynamoDB NoSQL 데이터베이스 사용
참고
이러한 주제의 프로그래밍 모델은 .NET에 모두 있습니다. 프레임워크 및 .NET (코어)이지만 호출 규칙은 동기식이든 비동기식이든 다릅니다.
는에서 제공하는 빠른 NoSQL 데이터베이스 서비스인 Amazon DynamoDB를 AWS SDK for .NET 지원합니다 AWS. SDK는 DynamoDB와 통신하기 위한 세 가지 프로그래밍 모델, 즉 하위 수준 모델, 문서 모델 및 객체 지속성 모델을 제공합니다.
다음 정보는 이러한 모델과 해당 APIs를 소개하고, 사용 방법과 시기에 대한 예를 제공하며,의 추가 DynamoDB 프로그래밍 리소스에 대한 링크를 제공합니다 AWS SDK for .NET.
하위 수준 모델
하위 레벨 프로그래밍 모델은 DynamoDB 서비스에 대한 직접적인 호출을 래핑합니다. Amazon.DynamoDBv2 네임스페이스를 통해이 모델에 액세스합니다.
세 모델 중에서 하위 수준 모델은 사용자가 코드 대부분을 작성해야 합니다. 예를 들어, DynamoDB에서 .NET 데이터 유형을 동등한 데이터로 변환해야 합니다. 그러나 이 모델을 사용하면 대부분의 기능에 액세스할 수 있습니다.
다음 예제에서는 하위 레벨 모델을 사용하여 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 데이터에 대해 더 쉽게 코딩할 수 있습니다. 예를 들어 DynamoDB에서 .NET 데이터 유형을 해당 데이터 유형으로 변환할 필요가 없습니다. 그러나 이 모델에서는 하위 수준 프로그래밍 모델과 같은 개수의 기능에 액세스하지는 못합니다. 예를 들면 이 모델을 사용하여 테이블의 항목을 생성, 검색, 업데이트 및 삭제할 수 있습니다. 그러나 테이블을 생성하려면 하위 수준 모델을 사용해야 합니다. 객체 지속성 모델에 비해이 모델에서는 .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
클래스는 AWSSDK.DynamoDBv2 NuGet 패키지 버전 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 초기화 패턴
테이블에 항목 삽입
다음 예제에서는 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
메서드는 대상 응답의 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()
서드를 통해의 값을 Primitive
데이터 형식Id
에서 GUID로 명시적으로 변환할 수 있습니다.
var guid = reply["Id"].AsGuid();
객체 지속성 모델
객체 지속성 프로그래밍 모델은 DynamoDB에서 .NET 객체를 저장, 로드 및 쿼리하도록 특별히 설계되었습니다. Amazon.DynamoDBv2.DataModel 네임스페이스를 통해이 모델에 액세스합니다.
세 가지 모델 중에서 객체 지속성 모델은 DynamoDB 데이터를 저장, 로드 또는 쿼리할 때마다 가장 쉽게 코딩할 수 있습니다. 예를 들면 DynamoDB 데이터 형식을 직접 작업할 수 있습니다. 그러나이 모델은 DynamoDB에 .NET 객체를 저장, 로드 및 쿼리하는 작업에 대한 액세스만 제공합니다. 예를 들면 이 모델을 사용하여 테이블의 항목을 생성, 검색, 업데이트 및 삭제할 수 있습니다. 그러나 먼저 하위 수준 모델을 사용하여 테이블을 생성한 다음이 모델을 사용하여 .NET 클래스를 테이블에 매핑해야 합니다.
DynamoDB 객체 지속성 프로그래밍 모델에 대한 자세한 내용은 Amazon DynamoDB 개발자 안내서의 .NET: 객체 지속성 모델을 참조하세요.
다음 예제에서는 DynamoDB 항목을 나타내는 .NET 클래스를 정의하고, .NET 클래스의 인스턴스를 사용하여 DynamoDB 테이블에 항목을 삽입하고, .NET 클래스의 인스턴스를 사용하여 테이블에서 항목을 가져오는 방법을 보여줍니다.
테이블의 항목을 나타내는 .NET 클래스 정의
클래스 정의의 다음 예제에서 DynamoDBTable
속성은 테이블 이름을 지정하는 반면 DynamoDBHashKey
및 DynamoDBRangeKey
속성은 테이블의 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
메서드에 대한 암시적 호출을 통해 이러한 속성을 유추합니다. DisableFetchingTableMetadata
를 true
로 설정하면 두 번째 예제에서 볼 수 있듯이, SaveAsync
및 QueryAsync
와 같은 객체 지속성 모델의 메서드는 Reply
클래스에 정의된 속성에 전적으로 의존합니다. 이 경우 DescribeTable
메서드에 대한 호출은 발생하지 않습니다.
참고
특정 조건에서 DescribeTable
메서드에 대한 호출은 콜드 스타트 및 스레드 풀 동작으로 인해 추가 지연 시간이나 교착 상태가 발생할 수 있습니다. 이러한 이유로 해당 메서드에 대한 호출을 피하는 것이 유리한 경우도 있습니다.
이러한 동작에 대한 자세한 내용은 AWS SDK for .NET에 대한 향상된 DynamoDB 초기화 패턴
.NET 클래스의 인스턴스를 사용하여 테이블에 항목 삽입
이 예제에서는 항목을 나타내는 .NET DynamoDBContext
클래스의 초기화된 인스턴스를 가져오는 클래스의 SaveAsync
메서드를 통해 항목이 삽입됩니다.
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
다음은 이 속성에 대한 몇 가지 추가 정보입니다.
-
.NET를 사용하는 경우
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
클래스를 사용합니다.TableBuilder
클래스는 AWSSDK.DynamoDBv2 NuGet 패키지 버전 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" });
추가 정보
AWS SDK for .NET 를 사용하여 DynamoDB 정보 및 예제 프로그래밍**
하위 레벨 모델 정보 및 예제
문서 모델 정보 및 예제
객체 지속성 모델 정보 및 예제