REST API Model 유효성 검사 하기

ASP.NET Core 기본 제공 모델 유효성 검사 속성

ASP.NET Core는 모델 유효성 검사를 위한 몇 가지 기본 제공 특성을 제공합니다.

  • Required – 필수 필드를 지정합니다.
  • Range – 허용되는 최소값과 최대값을 지정합니다.
  • MinLength – 문자열의 최소 길이를 지정합니다.
  • MaxLength – 문자열의 최대 길이를 지정합니다.
  • Compare – 모델의 2개 속성을 비교합니다. 예를 들어 Email 및 ConfirmEmail 속성을 비교합니다.
  • RegularExpression – 제공된 값이 정규 표현식에서 지정한 패턴과 일치하는지 확인합니다.

이러한 유효성 검사 특성은 System.ComponentModel.DataAnnotations 네임스페이스 에 있습니다.
또한 다음 Nuget 패키지를 설치해야합니다.

Install-Package System.ComponentModel.Annotations

ASP.NET Core REST API의 모델 유효성 검사

ASP.NET Core REST API에서 모델 유효성 검사를 구현하려면 유효성 검사 특성으로 해당 속성을 장식합니다. 
다음 예에서 FirstName은 필수 속성입니다. 최소 2자 이상이어야 하며 100자를 초과할 수 없습니다.

public class Employee
{
    public int EmployeeId { get; set; }
    [Required]
    [StringLength(100, MinimumLength = 2)]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public string Email { get; set; }
    public DateTime DateOfBrith { get; set; }
    public Gender Gender { get; set; }
    public int DepartmentId { get; set; }
    public string PhotoPath { get; set; }
}

ASP.NET Core REST API의 사용자 지정 모델 유효성 검사 오류

사용자 지정 모델 유효성 검사 오류를 추가하려면 ModelState 개체 의 AddModelError() 메서드를 사용합니다 .

[HttpPost]
public async Task<ActionResult<Employee>> CreateEmployee(Employee employee)
{
    try
    {
        if(employee == null)
        {
            return BadRequest();
        }

        // Add custom model validation error
        var emp = employeeRepository.GetEmployeeByEmail(employee.Email);

        if(emp != null)
        {
            ModelState.AddModelError("email", "Employee email already in use");
            return BadRequest(ModelState);
        }

        var createdEmployee = await employeeRepository.AddEmployee(employee);

        return CreatedAtAction(nameof(GetEmployee), new { id = createdEmployee.EmployeeId },
            createdEmployee);
    }
    catch (Exception)
    {
        return StatusCode(StatusCodes.Status500InternalServerError,
            "Error retrieving data from the database");
    }
}

ASP.NET Core REST API 및 ModelState.IsValid 검사

ASP.NET Core REST API에서는 모델 상태가 유효한지 명시적으로 확인할 필요가 없습니다. 컨트롤러 클래스는 [ApiController] 속성으로 장식되어 있기 때문에 모델 상태가 유효한지 확인하고 유효성 검사 오류와 함께 자동으로 400 응답을 반환합니다.

[Route("api/[controller]")]
[ApiController]
public class EmployeesController : ControllerBase
{
}

다음은 모델 유효성 검사가 실패할 때 받는 응답입니다.

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|65b7c07c-4323622998dd3b3a.",
    "errors": {
        "Email": [
            "The Email field is required."
        ],
        "FirstName": [
            "The field FirstName must be a string with a minimum length of 2 and a maximum length of 100."
        ]
    }
}

EmployeeRepository GetEmployeeByEmail

public interface IEmployeeRepository
{
    // Other interface methods
    Task<Employee> GetEmployeeByEmail(string email);
}

public class EmployeeRepository : IEmployeeRepository
{
    private readonly AppDbContext appDbContext;

    public EmployeeRepository(AppDbContext appDbContext)
    {
        this.appDbContext = appDbContext;
    }

    public async Task<Employee> GetEmployeeByEmail(string email)
    {
        return await appDbContext.Employees
            .FirstOrDefaultAsync(e => e.Email == email);
    }
}

답글 남기기