AWS DynamoDB 를 이용한 data 저장

2024. 3. 25. 00:00AWS

반응형

AWS 에는 KeyValue 기반의 NoSQL Data Service 가 있다. 

DynamoDB 라고 한다. 

.NET 에서 AWS DynamoDB 를 사용하여 Table 을 생성하고 CRUD 하는 간단한 app 을 만들어 보겠다. 

 

DynamoDB 를 이용하여 Programming 하는 방법에는 여러가지가 있는데 

.NET 에는 Document modelObject persistence model 이 있다. 

 

Document Model 

장점

  • 유연한 데이터 구조를 지원하며, JSON과 유사한 형식의 데이터를 저장할 수 있다.
  • 풍부한 쿼리 기능을 제공하며, DynamoDB의 강력한 쿼리 및 검색 기능을 활용할 수 있다.

단점

  • 좀더 많은 작업이 필요하고 좀더 불편하다.
  • 데이터 일관성을 관리하는 데 어려움이 있을 수 있다.

 

Object Persistence Model

  • 장점:
    • 객체 매핑: Object Persistence 모델은 .NET 객체와 DynamoDB 아이템 간의 매핑을 제공한다.
      이는 개발자가 객체 지향적인 방식으로 데이터를 다룰 수 있게 해준다.
    • 단순성: 객체 모델은 간단하고 직관적인 API를 제공하여 개발자가 빠르게 개발할 수 있도록 한다.
  • 단점:
    • 제한된 유연성: Object Persistence 모델은 .NET 객체와 DynamoDB 아이템 간의 일대일 매핑을 가정하기 때문에, 데이터 구조의 유연성이 제한될 수 있다.
    • 성능: 매핑 레이어를 통해 객체와 DynamoDB 아이템 간의 변환은 추가적인 오버헤드를 초래할 수 있다.

 

일단 Table 을 하나 생성해 보자

dotnet add package AWSSDK.DynamoDBv2
dotnet add package AWSSDK.Extensions.NETCore.Setup

aspnet core 에 설치해서 aws configure 에 설정된 권한을 사용할 것이므로 위와 같이 두 개의 package 를 설치 하자

 

Program.cs

builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions());
// AWS DynamoDB 클라이언트 구성
builder.Services.AddAWSService<IAmazonDynamoDB>();
builder.Services.AddTransient<IDynamoDBContext, DynamoDBContext>();

Handler.cs

public class CommandHandler(IMapper mapper, IAmazonDynamoDB dynamoDBClient)
{
    private readonly IMapper _mapper = mapper;
    private readonly IAmazonDynamoDB _dynamoDBClient = dynamoDBClient;

    public async Task<Response> Handle(Command command)
    {
        var request = new CreateTableRequest
        {
            TableName = "User",
            AttributeDefinitions = new List<AttributeDefinition>
            {
                new AttributeDefinition
                {
                    AttributeName = "Id",
                    AttributeType = ScalarAttributeType.S
                }
                // 다른 속성 정의도 추가할 수 있음
            },
            KeySchema = new List<KeySchemaElement>
            {
                new KeySchemaElement
                {
                    AttributeName = "Id",
                    KeyType = KeyType.HASH
                }
            },
            ProvisionedThroughput = new ProvisionedThroughput
            {
                ReadCapacityUnits = 5,
                WriteCapacityUnits = 5
            }
        };

        var response = await _dynamoDBClient.CreateTableAsync(request);
        //Console.WriteLine("Table creation response: " + response);
        return await Task.FromResult(new Response { Result = true });
    }
}

 

Table 이 만들어 졌으면 Add 해보자. Object Persistence Model 을 사용할 것이다.

User.cs

[DynamoDBTable("User")]
public class User
{
    [DynamoDBHashKey] // Primary Key
    public Guid Id { get; set; } = Guid.NewGuid();

    [DynamoDBProperty]
    public string Name { get; set; }

    [DynamoDBProperty]
    public string Password { get; set; }

    [DynamoDBProperty]
    public string Email { get; set; }

    [DynamoDBProperty]
    public int Age { get; set; }
}

 

Handler.cs

 public class CommandHandler(IMapper mapper, IDynamoDBContext dbContext)
 {
     private readonly IMapper _mapper = mapper;
     private readonly IDynamoDBContext _dbContext = dbContext;

     public async Task<Response> Handle(Command command)
     {
         var user = _mapper.Map<Infrastructure.Models.Dynamo.User>(command);
         await _dbContext.SaveAsync(user);
         return new Response { Result = true };
     }
 }

 

 

관련영상

https://youtu.be/zuEqpXoqA98

 

반응형

'AWS' 카테고리의 다른 글

AWS DynamoDB 를 이용한 동시성 충돌 처리  (0) 2024.04.01