Minimal APIs 소개
ASP.NET Core 버전 6.0 출시(현재는 .NET 8.0)와 함께, ASP.NET Core 프레임워크 개발 팀의 주요 인물인 Damian Edwards와 David Fowler이 Minimal APIs라고 불리는 새로운 Web API 개발 방식을 소개했습니다. 이 새로운 접근 방식은 이름에서 알 수 있듯이 최소한의 코드로 API를 만들 수 있도록 설계되었습니다.
ASP.NET 팀은 정기적으로 ASP.NET Community Standup 행사를 개최하는데, 이 행사에서 처음으로 Minimal API에 대해 언급했습니다. 그리고 그 노력의 결실이 .NET 6에 포함되었습니다. 이것은 기존의 방식과는 다르게 시작되는 완전히 새로운 Web API 개발 방식이므로, 새롭게 배워야 하는 것으로 볼 수 있습니다.
이 문서에서는 Minimal API의 주요 구성 요소에 대해 다룹니다:
- 새로운 호스팅 API
Microsoft.AspNetCore.Builder.WebApplication
클래스Microsoft.AspNetCore.Builder.WebApplicationBuilder
클래스
- 새로운 라우팅 API
WebApplication
클래스
ASP.NET Core 템플릿을 사용하여 프로젝트를 생성할 때 기본적으로 생성되는 코드 형태는 다음과 같습니다.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
이 코드는 터미널에서 dotnet new web
명령을 사용하거나, Visual Studio에서 ASP.NET Core Empty 템플릿을 사용하여 프로젝트를 생성할 때 기본적으로 제공됩니다.
다음은 WebApplicationBuilder
를 명시적으로 생성하지 않고 WebApplication
인스턴스를 초기화하는 방법을 보여줍니다.
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
app.Run();
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
app.Run();
출력 결과는 단순하게 "Hello World!"입니다.
WebApplication.Create
메소드는 미리 정의된 기본 설정을 사용하여 WebApplication
클래스의 새 인스턴스를 초기화합니다.
참고: 다른 언어의 최소 API
Node.js - Express
const express = required('express')
const app = express()
const port = 3000
app.get('hello-node',
(req, res) => { res.send('Hello API!') })
app.listen(port)
Python - FastAPI
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return { "hello": "world" }
Go - Gin
package main
import {
"github.com/git-gonic/gin"
"net/http"
}
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello, World!")
})
r.Run()
}
Ruby - Sinatra
require 'sinatra'
get '/' do
'Hello, World!"
end
Minimal APIs 옵션
이 내용은 시작 단계에서 크게 중요하지 않으므로 간략하게 확인하고 넘어가셔도 좋습니다.
Web API 실행 포트 변경
다음 코드를 사용하여 앱의 실행 포트를 8080
번으로 변경할 수 있습니다.
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
app.Run("http://localhost:3000");
Web API를 여러 포트에서 실행하기
다음 코드를 8080
번과 4000
번 포트에서 실행하도록 설정합니다.
var app = WebApplication.Create(args);
app.Urls.Add("http://localhost:3000");
app.Urls.Add("http://localhost:4000");
app.MapGet("/", () => "Hello World");
app.Run();
터미널에서 포트를 동적으로 설정
다음 코드는 터미널에서 동적으로 7777
번 포트를 사용하도록 설정합니다.
dotnet run --urls="https://localhost:7777"
환경 변수로 포트 번호 읽어와 설정하기
다음 코드는 환경 변수에서 포트를 읽습니다.
var app = WebApplication.Create(args);
var port = Environment.GetEnvironmentVariable("PORT") ?? "3000";
app.MapGet("/", () => "Hello World");
app.Run($"http://localhost:{port}");
환경에서 포트를 설정하는 기본 방법은 다음 섹션에 나오는 ASPNETCORE_URLS
환경 변수를 사용하는 것입니다.
ASPNETCORE_URLS 환경 변수 사용
ASPNETCORE_URLS
환경 변수를 사용해서 포트를 동적으로 변경할 수 있습니다.
ASPNETCORE_URLS=http://localhost:8080
ASPNETCORE_URLS
다중 경로 사용: 세미 콜론을 구분해서 하나 이상의 포트를 할당할 수 있습니다.
ASPNETCORE_URLS=http://localhost:8080;https://localhost:8090
모든 인터페이스에서 수신 대기
다음 샘플 코드들은 모든 인터페이스에서의 수신 대기를 보여 줍니다.
http://*:8080
var app = WebApplication.Create(args);
app.Urls.Add("http://*:3000");
app.MapGet("/", () => "Hello World");
app.Run();
http://+:8080
var app = WebApplication.Create(args);
app.Urls.Add("http://+:3000");
app.MapGet("/", () => "Hello World");
app.Run();
http://0.0.0.0:8080
var app = WebApplication.Create(args);
app.Urls.Add("http://0.0.0.0:3000");
app.MapGet("/", () => "Hello World");
app.Run();
ASPNETCORE_URLS 환경 변수로 모든 인터페이스에서 수신 대기하기
ASPNETCORE_URLS=http://*:8080;https://+:8090;http://0.0.0.0:8091
개발 인증서로 HTTPS 지정
var app = WebApplication.Create(args);
app.Urls.Add("https://localhost:3000");
app.MapGet("/", () => "Hello World");
app.Run();
사용자 지정 인증서를 사용하여 HTTPS 지정
다음 섹션에서는 appsettings.json 파일을 사용하여 사용자 지정 인증서를 지정하는 방법을 코드 샘플로 보여줍니다.
appsetting.json 파일로 사용자 지정 인증서 지정
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Kestrel": {
"Certificates": {
"Default": {
"Path": "cert.pem",
"KeyPath": "key.pem"
}
}
}
}
구성을 통해 사용자 지정 인증서 지정
var builder = WebApplication.CreateBuilder(args);
// Configure the cert and the key
builder.Configuration["Kestrel:Certificates:Default:Path"] = "cert.pem";
builder.Configuration["Kestrel:Certificates:Default:KeyPath"] = "key.pem";
var app = builder.Build();
app.Urls.Add("https://localhost:3000");
app.MapGet("/", () => "Hello World");
app.Run();
Use the 인증서 API(Certificate APIs) 사용
using System.Security.Cryptography.X509Certificates;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(options =>
{
options.ConfigureHttpsDefaults(httpsOptions =>
{
var certPath = Path.Combine(builder.Environment.ContentRootPath, "cert.pem");
var keyPath = Path.Combine(builder.Environment.ContentRootPath, "key.pem");
httpsOptions.ServerCertificate = X509Certificate2.CreateFromPemFile(certPath,
keyPath);
});
});
var app = builder.Build();
app.Urls.Add("https://localhost:3000");
app.MapGet("/", () => "Hello World");
app.Run();
환경 변수(Environment) 읽기
var app = WebApplication.Create(args);
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/oops");
}
app.MapGet("/", () => "Hello World");
app.MapGet("/oops", () => "Oops! An error happened.");
app.Run();
TODO 리스트 CRUD Web API 만들기 with .NET 8 Minimal APIs
Minimal APIs를 사용한 데이터베이스 CRUD 프로그래밍 연습은 다음 링크의 아티클을 참고하세요.
Minimal APIs를 사용한 TODO 리스트 앱 만들기