Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# FluentValidation으로 생년월일(DateOfBirth) 유효성 검사하기 – 현재 연도 이후 날짜 입력 차단 방법

C# 개발에서 FluentValidation은 객체의 속성 값을 손쉽게 검증할 수 있게 해주는 강력한 라이브러리입니다. 특히 생년월일(DateOfBirth)처럼 미래 날짜가 입력되면 안 되는 필드를 검증할 때 매우 유용합니다. 이 글에서는 현재 연도를 초과하는 날짜가 입력될 경우 유효성 검사에 실패하도록 처리하는 방법을 살펴보겠습니다.

RuleFor 메서드로 검증 규칙 정의하기

특정 속성에 대한 유효성 검사 규칙을 지정하려면 RuleFor 메서드를 호출하고, 검증하고자 하는 속성을 가리키는 람다 식(lambda expression)을 전달하면 됩니다.

RuleFor(p => p.DateOfBirth)

Validate 메서드로 유효성 검사 실행하기

유효성 검사기를 실행하려면 먼저 검증기(Validator) 객체를 인스턴스화한 뒤, 검증 대상 객체를 인자로 전달하여 Validate 메서드를 호출합니다.

ValidationResult results = validator.Validate(person);

Validate 메서드는 ValidationResult 객체를 반환하며, 이 객체에는 다음 두 가지 핵심 속성이 포함되어 있습니다.

IsValid – 유효성 검사가 성공했는지 여부를 나타내는 불리언(Boolean) 값입니다.

Errors – 검증 실패에 대한 상세 정보를 담고 있는 ValidationFailure 객체의 컬렉션입니다.

전체 예제 코드

아래 예제에서는 Must 메서드와 사용자 정의 검증 함수인 BeAValidAge를 활용하여, 생년월일이 현재 연도 이후이거나 120년보다 더 오래된 경우 검증에 실패하도록 구현했습니다.

static void Main(string[] args) {
    List<string> errors = new List<string>();

    PersonModel person = new PersonModel();
    person.FirstName = "TestUser";
    person.LastName = "TestUser";
    person.AccountBalance = 100;
    person.DateOfBirth = DateTime.Now.Date.AddYears(1);

    PersonValidator validator = new PersonValidator();

    ValidationResult results = validator.Validate(person);

    if (results.IsValid == false) {
        foreach (ValidationFailure failure in results.Errors){
            errors.Add(failure.ErrorMessage);
        }
    }

    foreach (var item in errors){
        Console.WriteLine(item);
    }
    Console.ReadLine();
}

public class PersonModel {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public decimal AccountBalance { get; set; }
    public DateTime DateOfBirth { get; set; }
}

public class PersonValidator : AbstractValidator<PersonModel> {
    public PersonValidator(){
        RuleFor(p => p.DateOfBirth)
        .Must(BeAValidAge).WithMessage("Invalid {PropertyName}");
    }

    protected bool BeAValidAge(DateTime date){
        int currentYear = DateTime.Now.Year;
        int dobYear = date.Year;

        if (dobYear <= currentYear && dobYear > (currentYear - 120)){
            return true;
        }

        return false;
    }
}

예제 코드에서는 DateTime.Now.Date.AddYears(1)을 통해 의도적으로 현재 연도보다 1년 뒤의 날짜를 생년월일로 설정했습니다. 따라서 BeAValidAge 메서드의 조건(dobYear <= currentYear)을 만족하지 못해 유효성 검사가 실패하게 됩니다.

실행 결과

Invalid Date Of Birth

에러 메시지의 {PropertyName} 플레이스홀더는 검증 대상 속성의 실제 이름(Date Of Birth)으로 자동 치환되어 출력됩니다. 이를 활용하면 여러 속성에 동일한 규칙을 적용하면서도 일관된 형식의 에러 메시지를 제공할 수 있습니다.

마무리

이처럼 FluentValidation의 Must 메서드와 사용자 정의 검증 로직을 조합하면, 단순한 필수 입력 검사를 넘어 비즈니스 요구 사항에 맞는 복잡한 날짜 검증도 손쉽게 구현할 수 있습니다. 생년월일뿐만 아니라 계약일, 만료일 등 미래 또는 과거 날짜를 제한해야 하는 모든 필드에 응용할 수 있으니 적극적으로 활용해 보시기 바랍니다.