C# Minimal API 템플릿

.NET 8+ 환경에서 빠르고 가볍게 API 엔드포인트를 구축할 수 있는 Minimal API 패턴입니다.

Gist
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.OpenApi;

var builder = WebApplication.CreateBuilder(args);

// 서비스 등록 (DI)
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// 미들웨어 설정
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

// 가상 데이터베이스
var todos = new List<Todo>();

// 그룹화된 라우트 정의
var todoItems = app.MapGroup("/todoitems");

todoItems.MapGet("/", () => todos);

todoItems.MapGet("/{id}", Results<Ok<Todo>, NotFound> (int id) =>
    todos.FirstOrDefault(t => t.Id == id) is Todo todo
        ? TypedResults.Ok(todo)
        : TypedResults.NotFound());

todoItems.MapPost("/", (Todo todo) =>
{
    todos.Add(todo);
    return TypedResults.Created($"/todoitems/{todo.Id}", todo);
});

todoItems.MapPut("/{id}", (int id, Todo inputTodo) =>
{
    var todo = todos.FirstOrDefault(t => t.Id == id);
    if (todo is null) return Results.NotFound();

    todo.Name = inputTodo.Name;
    todo.IsComplete = inputTodo.IsComplete;

    return Results.NoContent();
});

todoItems.MapDelete("/{id}", (int id) =>
{
    var todo = todos.FirstOrDefault(t => t.Id == id);
    if (todo is null) return Results.NotFound();

    todos.Remove(todo);
    return Results.NoContent();
});

app.Run();

public class Todo
{
    public int Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
}