푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 도구 및 생산성

C#에서의 유창한 유효성 검사 - 강력하면서도 쉬운 데이터 유효성 검사 도구

Tim Corey
43분 58초

데이터 유효성 검사는 안정적인 소프트웨어 개발의 핵심 요소 중 하나이며, 최신 .NET 애플리케이션에서는 이를 처리하기 위한 견고하고 유지 관리하기 쉽고 확장 가능한 방법이 필요합니다. 바로 이런 상황에서 강력한 형식의 유효성 검사 규칙을 구축하는 데 널리 사용되는 .NET 라이브러리인 FluentValidation이 유용하게 쓰입니다.

Tim Corey는 심층 비디오 튜토리얼 " C#의 Fluent Validation - 강력하면서도 사용하기 쉬운 데이터 유효성 검사 도구 "에서 FluentValidation 사용 과정을 단계별로 안내합니다. 이 글에서는 Tim의 안내를 따라가며 핵심 내용과 코드 예제를 요약하고, 사용자 지정 유효성 검사기, 유효성 검사기 체이닝, ASP.NET 통합, 그리고 .NET Core 3.1 및 .NET Standard 2.0과 같은 이전 런타임 지원과 같은 관련 개념을 다룹니다.

소개: FluentValidation을 선택해야 하는 이유?

팀은 영상 시작 부분에서 데이터 유효성 검사가 얼마나 반복적이고 복잡해지는지 설명합니다. 예를 들어, 프로젝트의 여러 부분에 걸쳐 유사한 유효성 검사 규칙을 복사하여 붙여넣는 것은 DRY(Don't Repeat Yourself) 원칙을 위반하는 것입니다. 대신 그는 FluentValidation이라는 .NET 유효성 검사 라이브러리를 소개합니다. 이 라이브러리는 무료이고 강력하며, 사용자가 소유하지 않은 모델에서도 작동하므로 상업 프로젝트에 이상적입니다.

팀은 배운 것을 실천하는 것의 중요성을 강조하며, 시청자들에게 실력 향상을 위해 자신의 주간 챌린지 시리즈를 참고하라고 권합니다.

데모 앱 개요

Tim은 사용자가 입력할 수 있는 WinForms 데모 애플리케이션을 사용합니다.

  • 이름

  • 계좌 잔액

  • 생일

UI 데모이긴 하지만, 유효성 검사 원칙은 ASP.NET Core, API 테스트, 심지어 콘솔 애플리케이션에도 똑같이 적용됩니다.

사용자 입력을 신뢰하는 것의 위험성

이 시점에서 Tim은 개발자들에게 "사용자를 절대 신뢰하지 마세요"라고 강조합니다. 입력은 종종 예측 불가능할 수 있는데, 예를 들어 나이를 입력할 때 10 대신 "ten"이라고 입력하는 경우처럼 말입니다. 데이터베이스에 저장하기 전에 입력값을 검증하는 것은 필수적입니다.

그는 샘플 유효성 검사 규칙을 설명합니다.

  • 이름과 성은 반드시 입력해야 합니다.

  • 계좌 잔액은 재정 지원에 필요한 최소 요건 등 재무 규정을 준수해야 합니다.

  • 생년월일은 미래일 수 없으며, 120세 이상일 수도 없습니다.

유효성 검사 로직은 어디에 위치해야 할까요?

Tim은 검증기 구성 옵션을 살펴봅니다.

  • UI 폼 내부

  • 데이터 어노테이션을 사용하는 모델 클래스에서

  • FluentValidation을 사용하는 별도의 유효성 검사 클래스에서

그는 데이터 주석이 제한적이며 외부 라이브러리를 사용하거나 보다 사용자 지정된 유효성 검사 로직이 필요한 경우 적합하지 않은 경우가 많다고 지적합니다.

FluentValidation 설치 중

Tim은 Visual Studio를 사용하여 NuGet 통해 FluentValidation을 프로젝트에 추가합니다. 그는 버전 8.1.0을 설치하면서 FluentValidation이 크로스 플랫폼이며 다음과 같은 플랫폼과 호환된다는 점을 언급합니다.

  • .NET Standard 2.0

  • .NET Core

  • ASP.NET

  • WPF

  • 자마린

  • 그리고 더 많은 것들

Tim의 설정은 .NET Core 3.1 이하 버전을 지원하는 FluentValidation 11을 포함하여 이전 런타임에 대한 지원이 필요한 사용자에게도 효과적입니다.

유효성 검사기 클래스 생성

Tim은 새로운 클래스를 생성하여 강력한 형식의 유효성 검사 규칙을 구축하는 방법을 보여줍니다.

public class PersonValidator : AbstractValidator<Person>
public class PersonValidator : AbstractValidator<Person>

이 클래스에는 Person 모델에 대한 모든 유효성 검사 로직이 포함되어 있습니다. 유창한 인터페이스를 사용하여 유효성 검사 규칙을 생성자 내부에 정의합니다.

첫 번째 유효성 검사 규칙: 이름

Tim은 람다 표현식을 사용하여 규칙을 작성합니다.

RuleFor(p => p.FirstName).NotEmpty();
RuleFor(p => p.FirstName).NotEmpty();

그는 Person 객체의 유효성을 검사하기 위해 변수 유효성 검사기를 사용합니다.

var validator = new PersonValidator();
ValidationResult results = validator.Validate(person);
var validator = new PersonValidator();
ValidationResult results = validator.Validate(person);

그는 유효성 검사 실패 사례를 순회하며 사용자가 이해하기 쉬운 메시지를 목록 상자에 표시합니다.

문자열 길이 및 사용자 지정 메시지

Tim은 유효성 검사 규칙을 확장합니다.

RuleFor(p => p.FirstName)
    .NotEmpty().WithMessage("First name is empty")
    .Length(2, 50).WithMessage("Length of first name is invalid");
RuleFor(p => p.FirstName)
    .NotEmpty().WithMessage("First name is empty")
    .Length(2, 50).WithMessage("Length of first name is invalid");

이 규칙은 체이닝 유효성 검사기를 사용하여 이름이 비어 있지 않거나 너무 짧거나 길지 않도록 합니다. Tim은 첫 번째 실패 시 유효성 검사를 중지하기 위해 Cascade(CascadeMode.Stop)를 도입했습니다.

사용자 지정 유효성 검사: 이름에 유효한 문자

Tim은 다음과 같은 메서드를 사용하여 사용자 지정 유효성 검사기를 구현합니다.

private bool BeAValidName(string name)
private bool BeAValidName(string name)

이 기능은 공백과 하이픈을 제거하고 문자열에 유니코드 문자만 포함되도록 하여 국제 문자를 지원할 수 있도록 합니다.

사용자 지정 규칙은 다음과 같이 적용됩니다.

.Must(BeAValidName).WithMessage("{PropertyName} contains invalid characters");
.Must(BeAValidName).WithMessage("{PropertyName} contains invalid characters");

이 메서드 구조는 사용자 지정 우편번호 유효성 검사 로직 함수와 같은 다른 분야에 적용하기에 완벽합니다.

private bool BeAValidPostcode(string postcode)
{
    // Add custom logic here to specify a valid postcode format
}
private bool BeAValidPostcode(string postcode)
{
    // Add custom logic here to specify a valid postcode format
}

그러면 다음과 같은 유효성 검사기에서 사용할 수 있습니다.

RuleFor(c => c.Postcode).Must(BeAValidPostcode)
    .WithMessage("Please specify a valid postcode");
RuleFor(c => c.Postcode).Must(BeAValidPostcode)
    .WithMessage("Please specify a valid postcode");

이는 공개 클래스 CustomerValidator 또는 기타 도메인별 유효성 검사기가 필요한 상업 프로젝트에서 흔히 볼 수 있습니다.

오류 메시지에서 내장 변수 사용하기

Tim은 다음과 같은 자리 표시자를 사용하여 메시지를 동적으로 향상시키는 방법을 보여줍니다.

  • {PropertyName}

  • {총길이}

  • {최소 길이} 및 {최대 길이}

이로 인해 다음과 같은 상황별 오류 메시지가 표시됩니다.

"Length of First Name is invalid (was 105)"
"Length of First Name is invalid (was 105)"

이렇게 하면 사용자가 입력 오류를 더 쉽게 수정할 수 있습니다.

성 및 현지화

Tim은 {PropertyName}을 사용한 재사용 가능한 서식 덕분에 FirstName 유효성 검사 로직을 LastName에 그대로 적용합니다. 그는 또한 다국어 지원이 필요한 ASP.NET 또는 글로벌 애플리케이션 의 경우 WithLocalizedMessage()를 언급합니다.

중요: CascadeMode는 규칙별로 지정됩니다.

Tim은 CascadeMode.Stop이 전체 모델에 전역적으로 적용되는 것이 아니라 개별 규칙에 적용된다는 점을 명확히 했습니다. FirstName과 LastName 필드가 모두 비어 있는 경우, CascadeMode가 설정되어 있더라도 두 규칙 모두 실행됩니다.

생년월일 검증

다음으로, 팀은 생년월일 이 현실적인지 확인하기 위한 규칙을 추가합니다.

private bool BeAValidAge(DateTime dob)
{
    var currentYear = DateTime.Now.Year;
    var dobYear = dob.Year;
    return dobYear <= currentYear && dobYear > (currentYear - 120);
}
private bool BeAValidAge(DateTime dob)
{
    var currentYear = DateTime.Now.Year;
    var dobYear = dob.Year;
    return dobYear <= currentYear && dobYear > (currentYear - 120);
}

사용 방법은 다음과 같습니다.

RuleFor(p => p.DateOfBirth)
    .Must(BeAValidAge)
    .WithMessage("Invalid {PropertyName}");
RuleFor(p => p.DateOfBirth)
    .Must(BeAValidAge)
    .WithMessage("Invalid {PropertyName}");

이는 날짜나 만료 기간과 같은 시간 관련 데이터를 검증하는 데 적합한 패턴입니다.

결론 및 권고사항

Tim은 FluentValidation의 주요 장점을 요약하며 마무리합니다.

  • 중앙 집중식 유효성 검사 로직

  • 사용자 지정 유효성 검사기를 쉽게 만들 수 있습니다

  • .NET 5 이상 및 이전 런타임과 모두 호환됩니다.

  • 복잡한 모델, 목록 및 비동기 규칙을 지원합니다.

취미 활동가와 상업 프로젝트 모두에 적합합니다.

그는 시청자들에게 중첩 규칙, 이메일 속성 유효성 검사 등을 포함한 고급 사용법을 알아보려면 FluentValidation 문서를 참조하라고 권장합니다.

결론

FluentValidation은 .NET 개발자가 재사용 가능하고 표현력이 풍부하며 유지 관리가 용이한 강력한 형식의 유효성 검사 규칙을 구축할 수 있도록 지원합니다. .NET Core, .NET 8로 개발하든, .NET Core 3.1 기반의 레거시 시스템을 유지 관리하든, 이 라이브러리를 사용하면 데이터 유효성 검사가 매우 간편해집니다.

다음과 같은 기능을 갖추고 있습니다:

  • 규칙 구축을 위한 유창한 인터페이스

  • 사용자 지정 우편번호 유효성 검사 로직 지원

  • Visual Studio와의 간편한 통합

  • API 테스트, WinForms 및 ASP.NET 과의 호환성

  • 유효성 검사 실패에 대한 강력한 처리

FluentValidation은 .NET 툴킷에 반드시 있어야 할 필수 요소입니다. 더 자세한 내용은 전체 영상을 시청하시고, Tim의 채널을 구독하시면 C#에 대한 더욱 유익한 영상을 보실 수 있습니다.

팁: FluentValidation 사용이 처음이라면, public 문자열 Name, 문자열 Postcode 등과 같은 속성에 대한 규칙을 사용하여 자체 CustomerValidator를 구현해 보세요. 실제 사용 경험을 얻으려면 모의 API 또는 UI 양식을 사용하여 테스트해 보세요.

Hero Worlddot related to C#에서의 유창한 유효성 검사 - 강력하면서도 쉬운 데이터 유효성 검사 도구
Hero Affiliate related to C#에서의 유창한 유효성 검사 - 강력하면서도 쉬운 데이터 유효성 검사 ...

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해