Validation support in minimal APIs 알아보기

다른 주제로 내용이 길어질 거 같아서 글을 새로 만들었습니다.

asp.net core 9까지 minimal api는 validation 기능이 공식적으로 제공되지 않았습니다. 개발자가 외부 라이브러리나 filter를 통해 해결했었는데요.

.net 10 부터는 프레임워크에서 공식적으로 기능이 제공됩니다.

.net 10 preview 3 부터 테스트 해 볼 수 있으며 꽤 유용해 보입니다. 다만 아직까지는 일관성이 부족한 상태입니다.

6개의 좋아요

interceptor 기반 소스제네레이터에 의존하기 때문에 csproj에 다음 구성을 추가해야 합니다.

<InterceptorsNamespaces>$(InterceptorsNamespaces);Microsoft.AspNetCore.Http.Validation.Generated</InterceptorsNamespaces>

사용 방법은 매우 단순한데요.

builder.Services.AddValidation();

DI에 Validation을 추가하면 바로 동작합니다.

2개의 좋아요

minimal api 샘플

app.MapPost("minimal", ([FromBody] Dto dto) => dto);

Case 1. RequiredAttribute

public class Dto
{
    [Required]
    public string Required { get; init; }
}

1-1. 빈 BODY 전달

Post /minimal
Accept: application/json
Content-Type: application/json

{
}

.NET 8

200 OK
{
  "required": null
}

.NET 10

400 Bad Request
{
  "title": "One or more validation errors occurred.",
  "errors": {
    "Required": [
      "The Required field is required."
    ]
  }
}

1-2. 명시적 null 전달

Post /minimal
Accept: application/json
Content-Type: application/json

{
  "Required": null,
}

.NET 8

200 OK
{
  "required": null
}

.NET 10

400 Bad Request
{
  "title": "One or more validation errors occurred.",
  "errors": {
    "Required": [
      "The Required field is required."
    ]
  }
}

Case 2. RequiredAttribute with Inline initialization

public class Dto
{
    [Required]
    public string Required { get; init; } = "inline"
}

2-1. 빈 BODY 전달

Post /minimal
Accept: application/json
Content-Type: application/json

{
}

.NET 8, 10

200 OK
{
  "required": "inline"
}

2-2 . 명시적 null 전달

Post /minimal
Accept: application/json
Content-Type: application/json

{
  "Required": null,
}

.NET 8

200 OK
{
  "required": null
}

.NET 10

400 Bad Request
{
  "title": "One or more validation errors occurred.",
  "errors": {
    "Required": [
      "The Required field is required."
    ]
  }
}
3개의 좋아요
입력 조건 .net 8 .net 10 with validation
[Required] null error
null [Required] null error
[Requred] with inline “inline” “inline”
null [Requred] with inline null error
5개의 좋아요

계속해서 Reflection을 대신해서 Source Generator 기반 인프라에 투자를 많이 하고 있는 것 같습니다. 닷넷 코어 초기부터 시작된 DI 중심의 패러다임 변화와 더불어서 Source Generator 기반의 코드 확장 패러다임에 대해서도 점차 밑그림이 분명하게 그려지는 것 같아서 잘 봐둘 필요가 있는 부분이 될 것 같습니다. :+1:

8개의 좋아요

record 는 .net 10 preview 4에서 지원한다고 하는군요.
아주 좋네요.

잔여이슈

3개의 좋아요

.net 10 preview 4 에서 record가 정상적으로 validation 됩니다 :rofl:

4개의 좋아요