`XmlFluentValidator`: 코드 퍼스트 XML 검증, 규칙에 가깝게 유지

발행: (2026년 1월 13일 오전 03:17 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

RzR

전통적인 XML 검증의 문제점 / 어려움

XSD는 자체적인 강점을 가지고 있지만, 실제로는 다음과 같은 트레이드‑오프가 있습니다:

  • 가독성이 낮고 탐색이 어려움.
  • 요소 간 교차 또는 계산된 규칙을 표현하는 데 제한적.
  • 애플리케이션 로직과 함께 진화시키기 어려움.
  • 비즈니스 수준 검증 의미를 위한 자연스러운 위치가 없음(또는 매우 열악함).

순수 런타임 검증은 종종 다음과 같은 결과를 초래합니다:

  • 프로젝트 전반에 걸쳐 중복되는 커스텀 XPath 로직.
  • 소비자와 공유할 공식 스키마가 없음.
  • 런타임 검증과 계약 간에 일관성 없는 검증 동작.

XmlFluentValidator는 이러한 격차의 일부를 메우는 데 도움이 될 수 있습니다.

XmlFluentValidator가 무엇인가

XmlFluentValidator.NET Standard 2.0 라이브러리로, 다음을 할 수 있습니다:

  • 유창하고 강력히 타입이 지정된 C# API를 사용하여 XML 검증 규칙 정의.
  • 런타임에 구조화된 오류 출력을 제공하며 XML 문서 검증.
  • 규칙에 대한 문서, 심각도 및 메시지 설정.
  • 스키마 검증을 사용자 정의 런타임 로직과 결합.
  • 규칙으로부터 XSD 스키마 생성 (지원 및 진화 중).

검증 규칙을 정적 XML 파일이 아닌 일급 코드 아티팩트로 취급합니다.

핵심 설계 원칙

  1. 코드가 진리의 원천이다
    검증 규칙은 도메인 로직과 함께 C#에 존재합니다. 스키마 파일과 런타임 검증 사이에 중복이 없습니다.

  2. 유창하고 의도 중심의 API
    규칙은 요구 사항처럼 읽히며, 인프라스트럭처가 아닙니다:

    • 어떤 요소가 필수인가?
    • 어떤 제약이 적용되는가?
    • 왜 이 규칙이 존재하는가?
  3. 런타임 + 스키마 호환성
    규칙은 가능한 한 XSD 구조에 깔끔하게 매핑되도록 설계되었으며, 필요할 경우 런타임 전용 로직도 허용합니다.

Validation 규칙 정의

라이브러리의 핵심은 경로, 요소, 속성을 대상으로 하는 유창한 빌더입니다.

Element Rules

var validator = new XmlFluentValidator()
    .ForPath("/order/id")
        .WithElementRequired("Order ID is required")
        .WithElementMatchesRegex(@"^\d+$", "Order ID must be numeric")
        .Done()
    .ForPath("/order/total")
        .WithElementInRange(0, 10000, true, "Total must be between 0 and 10000")
        .Done();

다음과 같이 명확하게 표현됩니다:

  • 요소가 존재해야 합니다.
  • 값은 특정 형식을 따라야 합니다.
  • 값은 유효한 숫자 범위 내에 있어야 합니다.

XSD 구문이 없습니다. XPath 보일러플레이트도 없습니다.

Attribute Validation

validator
    .ForPath("/order/items/item")
        .WithAttributeRequired("sku", "SKU is mandatory")
        .WithAttributeMatchesRegex("sku", @"^[A-Z0-9\-]+$")
        .WithAttributeInRange("quantity", 1, 100, true)
        .Done();

속성 규칙을 읽기 어렵거나 흩어지는 일반적인 XSD 문제를 피할 수 있습니다.

Cardinality, Length, and Uniqueness

API는 일반적인 구조적 제약을 지원합니다:

  • 요소 존재 여부 (필수 / 선택).
  • 최대 발생 횟수.
  • 값 길이 (최소, 최대, 정확히).
  • 형제 노드 간의 고유성.
  • 데이터 타입 강제 적용.
  • Nullable (xs:nillable) 제어.

이 모든 사항을 코드 내에서 직접 문서화하고 메시지화할 수 있습니다.

Custom and Global Rules

일부 규칙은 XSD로는 전혀 표현할 수 없습니다(예: 요소 간 논리, 계산된 합계, 문서 전체 제약). XmlFluentValidator는 전역 규칙을 지원합니다:

validator.GlobalRule(doc =>
{
    var items = doc.XPathSelectElements("/order/items/item");
    return items.Any();
}, "Order must contain at least one item");

이 규칙들은:

  • 런타임에 실행됩니다.
  • 동일한 검증 파이프라인에 참여합니다.
  • 구조화된 오류 메시지를 생성합니다.
  • 스키마 검증과 함께 사용할 수 있습니다.

이는 라이브러리의 가장 강력한 차별점 중 하나입니다.

검증 실행 및 결과

var result = validator.Validate(xDocument);

if (!result.IsValid)
{
    foreach (var error in result.Errors)
    {
        Console.WriteLine($"{error.Path}: {error.Message}");
    }
}

각 검증 오류에는 다음이 포함됩니다:

  • XML 경로.
  • 위반된 규칙.
  • 구성된 메시지.
  • 심각도 메타데이터.

이 출력은 다음에 적합합니다:

  • API.
  • 로깅.
  • 자동화 테스트.

XSD Schema Generation

A key goal of XmlFluentValidator is schema generation from fluent validation rules. Rules such as:

  • Required elements.
  • Data types.
  • Ranges.
  • Enumerations.
  • Documentation annotations.

can be emitted into an XSD representation. This allows you to:

  • Share contracts with external systems.
  • Keep schemas aligned with runtime validation.
  • Avoid maintaining two parallel validation artefacts.

XmlFluentValidator bridges the gap between code‑first validation and contract‑first schema generation, giving you a single source of truth for XML validation.

실제 시스템에 적용되는 방식

XmlFluentValidator는 특히 다음과 같은 경우에 유용합니다:

  • XML 검증 규칙이 자주 변경됩니다.
  • 비즈니스 로직을 XSD 기능을 넘어 강제해야 합니다.
  • 검증을 런타임에 동적으로 실행해야 합니다.
  • 스키마는 여전히 공유되거나 문서화되어야 합니다.
  • 검증 로직은 정적 파일이 아니라 애플리케이션 코드와 함께 있어야 합니다.

일반적인 사용 사례는 다음과 같습니다:

  • 통합 게이트웨이
  • 구성 검증
  • ETL 파이프라인
  • 레거시 XML 현대화
  • 도메인 특화 XML 형식

최종 생각

XmlFluentValidator는 XSD를 대체하려는 것이 아닙니다.
XML 검증을 보다 표현력 있게, 유지보수가 용이하게, 그리고 현대 .NET 개발자들의 사고 방식에 맞게 만들고자 합니다.

또한 다음과 같이 생각한다면:

  • 검증 규칙은 비즈니스 규칙처럼 읽혀야 합니다
  • 코드는 주요 진실 원천이어야 합니다
  • 스키마는 손으로 직접 만들지 않고 자동으로 생성되어야 합니다

그렇다면 XmlFluentValidator는 주목할 가치가 있습니다.

🔗 Repository:

Back to Blog

관련 글

더 보기 »

C#로 PowerPoint (PPT/PPTX)를 PDF로 변환

Spire.Presentation을 사용한 C에서 PowerPoint PPT/PPTX를 PDF로 변환하기 일상적인 개발 및 사무 작업에서 PowerPoint 파일을 PDF로 변환하는 것은 높은 우선순위입니다.