컨트롤러 기반 API와 최소 API 중에서 선택

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

Important

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

ASP.NET Core API를 만드는 두 가지 방법, 즉 컨트롤러 기반 접근 방식과 최소 API를 지원합니다. API 프로젝트의 컨트롤러는 .에서 ControllerBase파생되는 클래스입니다. 최소 API는 람다 또는 메서드에서 논리 처리기를 사용하여 엔드포인트를 정의합니다. 이 문서에서는 두 방법 간의 차이점을 설명합니다.

최소 API 디자인은 기본적으로 호스트 클래스를 숨기고 함수를 람다 식으로 사용하는 확장 메서드를 통해 구성 및 확장성에 중점을 둡니다. 컨트롤러는 생성자 주입 또는 속성 주입을 통해 종속성을 사용할 수 있는 클래스이며 일반적으로 개체 지향 패턴을 따릅니다. 최소 API는 서비스 공급자 액세스와 같은 다른 접근 방식을 통해 종속성 주입을 지원합니다.

컨트롤러를 기반으로 하는 API에 대한 샘플 코드는 다음과 같습니다.


namespace APIWithControllers;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        builder.Services.AddControllers();
        var app = builder.Build();

        app.UseHttpsRedirection();

        app.MapControllers();

        app.Run();
    }
}
using Microsoft.AspNetCore.Mvc;

namespace APIWithControllers.Controllers;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

다음 코드는 최소 API 프로젝트에서 동일한 기능을 제공합니다. 최소 API 접근 방식에는 람다 식에 관련 코드가 포함됩니다.


namespace MinimalAPI;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        var app = builder.Build();

        app.UseHttpsRedirection();

        var summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        app.MapGet("/weatherforecast", (HttpContext httpContext) =>
        {
            var forecast = Enumerable.Range(1, 5).Select(index =>
                new WeatherForecast
                {
                    Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                    TemperatureC = Random.Shared.Next(-20, 55),
                    Summary = summaries[Random.Shared.Next(summaries.Length)]
                })
                .ToArray();
            return forecast;
        });

        app.Run();
    }
}

두 API 프로젝트는 다음 클래스를 참조합니다.

namespace APIWithControllers;

public class WeatherForecast
{
    public DateOnly Date { get; set; }

    public int TemperatureC { get; set; }

    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

    public string? Summary { get; set; }
}

최소 API에는 컨트롤러 기반 API와 동일한 기능이 많이 있습니다. 여러 API로 스케일링하고, 복잡한 경로를 처리하고, 권한 부여 규칙을 적용하고, API 응답의 콘텐츠를 제어하는 데 필요한 구성 및 사용자 지정을 지원합니다. 최소 API에서 아직 지원되거나 구현되지 않은 컨트롤러 기반 API에서 사용할 수 있는 몇 가지 기능이 있습니다. 여기에는 다음이 포함됩니다.

  • 모델 바인딩(IModelBinderProvider, IModelBinder)에 대한 기본 제공 지원이 없습니다. 사용자 지정 바인딩 shim을 사용하여 지원을 추가할 수 있습니다.
  • 유효성 검사(IModelValidator)를 기본적으로 지원하지 않습니다.
  • 애플리케이션 파트 또는 애플리케이션 모델을 지원하지 않습니다. 자체 규칙을 적용하거나 빌드할 수 있는 방법은 없습니다.
  • 기본 제공 뷰 렌더링을 지원하지 않습니다. 뷰를 렌더링하는 데 Razor Pages를 사용하는 것이 좋습니다.
  • JsonPatch를 지원하지 않습니다.
  • OData를 지원하지 않습니다.

참고 항목

ASP.NET Core API를 만드는 두 가지 방법, 즉 컨트롤러 기반 접근 방식과 최소 API를 지원합니다. API 프로젝트의 컨트롤러는 .에서 ControllerBase파생되는 클래스입니다. 최소 API는 람다 또는 메서드에서 논리 처리기를 사용하여 엔드포인트를 정의합니다. 이 문서에서는 두 방법 간의 차이점을 설명합니다.

최소 API 디자인은 기본적으로 호스트 클래스를 숨기고 함수를 람다 식으로 사용하는 확장 메서드를 통해 구성 및 확장성에 중점을 둡니다. 컨트롤러는 생성자 주입 또는 속성 주입을 통해 종속성을 사용할 수 있는 클래스이며 일반적으로 개체 지향 패턴을 따릅니다. 최소 API는 서비스 공급자 액세스와 같은 다른 접근 방식을 통해 종속성 주입을 지원합니다.

컨트롤러를 기반으로 하는 API에 대한 샘플 코드는 다음과 같습니다.


namespace APIWithControllers;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        builder.Services.AddControllers();
        var app = builder.Build();

        app.UseHttpsRedirection();

        app.MapControllers();

        app.Run();
    }
}
using Microsoft.AspNetCore.Mvc;

namespace APIWithControllers.Controllers;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

다음 코드는 최소 API 프로젝트에서 동일한 기능을 제공합니다. 최소 API 접근 방식에는 람다 식에 관련 코드가 포함됩니다.


namespace MinimalAPI;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        var app = builder.Build();

        app.UseHttpsRedirection();

        var summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        app.MapGet("/weatherforecast", (HttpContext httpContext) =>
        {
            var forecast = Enumerable.Range(1, 5).Select(index =>
                new WeatherForecast
                {
                    Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                    TemperatureC = Random.Shared.Next(-20, 55),
                    Summary = summaries[Random.Shared.Next(summaries.Length)]
                })
                .ToArray();
            return forecast;
        });

        app.Run();
    }
}

두 API 프로젝트는 다음 클래스를 참조합니다.

namespace APIWithControllers;

public class WeatherForecast
{
    public DateOnly Date { get; set; }

    public int TemperatureC { get; set; }

    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

    public string? Summary { get; set; }
}

최소 API에는 컨트롤러 기반 API와 동일한 기능이 많이 있습니다. 여러 API로 스케일링하고, 복잡한 경로를 처리하고, 권한 부여 규칙을 적용하고, API 응답의 콘텐츠를 제어하는 데 필요한 구성 및 사용자 지정을 지원합니다. 최소 API에서 아직 지원되거나 구현되지 않은 컨트롤러 기반 API에서 사용할 수 있는 몇 가지 기능이 있습니다. 여기에는 다음이 포함됩니다.

  • 모델 바인딩(IModelBinderProvider, IModelBinder)에 대한 기본 제공 지원이 없습니다. 사용자 지정 바인딩 shim을 사용하여 지원을 추가할 수 있습니다.
  • 양식에서의 바인딩을 지원하지 않습니다. 여기에는 IFormFile 바인딩이 포함됩니다.
  • 유효성 검사(IModelValidator)를 기본적으로 지원하지 않습니다.
  • 애플리케이션 파트 또는 애플리케이션 모델을 지원하지 않습니다. 자체 규칙을 적용하거나 빌드할 수 있는 방법은 없습니다.
  • 기본 제공 뷰 렌더링을 지원하지 않습니다. 뷰를 렌더링하는 데 Razor Pages를 사용하는 것이 좋습니다.
  • JsonPatch를 지원하지 않습니다.
  • OData를 지원하지 않습니다.

참고 항목