OpenAPI, 버전 관리와 배포
Swagger/OpenAPI 문서를 생성하고 API 버전을 관리하며 Minimal API를 Azure App Service 또는 컨테이너에 배포합니다.
OpenAPI, 버전 관리와 배포은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
미니멀 API의 OpenAPI
OpenAPI(이전에는 스웨거라고 불림)는 대화형 API 문서를 생성합니다. .NET 9에서는 AddOpenApi()가 기본 제공됩니다. 이전 버전에서는 Swashbuckle.AspNetCore를 사용합니다.
Swashbuckle로 스웨거 추가하기
스와시버클을 설치하고 서비스에서 구성한 다음 미들웨어를 추가하여 사양과 스웨거 UI를 제공합니다.
// dotnet add package Swashbuckle.AspNetCore
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(opt =>
opt.SwaggerDoc("v1", new() { Title = "Products API", Version = "v1" }));
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}OpenAPI를 위한 엔드포인트 주석 지정
Produces, ProducesProblem, WithSummary, WithDescription를 사용하여 생성되는 OpenAPI 사양을 더욱 풍부하게 만듭니다.
app.MapGet("/products/{id}", GetProduct)
.WithName("GetProductById")
.WithSummary("Get a product by ID")
.WithDescription("Returns the product matching the given numeric ID.")
.Produces<ProductDto>(200)
.Produces<ProblemDetails>(404)
.WithTags("Products");라우트 그룹을 사용한 API 버전 관리
간단한 버전 관리 전략에서는 버전이 포함된 접두사를 사용하는 라우트 그룹을 사용합니다. 기본적인 버전 관리에는 추가 패키지가 필요하지 않습니다.
var v1 = app.MapGroup("/api/v1").WithTags("v1");
var v2 = app.MapGroup("/api/v2").WithTags("v2");
v1.MapGet("/products", GetProductsV1);
v2.MapGet("/products", GetProductsV2); // different DTO shape
// Clients use /api/v1/products or /api/v2/products헤더 및 쿼리 버전 관리를 위한 Asp.Versioning
Asp.Versioning.Http 패키지는 완전한 OpenAPI 통합을 통해 미니멀 API에 쿼리 문자열, 헤더 기반 및 URL 세그먼트 버전 관리를 추가합니다.
// dotnet add package Asp.Versioning.Http
builder.Services.AddApiVersioning(opt =>
{
opt.DefaultApiVersion = new ApiVersion(1, 0);
opt.AssumeDefaultVersionWhenUnspecified = true;
opt.ApiVersionReader = new QueryStringApiVersionReader("api-version");
});
// /products?api-version=2.0
app.MapGet("/products", GetProducts)
.HasApiVersion(2, 0);버전별 별도 사양 생성하기
스와시버클을 구성하여 각 버전에 대한 별도의 OpenAPI 문서를 생성하면 API 사용자는 자신의 버전에 해당하는 엔드포인트만 볼 수 있습니다.
builder.Services.AddSwaggerGen(opt =>
{
opt.SwaggerDoc("v1", new() { Title = "API", Version = "v1" });
opt.SwaggerDoc("v2", new() { Title = "API", Version = "v2" });
});
app.UseSwaggerUI(opt =>
{
opt.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
opt.SwaggerEndpoint("/swagger/v2/swagger.json", "v2");
});자체 포함 바이너리 배포
대상 컴퓨터에 .NET 런타임이 없어도 되도록 미니멀 API를 자체 포함 단일 바이너리로 배포합니다.
# Publish for Linux x64 as self-contained
dotnet publish -c Release -r linux-x64 --self-contained true
# Run the output binary
./bin/Release/net9.0/linux-x64/publish/MyApi
# Optionally single-file:
# dotnet publish -c Release -r linux-x64 -p:PublishSingleFile=true도커로 컨테이너화하기
공식 .NET 기본 이미지를 사용하여 API를 도커 이미지로 패키징합니다. 다단계 Dockerfile을 사용하면 최종 이미지 크기를 작게 유지할 수 있습니다.
# Dockerfile (multi-stage)
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app
FROM mcr.microsoft.com/dotnet/aspnet:9.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "MyApi.dll"]
# Build and run
# docker build -t my-api .
# docker run -p 8080:8080 my-api애저 앱 서비스에 배포하기
CLI에서 애저 앱 서비스로 직접 배포합니다. 서비스가 확장, 인증서 및 사용자 지정 도메인을 처리합니다.
# Publish to folder first
dotnet publish -c Release -o ./publish
# Deploy to Azure App Service
az webapp up \
--name my-products-api \
--resource-group myRG \
--runtime DOTNETCORE:9.0 \
--sku B1
# View logs
az webapp log tail --name my-products-api --resource-group myRG상태 검사
오케스트레이터(쿠버네티스, 애저)가 API가 정상 작동하며 트래픽을 처리할 준비가 되었는지 확인할 수 있도록 상태 검사 엔드포인트를 추가합니다.
builder.Services.AddHealthChecks()
.AddDbContextCheck<AppDbContext>()
.AddUrlGroup(new Uri("https://api.external.com/ping"), "external");
app.MapHealthChecks("/health");
app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
Predicate = hc => hc.Tags.Contains("ready")
});실전: 프로덕션 체크리스트
프로덕션 미니멀 API에는 정확성, 관측 가능성 및 보안을 위해 다음 설정이 포함되어야 합니다.
// builder configuration
builder.Services.AddProblemDetails();
builder.Services.AddHealthChecks();
builder.Services.AddRateLimiter(...);
builder.Services.AddOutputCache();
// app pipeline
app.UseHttpsRedirection();
app.UseExceptionHandler();
app.UseRateLimiter();
app.UseOutputCache();
app.UseAuthentication();
app.UseAuthorization();
app.MapHealthChecks("/health");
// ... your endpoints
app.Run();확인 문제
미니멀 API에서 엔드포인트 메타데이터(Produces, WithSummary 등)를 OpenAPI 도구에서 볼 수 있게 하는 메서드는 무엇입니까?
복습: OpenAPI, 버전 관리 및 배포
핵심 요점:
- AddEndpointsApiExplorer + 스와시버클 = 미니멀 API용 스웨거 UI
- Produces, WithSummary, WithTags로 주석을 지정하여 풍부한 OpenAPI 문서를 만듭니다
- 라우트 그룹을 통한 간단한 버전 관리와 고급 시나리오를 위한 Asp.Versioning
- 유연한 배포를 위해 자체 포함 바이너리 또는 도커 이미지를 배포합니다
- 쿠버네티스 및 애저의 준비 상태 프로브를 위해 상태 검사를 추가합니다
자주 묻는 질문
“OpenAPI, 버전 관리와 배포” 강의는 무료인가요?
네 — “OpenAPI, 버전 관리와 배포” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“OpenAPI, 버전 관리와 배포”에서 뭘 배우나요?
Swagger/OpenAPI 문서를 생성하고 API 버전을 관리하며 Minimal API를 Azure App Service 또는 컨테이너에 배포합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“OpenAPI, 버전 관리와 배포” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 첫 번째 Minimal API 만들기
- 경로 그룹, 매개 변수와 유효성 검사
- Minimal API의 미들웨어와 필터
- OpenAPI, 버전 관리와 배포