-
c# 에서 mongodb를 다루는 방법 (2)프로그래밍 2024. 11. 20. 11:49
이전 글에 이어서 mongodb를 효과적으로 다루는 내용에 대해 기술한다.
Mongodb Driver로 작업하게 될 경우 아래의 코드가 반복된다.
var db = _client.GetDatabase("database name"); var collection = db.GetCollection<LogObject>("collection name");
또한 Database와 Collection에 대한 이름을 계속 넣어서 생성해야 한다.
이러한 번거로움을 최소화하기 위해 필자는 아래와 같이 구현했다.
1. Attribute를 사용해서 MongoDb Object에 대한 database name, collection name에 대한 속성을 선언적으로 한다.
2. 반복 코드를 재사용하는 클래스를 만든다.
3. 해당 클래스는 Attribute를 이용해서 database name과 collection name을 주입 받는다.
코드는 아래와 같다.
[AttributeUsage(AttributeTargets.Class)] public class MongoDbInfoAttribute : Attribute { public string DatabaseName { get; } public string CollectionName { get; } public MongoDbInfoAttribute(string databaseName, string collectionName) { DatabaseName = databaseName; CollectionName = collectionName; } }
Mongodb의 database name과 collection name을 지정하는 Attribute를 생성했다.
구현 클래스는 아래와 같다.
public class JMongoDb<T> where T : class { private JMongoDb(string databaseName, string collectionName, IMongoClient client) { _databaseName = databaseName; _collectionName = collectionName; _client = client; } private IMongoClient _client; private string _databaseName; private string _collectionName; public IMongoCollection<T> GetCollection() { var db = _client.GetDatabase(_databaseName); return db.GetCollection<T>(_collectionName); } public static JMongoDb<T> Create(IMongoClient client) { var attribute = typeof(T).GetCustomAttribute<MongoDbInfoAttribute>(); if (attribute.xIsEmpty()) throw new Exception("MongoDbInfoAttribute not define"); return new JMongoDb<T>(attribute!.DatabaseName, attribute.CollectionName, client); } }
JMongodb 클래스를 생성, Create에서 client를 인자로 하여 제네릭 T의 정보로 선언된 Attribute의 정보를 획득 후 반복 코드를 이용, GetCollection 함수로 생성하고 있다.
사용 예시는 아래와 같다.
var collection = JMongoDb<LogObject>.Create(client).GetCollection(); var exists = await collection.AsQueryable().FirstOrDefaultAsync(m => m.A == payload.A && m.P == payload.P && m.Y == now.Year && m.Month == now.Month, cancellationToken: _stoppingToken); if (exists.xIsEmpty()) { var item = new LogObject() { //... }; await collection.InsertOneAsync(item, null, _stoppingToken); }
collection 생성을 위해 반복되는 코드를 피하고 선언적 정의를 통해 실수할 수 있는 부분을 제거하는 코드가 되겠다.
도움이 되기를 바라며...
'프로그래밍' 카테고리의 다른 글
AWS Secret Manager를 이용한 반복 체크 (0) 2024.11.21 c# 에서 mongodb를 다루는 방법 (0) 2024.11.19 Kafka Consumer를 조금 더 효율적으로 처리하는 방법 (0) 2024.11.13 시계열 데이터를 전송하는 방법 (0) 2024.10.25 사용자 Session을 처리하는 방법 (1) 2024.10.24