Minimal APIs 소개

  • 5 minutes to read

ASP.NET Core 6.0으로 버전이 올라서면서,

ASP.NET Core 프레임워크를 만들고 있는 팀의 두 천재들(@DamianEdwards, @davidfowl)이 Minimal APIs 이름으로 새롭게 Web API를 만드는 방법을 소개하였습니다.

우리말로 해석하면 최소 API로 부릅니다.

ASP.NET 팀은 거의 매주 단위로 ASP.NET Community Standup 행사를 여는데, 2년 전인가 최소(Minimal) API에 대한 언급을 했었는데, 그 결실이 .NET 6에 포함된 것입니다. 반갑기도 하지만, 기존의 책과 자료들과는 시작부터 다른 모양이니 아예 새롭게 배우는 또 다른 Web API라고 봐도 됩니다.

이 문서의 내용은 Minimal API의 다음 내용을 다룹니다.

  • 새로운 호스팅 API
    • Microsoft.AspNetCore.Builder.WebApplication 클래스
    • Microsoft.AspNetCore.Builder.WebApplicationBuilder 클래스
  • 새로운 라우팅 APIs

WebApplication 클래스

ASP.NET Core 템플릿에서 기본으로 생성되는 코드 모양은 다음과 같습니다.

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(app)을 만듭니다.

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();
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com