다른 주제로 내용이 길어질 거 같아서 글을 새로 만들었습니다.
asp.net core 9까지 minimal api는 validation 기능이 공식적으로 제공되지 않았습니다. 개발자가 외부 라이브러리나 filter를 통해 해결했었는데요.
.net 10 부터는 프레임워크에서 공식적으로 기능이 제공됩니다.
.net 10 preview 3 부터 테스트 해 볼 수 있으며 꽤 유용해 보입니다. 다만 아직까지는 일관성이 부족한 상태입니다.
다른 주제로 내용이 길어질 거 같아서 글을 새로 만들었습니다.
asp.net core 9까지 minimal api는 validation 기능이 공식적으로 제공되지 않았습니다. 개발자가 외부 라이브러리나 filter를 통해 해결했었는데요.
.net 10 부터는 프레임워크에서 공식적으로 기능이 제공됩니다.
.net 10 preview 3 부터 테스트 해 볼 수 있으며 꽤 유용해 보입니다. 다만 아직까지는 일관성이 부족한 상태입니다.
interceptor 기반 소스제네레이터에 의존하기 때문에 csproj에 다음 구성을 추가해야 합니다.
<InterceptorsNamespaces>$(InterceptorsNamespaces);Microsoft.AspNetCore.Http.Validation.Generated</InterceptorsNamespaces>
사용 방법은 매우 단순한데요.
builder.Services.AddValidation();
DI에 Validation을 추가하면 바로 동작합니다.
app.MapPost("minimal", ([FromBody] Dto dto) => dto);
public class Dto
{
[Required]
public string Required { get; init; }
}
Post /minimal
Accept: application/json
Content-Type: application/json
{
}
200 OK
{
"required": null
}
400 Bad Request
{
"title": "One or more validation errors occurred.",
"errors": {
"Required": [
"The Required field is required."
]
}
}
Post /minimal
Accept: application/json
Content-Type: application/json
{
"Required": null,
}
200 OK
{
"required": null
}
400 Bad Request
{
"title": "One or more validation errors occurred.",
"errors": {
"Required": [
"The Required field is required."
]
}
}
public class Dto
{
[Required]
public string Required { get; init; } = "inline"
}
Post /minimal
Accept: application/json
Content-Type: application/json
{
}
200 OK
{
"required": "inline"
}
Post /minimal
Accept: application/json
Content-Type: application/json
{
"Required": null,
}
200 OK
{
"required": null
}
400 Bad Request
{
"title": "One or more validation errors occurred.",
"errors": {
"Required": [
"The Required field is required."
]
}
}
| 입력 | 조건 | .net 8 | .net 10 with validation |
|---|---|---|---|
| [Required] | null | error | |
| null | [Required] | null | error |
| [Requred] with inline | “inline” | “inline” | |
| null | [Requred] with inline | null | error |
계속해서 Reflection을 대신해서 Source Generator 기반 인프라에 투자를 많이 하고 있는 것 같습니다. 닷넷 코어 초기부터 시작된 DI 중심의 패러다임 변화와 더불어서 Source Generator 기반의 코드 확장 패러다임에 대해서도 점차 밑그림이 분명하게 그려지는 것 같아서 잘 봐둘 필요가 있는 부분이 될 것 같습니다. ![]()
.net 10 preview 4 에서 record가 정상적으로 validation 됩니다 ![]()