튜토리얼: .NET/ C# 드라이버 사용하여 RESTful API 만들기
개요
이 튜토리얼에서는 MongoDB Atlas cluster 의 컬렉션 전체에서 기본 생성, 읽기, 업데이트 및 삭제 (CRUD ) 작업을 수행하는 엔드포인트가 있는 RESTful API 생성하는 방법을 학습 수 있습니다.
전제 조건
이 튜토리얼을 시작하기 전에 다음 작업을 수행하세요.
MongoDB Atlas 계정을 설정하고 M0 이상의 클러스터 배포 및 구성합니다. 지침을 보려면 Atlas 시작하기 가이드 참조하세요.
컴퓨터에 .NET 6.0 이상을 설치합니다. .NET 설치하려면 Microsoft .NET 다운로드 페이지를 방문하세요.
참고
언어 호환성
이 튜토리얼에서는 .NET Core 8.0을 사용하지만 .NET 6.0 이후의 모든 버전을 사용할 수 있습니다.
프로젝트 설정
터미널에서 다음 명령을 실행하여 웹 애플리케이션 템플릿을 사용하는 새 .NET Core 프로젝트 만듭니다.
dotnet new webapi -o MongoExample cd MongoExample
.NET/ C# 드라이버 프로젝트 에 종속성으로 추가하려면 다음 명령을 실행 .
dotnet add package MongoDB.Driver
앞의 명령은 MongoExample
이라는 .NET Core용 새 웹 애플리케이션 프로젝트 만들고 최신 .NET/ C# 드라이버 설치합니다. 템플릿 프로젝트 에는 RESTful API 구현 위해 수정하는 몇 가지 상용구 파일이 포함되어 있습니다.
문서 모델 및 데이터베이스 서비스 설계
이 섹션에서는 MongoDB 서비스를 생성 및 구성하고 RESTful API 에 대한 데이터 모델 정의할 수 있습니다.
MongoDBSettings 클래스 만들기
MongoDB 서비스는 연결을 설정하고 MongoDB 내에서 문서로 직접 작업할 책임이 있습니다. 프로젝트 에서 Models
라는 폴더를 만듭니다. Models
폴더에서 MongoDBSettings.cs
라는 새 파일 만듭니다. 이 파일 에 다음 코드를 추가합니다.
namespace MongoExample.Models; public class MongoDBSettings { public string ConnectionURI { get; set; } = null!; public string DatabaseName { get; set; } = null!; public string CollectionName { get; set; } = null!; }
앞의 코드는 연결, 데이터베이스 이름 및 컬렉션 이름에 대한 정보를 포함하는 MongoDBSettings
라는 클래스를 정의합니다.
appsettings.json 파일 업데이트
프로젝트의 appsettings.json
파일 에서 MongoDBSettings
클래스에 정의된 클래스 필드에 저장된 데이터를 찾을 수 있습니다. 이 파일 열고 다음 구성을 추가합니다.
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "MongoDB": { "ConnectionURI": "<Atlas connection string>", "DatabaseName": "sample_mflix", "CollectionName": "playlist" } }
이 튜토리얼에서는 sample_mflix
데이터베이스 와 playlist
컬렉션 사용합니다. <Atlas connection string>
자리 표시자를 MongoDB Atlas 연결 문자열 로 바꿉니다. 연결 문자열 찾는 방법에 대한 자세한 내용은 Atlas 설명서에서 Connect to Your Cluster(클러스터에 연결하기) 튜토리얼을 참조하세요.
서비스 만들기
프로젝트 에서 Services
라는 폴더를 만듭니다. Services
폴더에서 MongoDBService.cs
라는 새 파일 만들고 다음 코드를 추가합니다.
using MongoExample.Models; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Bson; namespace MongoExample.Services; public class MongoDBService { private readonly IMongoCollection<Playlist> _playlistCollection; public MongoDBService(IOptions<MongoDBSettings> mongoDBSettings) { MongoClient client = new MongoClient(mongoDBSettings.Value.ConnectionURI); IMongoDatabase database = client.GetDatabase(mongoDBSettings.Value.DatabaseName); _playlistCollection = database.GetCollection<Playlist>(mongoDBSettings.Value.CollectionName); } public async Task<List<Playlist>> GetAsync() { } public async Task CreateAsync(Playlist playlist) { } public async Task AddToPlaylistAsync(string id, string movieId) {} public async Task DeleteAsync(string id) { } }
앞의 코드는 빈 비동기 함수를 포함하는 MongoDBService
라는 클래스를 정의합니다. 이 튜토리얼 전체에서 엔드포인트를 생성할 때 이러한 함수에 코드를 추가합니다. appsettings.json
파일 에서 구성한 설정이 변수로 설정하다 됩니다.
서비스를 애플리케이션 에 연결
Program.cs
파일 열고 파일 맨 위에 다음 코드를 추가합니다.
using MongoExample.Models; using MongoExample.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.Configure<MongoDBSettings>(builder.Configuration.GetSection("MongoDB")); builder.Services.AddSingleton<MongoDBService>();
앞의 코드에서 GetSection()
함수는 appsettings.json
파일 의 MongoDB
필드 에서 설정을 가져옵니다.
팁
템플릿 코드에 이미 builder
변수가 있는 경우 두 번 추가하지 마세요.
문서 모델 만들기
이제 서비스가 설정하다 되었으므로 컬렉션 에 대한 데이터 모델 만들 수 있습니다.
Models
폴더에서 Playlist.cs
라는 새 파일 만들고 다음 코드를 추가합니다.
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; namespace MongoExample.Models; public class Playlist { [ ] [ ] public string? Id { get; set; } public string username { get; set; } = null!; [ ] [ ] public List<string> movieIds { get; set; } = null!; }
앞의 코드에서 Id
필드 _id
필드 에서 ObjectId
로 직렬화됩니다. 필드 애플리케이션 에서 문자열로 표시됩니다.
movieIds
필드 items
(으)로 직렬화됩니다. JSON 값을 보내거나 받을 때 필드 이름도 movieIds
대신 items
로 지정됩니다.
로컬 클래스 필드 문서 필드 직접 일치시키려는 경우 사용자 지정 매핑을 정의할 필요가 없습니다. 예시 들어 앞의 코드의 username
필드 에는 사용자 지정 매핑이 없습니다. C#, JSON 및 MongoDB 에서는 username
이라고 합니다.
이 단계를 완료하면 컬렉션 에 대한 MongoDB 서비스 및 문서 모델 .NET Core에서 작동합니다.
CRUD 엔드포인트 빌드
이 애플리케이션 에 대한 CRUD 엔드포인트를 만들려면 프로젝트 내에서 두 개의 서로 다른 파일을 업데이트 해야 합니다. 이 섹션에서는 컨트롤러 내에서 엔드포인트를 정의하고 서비스 내에서 해당 작업을 업데이트 방법을 학습 봅니다.
참고
데이터 유효성 검사
이 예시 프로젝트 에서는 HTTP 요청에 대한 데이터 유효성 검사 가 없습니다.
컨트롤러 만들기
프로젝트 에서 Controllers
라는 폴더를 만듭니다. Controllers
폴더에서 PlaylistController.cs
라는 새 파일 만들고 다음 코드를 추가합니다.
using System; using Microsoft.AspNetCore.Mvc; using MongoExample.Services; using MongoExample.Models; namespace MongoExample.Controllers; [ ][ ]public class PlaylistController: Controller { private readonly MongoDBService _mongoDBService; public PlaylistController(MongoDBService mongoDBService) { _mongoDBService = mongoDBService; } [ ] public async Task<List<Playlist>> Get() {} [ ] public async Task<IActionResult> Post([FromBody] Playlist playlist) {} [ ] public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {} [ ] public async Task<IActionResult> Delete(string id) {} }
PlaylistController
클래스에는 싱글톤 서비스 클래스에 대한 액세스 얻는 생성자 메서드가 포함되어 있습니다. 그런 다음 이 컨트롤러에 대한 일련의 엔드포인트가 있습니다.
POST 엔드포인트를 통해 데이터 추가
Services/MongoDBService.cs
로 고 (Go) 다음 코드를 사용하도록 CreateAsync
함수를 업데이트 .
public async Task CreateAsync(Playlist playlist) { await _playlistCollection.InsertOneAsync(playlist); return; }
앞의 코드는 서비스의 생성자 메서드에서 _playlistCollection
를 설정합니다. 이렇게 하면 애플리케이션 전달된 Playlist
변수를 가져와 삽입하는 InsertOneAsync
메서드를 사용할 수 있습니다.
POST
엔드포인트 생성을 완료하려면 Controllers/PlaylistController.cs
파일 로 고 (Go) 다음 코드를 사용하도록 Post
메서드를 업데이트 .
[ ]public async Task<IActionResult> Post([FromBody] Playlist playlist) { await _mongoDBService.CreateAsync(playlist); return CreatedAtAction(nameof(Get), new { id = playlist.Id }, playlist); }
POST
엔드포인트가 실행되면 애플리케이션 .NET Core가 구문 분석하는 request
에서 Playlist
객체 가져와서 서비스의 CreateAsync
함수에 전달합니다. 삽입 후 코드는 상호 작용에 대한 정보를 반환합니다.
GET 엔드포인트를 통해 데이터 읽기
Services/MongoDBService.cs
로 고 (Go) 다음 코드를 사용하도록 GetAsync
함수를 업데이트 .
public async Task<List<Playlist>> GetAsync() { return await _playlistCollection.Find(new BsonDocument()).ToListAsync(); }
앞의 코드에서 Find
작업은 컬렉션 에 존재하는 모든 문서를 반환합니다.
GET
엔드포인트 생성을 완료하려면 Controllers/PlaylistController.cs
파일 로 고 (Go) 다음 코드를 사용하도록 Get
메서드를 업데이트 .
[ ]public async Task<List<Playlist>> Get() { return await _mongoDBService.GetAsync(); }
PUT 엔드포인트를 사용하여 데이터 업데이트
Services/MongoDBService.cs
로 고 (Go) 다음 코드를 사용하도록 AddToPlaylistAsync
함수를 업데이트 .
public async Task AddToPlaylistAsync(string id, string movieId) { FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id); UpdateDefinition<Playlist> update = Builders<Playlist>.Update.AddToSet<string>("movieIds", movieId); await _playlistCollection.UpdateOneAsync(filter, update); return; }
앞의 코드는 일치 필터하다 설정하여 업데이트 받을 문서 를 결정하며, 이 경우에는 재생 목록에 항목을 추가합니다. 이 코드는 고유한 Id
필드 기준으로 일치합니다. 그런 다음 코드는 업데이트 기준을 정의하는데, 이는 배열 에 항목이 아직 존재하지 않는 경우에만 배열 에 항목을 추가하는 AddtoSet
작업입니다.
UpdateOneAsync
메서드는 일치 필터하다 둘 이상의 일치 항목을 반환하는 경우에도 문서 에서만 업데이트됩니다.
PUT 엔드포인트 생성을 완료하려면 Controllers/PlaylistController.cs
파일 로 고 (Go) 다음 코드를 사용하도록 AddToPlaylist
함수를 업데이트 .
[ ]public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) { await _mongoDBService.AddToPlaylistAsync(id, movieId); return NoContent(); }
DELETE 엔드포인트를 사용하여 데이터 삭제
Services/MongoDBService.cs
로 고 (Go) 다음 코드를 사용하도록 DeleteAsync
함수를 업데이트 .
public async Task DeleteAsync(string id) { FilterDefinition<Playlist> filter = Builders<Playlist>.Filter.Eq("Id", id); await _playlistCollection.DeleteOneAsync(filter); return; }
앞의 코드는 Id
필드 의 고유 값과 일치하는 필터하다 기준에 따라 단일 문서 삭제합니다.
삭제 엔드포인트 생성을 완료하려면 Controllers/PlaylistController.cs
파일 로 고 (Go) 다음 코드를 사용하도록 Delete
함수를 업데이트 .
[ ]public async Task<IActionResult> Delete(string id) { await _mongoDBService.DeleteAsync(id); return NoContent(); }
이 단계를 완료하면 RESTful API 에 대한 완전한 CRUD 엔드포인트 설정하다 갖게 됩니다.
API 엔드포인트 테스트
엔드포인트가 생성되면 템플릿 .NET Core 애플리케이션 에 포함된 Swagger UI 사용하여 테스트할 수 있습니다. 이렇게 하려면 Program.cs
파일 로 고 (Go) WeatherForecast
클래스와 관련된 템플릿 프로젝트 에서 모든 코드를 제거 . 다음 코드를 포함하도록 파일 업데이트합니다.
// Adds services to the container to configure Swagger/OpenAPI builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configures the HTTP request pipeline if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // Maps the endpoints for the API app.MapGet("/api/playlists", async (MongoDBService mongoDBService) => { var playlists = await mongoDBService.GetAsync(); return playlists; }) .WithName("GetPlaylists") .WithOpenApi(); app.MapPost("/api/playlists", async (MongoDBService mongoDBService, Playlist newPlaylist) => { await mongoDBService.CreateAsync(newPlaylist); return Results.Created($"/playlists/{newPlaylist.Id}", newPlaylist); }) .WithName("CreatePlaylist") .WithOpenApi(); app.MapPut("/api/playlists/{id}", async (MongoDBService mongoDBService, string id, string movieId) => { await mongoDBService.AddToPlaylistAsync(id, movieId); return Results.NoContent(); }) .WithName("AddMovieToPlaylist") .WithOpenApi(); app.MapDelete("/playlists/{id}", async (MongoDBService mongoDBService, string id) => { await mongoDBService.DeleteAsync(id); return Results.NoContent(); }) .WithName("DeletePlaylist") .WithOpenApi(); app.Run();
프로젝트 템플릿의 반복적인 코드를 이전 코드로 바꿀 수 있습니다.
다음 명령을 실행하여 애플리케이션 실행 .
dotnet run
애플리케이션 시작되면 브라우저를 열고 구성된 로컬 호스트 URL 로 고 (Go) Swagger UI 액세스 ( 예시 : http://localhost:5000/swagger
). 다음 이미지는 Swagger UI 어떻게 표시되는지 보여줍니다.

RESTful API 위한 Swagger UI .
각 엔드포인트에서 Try it out 버튼을 클릭하여 애플리케이션 테스트할 수 있습니다. 시작하려면 /api/playlists
POST
엔드포인트로 고 (Go) 데이터베이스 에 데이터를 추가합니다. 다음 샘플 데이터를 추가합니다.
{ "username": "testuser", "items": [ "1234", "5678" ] }
이 요청 실행하여 데이터베이스 에 데이터를 삽입합니다. 그런 다음 GET
엔드포인트로 고 (Go) 방금 삽입한 데이터를 볼 수 있습니다. PUT
및 DELETE
엔드포인트를 테스트하여 데이터를 업데이트 하고 삭제 수도 있습니다.
다음 단계
이 튜토리얼에서 설명하는 작업에 대해 자세히 학습 다음 가이드를 참조하세요.