AWS DynamoDB 를 이용한 data 저장
2024. 3. 25. 00:00ㆍAWS
반응형
AWS 에는 KeyValue 기반의 NoSQL Data Service 가 있다.
DynamoDB 라고 한다.
.NET 에서 AWS DynamoDB 를 사용하여 Table 을 생성하고 CRUD 하는 간단한 app 을 만들어 보겠다.
DynamoDB 를 이용하여 Programming 하는 방법에는 여러가지가 있는데
.NET 에는 Document model 과 Object persistence model 이 있다.
Document Model
장점
- 유연한 데이터 구조를 지원하며, JSON과 유사한 형식의 데이터를 저장할 수 있다.
- 풍부한 쿼리 기능을 제공하며, DynamoDB의 강력한 쿼리 및 검색 기능을 활용할 수 있다.
단점
- 좀더 많은 작업이 필요하고 좀더 불편하다.
- 데이터 일관성을 관리하는 데 어려움이 있을 수 있다.
Object Persistence Model
- 장점:
- 객체 매핑: Object Persistence 모델은 .NET 객체와 DynamoDB 아이템 간의 매핑을 제공한다.
이는 개발자가 객체 지향적인 방식으로 데이터를 다룰 수 있게 해준다. - 단순성: 객체 모델은 간단하고 직관적인 API를 제공하여 개발자가 빠르게 개발할 수 있도록 한다.
- 객체 매핑: Object Persistence 모델은 .NET 객체와 DynamoDB 아이템 간의 매핑을 제공한다.
- 단점:
- 제한된 유연성: 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 };
}
}
관련영상
반응형
'AWS' 카테고리의 다른 글
AWS DynamoDB 를 이용한 동시성 충돌 처리 (0) | 2024.04.01 |
---|