- appsettings.json
- UserInfoDatabaseSetting.cs
- MongoDB, testdb.UserInfo
- UserInfo.cs
- UserInfoService.cs
- UserInfoController.cs
- Program.cs
- Reference
Intro to MongoDB with C#1에 이어 이번 주제는 MongoDB와 함께 ASP.NET Core 6 REST API2를 구현하는 예제(Sample)이다. 이전과 마찬가지로 Nuget에서 MongoDB.Driver 패키지를 추가한다.
appsettings.json
{
  "UserInfoDatabaseSetting": {
    "UserInfoCollectionName": "UserInfo",
    "ConnectionString": "mongodb://<ID>:<Password>@localhost:27017/?serverSelectionTimeoutMS=5000&connectTimeoutMS=10000&authSource=testdb&authMechanism=SCRAM-SHA-256",
    "DatabaseName": "testdb"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}  
UserInfoDatabaseSetting.cs
// interface
namespace UserInfoManagement.Models
{
    public interface IUserInfoDatabaseSetting
    {
        string UserInfoCollectionName { get; set; }
        string ConnectionString { get; set; }
        string DatabaseName { get; set; }
    }
}
// class model
namespace UserInfoManagement.Models
{
    public class UserInfoDatabaseSetting : IUserInfoDatabaseSetting
    {
        public string UserInfoCollectionName { get; set; } = string.Empty;
        public string ConnectionString { get; set; } = string.Empty;
        public string DatabaseName { get; set; } = string.Empty;
    }
}
MongoDB, testdb.UserInfo
{ 
    "_id" : ObjectId("61eaa77a9102f8d5ae5f01c4"), 
    "UserId" : "1111", 
    "UserPwd" : "1111", 
    "UserName" : "홍길동"
}
{ 
    "_id" : ObjectId("61eaa976318b8b74ca7fc524"), 
    "UserId" : "2222", 
    "UserPwd" : "2222", 
    "UserName" : "가나닭"
}
UserInfo.cs
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace UserInfoManagement.Models
{
    public class UserInfo
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; } = string.Empty;
        [BsonElement("UserId")]
        public string UserId { get; set; } = string.Empty;
        [BsonElement("UserPwd")]
        public string UserPwd { get; set; } = string.Empty;
        [BsonElement("UserName")]
        public string UserName { get; set; } = string.Empty;
    }
}
UserInfoService.cs
// interface
using UserInfoManagement.Models;
namespace UserInfoManagement.Services
{
    public interface IUserInfoService
    {
        Task<List<UserInfo>> GetList();
        UserInfo Get(string id);
        UserInfo Create(UserInfo userInfo);
        void Update(string id, UserInfo userInfo);
        void Remove(string id);
    }
}
// class(Service)
using MongoDB.Driver;
using UserInfoManagement.Models;
namespace UserInfoManagement.Services
{
    public class UserInfoService : IUserInfoService
    {
        private readonly IMongoCollection<UserInfo> _userInfo;
        public UserInfoService(IUserInfoDatabaseSetting setting, IMongoClient mongoClient)
        {
            var database = mongoClient.GetDatabase(setting.DatabaseName);
            _userInfo = database.GetCollection<UserInfo>(setting.UserInfoCollectionName);
        }
        public UserInfo Create(UserInfo userInfo)
        {
            _userInfo.InsertOne(userInfo);
            return userInfo;
        }
        public async Task<List<UserInfo>> GetList()
        {
            var cursor = await _userInfo.FindAsync(u => true);
            return cursor.ToList();
        }
        public UserInfo Get(string userId)
        {
            return _userInfo.Find(u => u.UserId == userId).FirstOrDefault();
        }
        public void Remove(string userId)
        {
            _userInfo.DeleteOne(u => u.UserId == userId);
        }
        public void Update(string userId, UserInfo userInfo)
        {
            _userInfo.ReplaceOne(u => u.UserId == userId, userInfo);
        }
    }
}
UserInfoController.cs
using Microsoft.AspNetCore.Mvc;
using UserInfoManagement.Models;
using UserInfoManagement.Services;
namespace UserInfoManagement.Controllers
{
    [Route("api")]
    [ApiController]
    public class UserInfoController : ControllerBase
    {
        private readonly IUserInfoService userInfoService;
        public UserInfoController(IUserInfoService userInfoService)
        {
            this.userInfoService = userInfoService;
        }
        [HttpPost("GetUserInfoList")]
        public async Task<ActionResult<List<UserInfo>>> GetUserInfoList()
        {
            return await userInfoService.GetList();
        }
        [HttpPost("GetUserInfo")]
        public ActionResult<UserInfo> GetUserInfo([FromBody] UserInfo userInfo)
        {
            var _userInfo = userInfoService.Get(userInfo.UserId);
            if (_userInfo == null)
            {
                return new UserInfo { UserId = userInfo.UserId + " : 사용자 없음" };
            }
            return _userInfo;
        }
    }
}
Program.cs
using Microsoft.Extensions.Options;
using MongoDB.Driver;
using UserInfoManagement.Models;
using UserInfoManagement.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<UserInfoDatabaseSetting>(builder.Configuration.GetSection(nameof(UserInfoDatabaseSetting)));
builder.Services.AddSingleton<IUserInfoDatabaseSetting>(s => s.GetRequiredService<IOptions<UserInfoDatabaseSetting>>().Value);
builder.Services.AddSingleton<IMongoClient>(s => new MongoClient(builder.Configuration.GetValue<string>("UserInfoDatabaseSetting:ConnectionString")));
builder.Services.AddScoped<IUserInfoService, UserInfoService>();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
 MSJO.kr
 MSJO.kr