API 개발

APIλŠ” Lino μƒνƒœκ³„μ—μ„œ μ„œλΉ„μŠ€ κΈ°λŠ₯을 λ…ΈμΆœν•˜λŠ” μ£Όμš” μˆ˜λ‹¨μž…λ‹ˆλ‹€.
이 μž₯μ—μ„œλŠ” ν”„λ ˆμž„μ›Œν¬κ°€ μ¦‰μ‹œ μ‚¬μš© κ°€λŠ₯ν•œ Minimal APIsλ₯Ό μƒμ„±ν•˜λŠ” 방법, Source Generatorsλ₯Ό ν†΅ν•œ μžλ™ 등둝 κ³Όμ •, 그리고 λͺ…ν™•ν•˜κ³  ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•˜λ©° 잘 λ¬Έμ„œν™”λœ μ—”λ“œν¬μΈνŠΈλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ ꢌμž₯ν•˜λŠ” 방법을 μ„€λͺ…ν•©λ‹ˆλ‹€.

Minimal APIs

LinoλŠ” μ—”λ“œν¬μΈνŠΈ 생성 μ‹œ 기본적으둜 Minimal API μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜λ©°, λ‹€μŒμ„ μš°μ„ μ‹œν•©λ‹ˆλ‹€:

  • λͺ…ν™•μ„± – κ°„κ²°ν•˜κ³  직관적이며 ν‘œν˜„λ ₯이 μžˆλŠ” μ½”λ“œ.
  • μ„±λŠ₯ – λΆˆν•„μš”ν•œ μ˜€λ²„ν—€λ“œ 없이 μ΅œμ ν™”λœ 응닡.

톡합 κΈ°λŠ₯

TypedResults: κ°•λ ₯ν•œ νƒ€μž…μ˜ 응닡을 보μž₯ν•˜μ—¬ 가독성과 OpenAPI 생성에 도움을 μ€λ‹ˆλ‹€.

API 버전 관리: μ—”λ“œν¬μΈνŠΈλŠ” ν˜Έν™˜μ„±μ„ κΉ¨μ§€ μ•Šκ³  ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν’λΆ€ν•œ λ¬Έμ„œν™”: ꡬ성 κ°€λŠ₯ν•œ 메타데이터가 OpenAPI에 직접 ν¬ν•¨λ˜λ©°, λ‹€μŒμ„ ν¬ν•¨ν•©λ‹ˆλ‹€:

  • WithTags β†’ OpenAPIμ—μ„œ μ—”λ“œν¬μΈνŠΈλ₯Ό 논리적 μ„Ήμ…˜μœΌλ‘œ κ·Έλ£Ήν™”ν•©λ‹ˆλ‹€.
  • WithName β†’ operationIdλ₯Ό μΌκ΄€λ˜κ²Œ μ •μ˜ν•©λ‹ˆλ‹€.
  • WithSummary β†’ μ—”λ“œν¬μΈνŠΈ λͺ©μ μ„ λͺ…ν™•νžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.
  • Produces(statusCode, schema) β†’ μƒνƒœ μ½”λ“œμ™€ 응닡 계약을 μ§€μ •ν•©λ‹ˆλ‹€.
  • MapToApiVersion β†’ λ™μΌν•œ μ—”λ“œν¬μΈνŠΈμ˜ λ‹€λ₯Έ 버전을 λ…ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Requests 및 Responses

Record classesλŠ” 기본적으둜 Requests와 Responses에 μ‚¬μš©λ©λ‹ˆλ‹€:

  • λΆˆλ³€(λΆ€μž‘μš©κ³Ό 버그 κ°μ†Œ)
  • κ°„κ²°ν•˜κ³  읽기 쉬움

CQRSμ™€μ˜ 톡합:

  • μ—”λ“œν¬μΈνŠΈλ₯Ό 톡해 μˆ˜μ‹ λœ μš”μ²­μ€ Commands λ˜λŠ” Queries둜 λ³€ν™˜λ©λ‹ˆλ‹€.
  • Commands/Queries의 κ²°κ³ΌλŠ” Responses둜 λ³€ν™˜λ˜μ–΄ μ•„ν‚€ν…μ²˜ 일관성을 μœ μ§€ν•©λ‹ˆλ‹€.

κ°„λ‹¨ν•œ 예:
public record CreatePersonRequest(string Name, int Age);
public record CreatePersonResponse(Guid Id, string Name, int Age);

μƒˆλ‘œμš΄ API λ§Œλ“€κΈ°

Lino CLIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—”λ“œν¬μΈνŠΈλ₯Ό λ§Œλ“œλŠ” 것은 맀우 κ°„λ‹¨ν•©λ‹ˆλ‹€:

lino new api

λŒ€ν™”ν˜• λ§ˆλ²•μ‚¬κ°€ λ‹€μŒμ„ μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ – APIκ°€ 생성될 μ„œλΉ„μŠ€.
  • λͺ¨λ“ˆ – μ„œλΉ„μŠ€μ˜ λͺ¨λ“ˆ(ν•΄λ‹Ήλ˜λŠ” 경우).
  • μ—”ν„°ν‹° – μ—”λ“œν¬μΈνŠΈμ™€ μ—°κ²°λœ μ—”ν„°ν‹°.
  • API 이름 – 일반적으둜 μž‘μ—… 동사와 일치 (예: CreatePerson).
  • μž‘μ—… μœ ν˜• – POST, PUT, PATCH, DELETE λ˜λŠ” GET.
  • 라우트 – 라우트 νŒ¨ν„΄ (예: /people/{id}).

μ˜ˆμ‹œ:

Person 엔터티와 μ—°κ²°λœ CreatePersonμ΄λΌλŠ” POST APIλ₯Ό μƒμ„±ν•˜λ©΄, CLIλŠ” μžλ™μœΌλ‘œ λ‹€μŒμ„ μƒμ„±ν•©λ‹ˆλ‹€:

  • HTTP 맀핑이 ν¬ν•¨λœ μ—”λ“œν¬μΈνŠΈ.
  • μš”μ²­/응닡 DTO.
  • OpenAPI 톡합 및 버전 관리λ₯Ό μœ„ν•œ ν™•μž₯.
  • λ‹€λ₯Έ μ„œλΉ„μŠ€μ—μ„œ λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” νƒ€μž… μ§€μ • HttpClient.

μƒμ„±λœ ꡬ쑰:

MyApp/
└── src/
    β”œβ”€β”€ Services/
    β”‚   └── MyService/
    β”‚       └── Presentation.API/
    β”‚           β”œβ”€β”€ MyApp.MyService.Presentation.API.csproj
    β”‚           └── Endpoints/
    β”‚               └── People/
    β”‚                   └── CreatePerson/
    β”‚                       β”œβ”€β”€ CreatePersonEndpoint.cs
    β”‚                       β”œβ”€β”€ CreatePersonExtensions.cs
    β”‚                       β”œβ”€β”€ CreatePersonRequest.cs
    β”‚                       └── CreatePersonResponse.cs
    └── Integrations/
        └── MyService/
            └── Http/
                β”œβ”€β”€ Contracts/
                β”‚   └── Apis/
                β”‚       └── People/
                β”‚           β”œβ”€β”€ IPersonHttpClient.cs
                β”‚           └── CreatePerson/
                β”‚               β”œβ”€β”€ CreatePersonRequest.cs
                β”‚               └── CreatePersonResponse.cs
                └── Clients/
                    └── Apis/
                        └── PersonHttpClient.cs

Source Generatorsλ₯Ό μ‚¬μš©ν•œ μ—”λ“œν¬μΈνŠΈ 등둝

LinoλŠ” μ—”λ“œν¬μΈνŠΈλ₯Ό μˆ˜λ™μœΌλ‘œ λ§€ν•‘ν•˜κ±°λ‚˜ λŸ°νƒ€μž„μ— Reflection을 많이 μ‚¬μš©ν•˜λŠ” ν•„μš”μ„±μ„ μ œκ±°ν•©λ‹ˆλ‹€.
λŒ€μ‹ , Source Generatorsλ₯Ό μ‚¬μš©ν•˜μ—¬ 컴파일 μ‹œ μžλ™μœΌλ‘œ 등둝 μ½”λ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

μž‘λ™ 방식

μƒμ„±λœ 각 μ—”λ“œν¬μΈνŠΈμ— λŒ€ν•΄ μ œλ„ˆλ ˆμ΄ν„°λŠ” MapGet, MapPost, MapPut, MapDelete λ“± ν˜ΈμΆœν•˜λŠ” 클래슀/λΆ€λΆ„ 클래슀λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

μ΄λŠ” Program.cs에 λͺ¨λ“  맀핑을 μˆ˜λ™μœΌλ‘œ μΆ”κ°€ν•  ν•„μš”λ₯Ό λŒ€μ²΄ν•©λ‹ˆλ‹€.

μž₯점:

  • 컴파일 νƒ€μž„ 등둝 β†’ λŸ°νƒ€μž„ 였λ₯˜ λ°©μ§€.
  • κ°„κ²°ν•œ Program.cs β†’ μˆ˜λ™ ꡬ성 λ²”μœ„ κ°μ†Œ.
  • AOT ν˜Έν™˜μ„± β†’ Reflection μ˜μ‘΄μ„± 제거.
  • 톡합 λ¬Έμ„œ β†’ 메타데이터(tags, summary, produces)κ°€ λ§€ν•‘κ³Ό ν•¨κ»˜ 생성됨.

이 λͺ¨λΈμ€ Linoμ—μ„œ μƒμ„±λœ APIκ°€ λ‹€μŒμ„ 보μž₯ν•©λ‹ˆλ‹€:

  • μžλ™ λ¬Έμ„œν™”
  • 높은 μ„±λŠ₯
  • ν”„λ ˆμž„μ›Œν¬μ˜ CQRS μ•„ν‚€ν…μ²˜μ™€ 일치
처리되지 않은 오류가 발생했습니다. 새로 고침 πŸ—™