Minimal APIs 소개

  • 6 minutes to read

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 리스트 앱 만들기

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