Docs Menu
Docs Home
/ / /
C#/ .NET 드라이버
/ /

튜토리얼: .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 에 대한 데이터 모델 정의할 수 있습니다.

1

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 라는 클래스를 정의합니다.

2

프로젝트의 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(클러스터에 연결하기) 튜토리얼을 참조하세요.

3

프로젝트 에서 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 파일 에서 구성한 설정이 변수로 설정하다 됩니다.

4

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 변수가 있는 경우 두 번 추가하지 마세요.

5

이제 서비스가 설정하다 되었으므로 컬렉션 에 대한 데이터 모델 만들 수 있습니다.

Models 폴더에서 Playlist.cs 라는 새 파일 만들고 다음 코드를 추가합니다.

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System.Text.Json.Serialization;
namespace MongoExample.Models;
public class Playlist {
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string? Id { get; set; }
public string username { get; set; } = null!;
[BsonElement("items")]
[JsonPropertyName("items")]
public List<string> movieIds { get; set; } = null!;
}

앞의 코드에서 Id 필드 _id 필드 에서 ObjectId 로 직렬화됩니다. 필드 애플리케이션 에서 문자열로 표시됩니다.

movieIds 필드 items(으)로 직렬화됩니다. JSON 값을 보내거나 받을 때 필드 이름도 movieIds 대신 items 로 지정됩니다.

로컬 클래스 필드 문서 필드 직접 일치시키려는 경우 사용자 지정 매핑을 정의할 필요가 없습니다. 예시 들어 앞의 코드의 username 필드 에는 사용자 지정 매핑이 없습니다. C#, JSON 및 MongoDB 에서는 username 이라고 합니다.

이 단계를 완료하면 컬렉션 에 대한 MongoDB 서비스 및 문서 모델 .NET Core에서 작동합니다.

이 애플리케이션 에 대한 CRUD 엔드포인트를 만들려면 프로젝트 내에서 두 개의 서로 다른 파일을 업데이트 해야 합니다. 이 섹션에서는 컨트롤러 내에서 엔드포인트를 정의하고 서비스 내에서 해당 작업을 업데이트 방법을 학습 봅니다.

참고

데이터 유효성 검사

이 예시 프로젝트 에서는 HTTP 요청에 대한 데이터 유효성 검사 가 없습니다.

1

프로젝트 에서 Controllers라는 폴더를 만듭니다. Controllers 폴더에서 PlaylistController.cs 라는 새 파일 만들고 다음 코드를 추가합니다.

using System;
using Microsoft.AspNetCore.Mvc;
using MongoExample.Services;
using MongoExample.Models;
namespace MongoExample.Controllers;
[Controller]
[Route("api/[controller]")]
public class PlaylistController: Controller {
private readonly MongoDBService _mongoDBService;
public PlaylistController(MongoDBService mongoDBService) {
_mongoDBService = mongoDBService;
}
[HttpGet]
public async Task<List<Playlist>> Get() {}
[HttpPost]
public async Task<IActionResult> Post([FromBody] Playlist playlist) {}
[HttpPut("{id}")]
public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(string id) {}
}

PlaylistController 클래스에는 싱글톤 서비스 클래스에 대한 액세스 얻는 생성자 메서드가 포함되어 있습니다. 그런 다음 이 컨트롤러에 대한 일련의 엔드포인트가 있습니다.

2

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 메서드를 업데이트 .

[HttpPost]
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 함수에 전달합니다. 삽입 후 코드는 상호 작용에 대한 정보를 반환합니다.

3

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 메서드를 업데이트 .

[HttpGet]
public async Task<List<Playlist>> Get() {
return await _mongoDBService.GetAsync();
}
4

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 함수를 업데이트 .

[HttpPut("{id}")]
public async Task<IActionResult> AddToPlaylist(string id, [FromBody] string movieId) {
await _mongoDBService.AddToPlaylistAsync(id, movieId);
return NoContent();
}
5

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 함수를 업데이트 .

[HttpDelete("{id}")]
public async Task<IActionResult> Delete(string id) {
await _mongoDBService.DeleteAsync(id);
return NoContent();
}

이 단계를 완료하면 RESTful API 에 대한 완전한 CRUD 엔드포인트 설정하다 갖게 됩니다.

엔드포인트가 생성되면 템플릿 .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 어떻게 표시되는지 보여줍니다.

Swagger UI

RESTful API 위한 Swagger UI .

각 엔드포인트에서 Try it out 버튼을 클릭하여 애플리케이션 테스트할 수 있습니다. 시작하려면 /api/playlists POST 엔드포인트로 고 (Go) 데이터베이스 에 데이터를 추가합니다. 다음 샘플 데이터를 추가합니다.

{
"username": "testuser",
"items": [
"1234",
"5678"
]
}

이 요청 실행하여 데이터베이스 에 데이터를 삽입합니다. 그런 다음 GET 엔드포인트로 고 (Go) 방금 삽입한 데이터를 볼 수 있습니다. PUTDELETE 엔드포인트를 테스트하여 데이터를 업데이트 하고 삭제 수도 있습니다.

이 튜토리얼에서 설명하는 작업에 대해 자세히 학습 다음 가이드를 참조하세요.

  • 문서 삽입

  • Retrieve Data

  • UpdateOne

  • 문서 삭제

돌아가기

쿼리 결과 지정

이 페이지의 내용