핵심 엔지니어링 개요: 클라우드 네이티브 쿠버네티스(Kubernetes, K8s) 매니페스트, 깃옵스(GitOps) 파이프라인, 그리고 국방 지휘통제(C4I) 지능형 클러스터의 핵심 설정 규격인 YAML은 사람이 읽기 쉽도록 설계되었지만, 스페이스 1개의 들여쓰기(Indent) 오차만으로도 파싱 트리가 완전히 붕괴되어 운영 클러스터의 파드(Pod) 배포 실패와 대규모 서비스 중단을 유발하는 악명 높은 취약성을 안고 있습니다. 특히 공공 전산망과 군사 연구소의 물리적 폐쇄망(Air-Gap) 환경에서는 외산 웹 기반 검증기를 사용할 수 없으며, 무거운 YamlDotNet 라이브러리의 버전 충돌 리스크가 상존합니다. ZeliDesk의 ZeliYaml은 외부 NuGet 의존성을 100% 제거한 순수 C# 네이티브 재귀 하향 파서(Recursive-Descent Parser)를 탑재하여, YAML ➔ JSON 양방향 무손실 변환, 2스페이스 표준 정규화 포맷팅, 인라인 주석 필터링(FindCommentStart), 그리고 다중 라인 리터럴(|, >)을 0초 만에 완벽 검증하는 엔터프라이즈 온디바이스 거버넌스 아키텍처를 실현했습니다.

1. 배경: '스페이스 1개의 참사'—선언적 인프라 YAML의 구조적 딜레마

오늘날 초·중·고 AI 디지털교과서(AIDT) 백엔드 인프라와 국방 지휘통제(C4I) 시스템은 모두 도커(Docker) 컨테이너와 쿠버네티스(Kubernetes) 위에서 구동됩니다. 인프라를 코드로 관리하는 IaC(Infrastructure as Code)와 깃옵스(GitOps)의 사실상 표준 언어는 YAML (YAML Ain't Markup Language)입니다.

그러나 YAML은 엄격한 중괄호({})와 쉼표(,)로 스코프를 정의하는 JSON과 달리, 오직 공백 문자(Whitespace Indent)의 깊이만으로 데이터 계층을 판별합니다:

운용 환경 다루는 YAML 구성 파일 구문 오류 시 치명도 기존 대응 방식의 한계
AIDT 클라우드 인프라 K8s Deployment, Service, Ingress 매니페스트 전국 동시 접속 원격 수업 중단, 서버 오토스케일링 실패 배포 파이프라인에서야 뒤늦게 런타임 오류 감지
국방 C4I 및 무기체계 도커 컴포즈(Docker Compose), Helm 차트 설정 지휘통제 마이크로서비스 배포 실패, 작전 통신 두절 폐쇄망 인트라넷에서 0초 구문 검증 도구 부재
공교육 SW/클라우드 실습 학생들의 Ansible, CI/CD 파이프라인 실습 파일 들여쓰기 오류로 인한 실습 진행 지연 및 흥미 저하 에러 발생 위치(Line 번호) 직관적 파악 어려움

2. 순수 C# 무의존성(Zero-Dependency) 파서 설계 철학

대다수의 .NET 개발팀은 YAML을 다룰 때 오픈소스 라이브러리인 YamlDotNet을 Nuget 패키지로 참조합니다. 그러나 YamlDotNet은 수십 개의 어셈블리 의존성과 복잡한 리플렉션(Reflection) 및 방대한 타입 매핑 규칙을 포함하고 있어, 바이너리 용량이 비대해지고 AOT(Ahead-of-Time) 네이티브 컴파일 환경에서 호환성 문제를 야기합니다.

ZeliDesk의 ZeliYaml은 외부 의존성을 일체 배제하고, .NET 9 표준 런타임과 System.Text.Json만을 활용하는 584줄의 순수 C# 네이티브 파서(Pure C# Native Parser)를 단일 파일 내에 자체 구현했습니다:

flowchart TD RawYAML["원시 YAML 문자열 (Raw Input)"] subgraph Preprocessing["1단계: 정규화 및 주석 전처리"] Normalize["개행 문자 통일 (\r\n ➔ \n)"] CommentFilter["FindCommentStart()
문자열 외부의 '#' 주석 완벽 제거"] IndentScan["들여쓰기 깊이(indent) 및 본문 분리"] end subgraph Recursive_Engine["2단계: 재귀 하향 블록 파서 (Recursive-Descent)"] BlockDetector["ParseBlock()
리스트('- ') vs 맵(':') vs 스칼라 분기"] ParseMap["ParseMap()
들여쓰기 스코프 기반 딕셔너리 생성"] ParseList["ParseList()
배열 요소 및 중첩 객체 수집"] ParseScalar["ParseScalar()
int, double, bool, null, 문자열 자동 추론"] end subgraph JSON_Bridge["3단계: System.Text.Json 양방향 트랜스파일러"] JsonSerialize["JsonSerializer.Serialize()
WriteIndented 들여쓰기 뷰포트"] JsonElementToYaml["JsonElementToYaml()
JSON AST ➔ 2스페이스 YAML 역생성"] end RawYAML --> Normalize --> CommentFilter --> IndentScan IndentScan --> BlockDetector BlockDetector --> ParseMap BlockDetector --> ParseList BlockDetector --> ParseScalar ParseMap & ParseList & ParseScalar --> JsonSerialize JsonSerialize <-->|양방향 트랜스파일| JsonElementToYaml style Preprocessing fill:#1e1b4b,stroke:#818cf8,stroke-width:2px,color:#f8fafc style Recursive_Engine fill:#0f2b48,stroke:#38bdf8,stroke-width:2px,color:#f8fafc style JSON_Bridge fill:#06261f,stroke:#10b981,stroke-width:2px,color:#f8fafc

3. 들여쓰기 전처리 및 따옴표 보호 주석 분리 알고리즘 (FindCommentStart)

YAML 파서 제작 시 가장 까다로운 난제 중 하나는 "주석 기호(#)가 실제 주석인지, 아니면 따옴표로 감싸진 문자열 데이터의 일부인지"를 정확히 구분하는 것입니다. 예를 들어 color: "#0ea5e9" # 테마 색상이라는 라인에서 단순 IndexOf('#')를 수행하면 색상 코드까지 잘려버리는 파싱 재앙이 발생합니다.

ZeliYaml은 단일 패스 문자열 상태 머신인 FindCommentStart 알고리즘을 구축하여 따옴표 스코프를 완벽하게 보호합니다:

C# 따옴표 내부 주석 보호 및 전처리 알고리즘 (ZeliYamlWindow.xaml.cs)
private int FindCommentStart(string line)
{
    bool inSingle = false, inDouble = false;
    for (int i = 0; i < line.Length; i++)
    {
        char c = line[i];
        // 홑따옴표 및 쌍따옴표 내부 토글 플래그 감시
        if (c == '\'' && !inDouble) inSingle = !inSingle;
        else if (c == '"' && !inSingle) inDouble = !inDouble;
        // 따옴표 바깥에 위치하고, 직전에 공백이 있거나 첫 글자인 '#'만 주석으로 판정
        else if (c == '#' && !inSingle && !inDouble && (i == 0 || line[i - 1] == ' '))
            return i;
    }
    return -1;
}

4. 중첩 맵(Map)과 리스트(List) 재귀 트리 빌더 및 스칼라 자동 캐스팅

전처리된 라인들은 (int indent, string content) 튜플 리스트로 변환된 뒤, 재귀 하향 스택(Recursive-Descent Stack)을 통해 계층적 인메모리 트리 객체(Dictionary<string, object> 또는 List<object>)로 조립됩니다:

5. 양방향 트랜스파일링: YAML ➔ JSON 및 JsonElementToYaml 역직렬화

쿠버네티스와 마이크로서비스 아키텍처에서 가장 자주 쓰이는 작업은 "YAML 매니페스트를 공공 API 규격인 JSON으로 변환하거나, 반대로 외부 REST API의 JSON 응답을 쿠버네티스 ConfigMap YAML로 변환하는 작업"입니다.

ZeliYaml은 BtnYamlToJson_Click과 BtnJsonToYaml_Click을 통해 단 0초 만에 완벽한 무손실 양방향 변환을 수행합니다:

C# JsonElement 기반 역직렬화 및 YAML 코드 생성 (JsonElementToYaml)
private void JsonElementToYaml(JsonElement elem, StringBuilder sb, int indent)
{
    string ind = new string(' ', indent);
    switch (elem.ValueKind)
    {
        case JsonValueKind.Object:
            foreach (var prop in elem.EnumerateObject())
            {
                if (prop.Value.ValueKind == JsonValueKind.Object || prop.Value.ValueKind == JsonValueKind.Array)
                {
                    sb.AppendLine($"{ind}{prop.Name}:");
                    JsonElementToYaml(prop.Value, sb, indent + 2);
                }
                else
                {
                    sb.AppendLine($"{ind}{prop.Name}: {FormatJsonScalar(prop.Value)}");
                }
            }
            break;

        case JsonValueKind.Array:
            foreach (var item in elem.EnumerateArray())
            {
                if (item.ValueKind == JsonValueKind.Object || item.ValueKind == JsonValueKind.Array)
                {
                    sb.AppendLine($"{ind}-");
                    JsonElementToYaml(item, sb, indent + 2);
                }
                else
                {
                    sb.AppendLine($"{ind}- {FormatJsonScalar(item)}");
                }
            }
            break;
    }
}

6. 2스페이스 표준 정규화(Canonical Formatting)와 WindowKit Always-On-Top UX

웹상에서 복사해 온 YAML 코드는 4칸 들여쓰기, 2칸 들여쓰기, 탭 문자가 뒤섞여 시각적 피로도를 극대화합니다. ZeliYaml의 [YAML 정규화(Format)] 기능은 YAML을 파싱한 후 국제 표준인 2스페이스 들여쓰기 규칙으로 코드를 자동 재정렬합니다:

  1. 원클릭 2스페이스 인덴트 정규화 (BtnFormatYaml_Click): 지저분한 레거시 들여쓰기를 표준 2스페이스 인덴트로 완벽 정리하여 깃(Git) 커밋 시 불필요한 공백 충돌(Diff Noise)을 원천 방어.
  2. 실시간 구문 오류 라인 계측 (BtnValidateYaml_Click): 파싱 실패 시 정확한 예외 원인 메시지를 하단 상태바에 즉각 출력하여 1초 만에 디버깅.
  3. 1200×700 와이드 스플릿 뷰 & Always-On-Top 핀 고정: 좌측(YAML)과 우측(JSON)을 실시간 대조할 수 있는 와이드 글라스모피즘 레이아웃과 핀 토글을 제공하여, 터미널이나 VS Code 창 위에 상시 플로팅 핀 고정 지원.

7. 실전 기술 벤치마크: 외산 웹 검증기 vs 무거운 라이브러리 vs ZeliYaml

비교 항목 외산 웹 검증기 (json2yaml 등) 상용 무거운 도구 (YamlDotNet 기반 콘솔) ZeliDesk ZeliYaml (온디바이스)
폐쇄망(Air-Gap) 구동 불가 (인터넷 업로드 필수) 가능 (설치 환경 복잡) 100% 온디바이스 완전 구동 (외부 트래픽 0B)
서버 기밀·IP 누출 위험 매우 높음 (해외 서버로 설정 전송) 낮음 원천 차단 (로컬 샌드박스 인메모리 연산)
외부 의존성 (NuGet) 해당 없음 방대한 라이브러리 참조 필요 외부 의존성 0 (Zero-Dependency 순수 C#)
YAML ➔ JSON 변환 지원하나 복사/붙여넣기 번거로움 CLI 파이프라인 수동 구성 스플릿 뷰 1클릭 실시간 상호 트랜스파일
2스페이스 표준 정규화 단순 뷰어 수준 스크립트 작성 필요 원클릭 Canonical 2-Space 자동 포맷팅
메모리 점유율 브라우저 탭 150MB~300MB 80MB 이상 19MB 극경량 WinUI 3 네이티브

8. 결론: ZeliDesk 70편 돌파와 데이터 거버넌스 7대 라인업의 완성

오늘날 전자정부와 국방 시스템의 데이터 교환 규격은 텍스트, 오피스, 마크다운에서 시작하여 계층형 데이터 포맷으로 끊임없이 확장되었습니다.

ZeliDesk 기술 백서 제70편 돌파와 함께 완성된 **'온디바이스 7대 데이터 거버넌스 라인업'**은 외산 유료 도구와 클라우드 종속을 완전히 걷어내고, 대한민국 공교육과 국방 기술진에게 가장 견고한 독립 주권을 부여합니다:

  1. ZeliNote (#942): 마크다운 교원 연구노트와 국방 문서 보안 거버넌스.
  2. ZeliOffice (#997): 한글 2024 COM 7대 난제 및 Excel 50배 벌크 자동화.
  3. ZeliCsv (#938): 10만 행 NEIS 학생 명부와 군수 자원 장부 가상화 정제.
  4. ZeliJson (#937): 공공 API 및 군 통신 전문 제로 할당 고속 검증.
  5. ZeliPdf (#936): 출제 시험지와 작전 교범 텍스트 추출 및 메타데이터 포렌식 감사.
  6. ZeliXML (#935): 전자정부 표준프레임워크 및 국방 무기체계 ICD 온디바이스 검증.
  7. ZeliYaml (#930): 쿠버네티스 선언적 인프라와 국방 C4I 배포를 위한 순수 C# 무의존성 YAML-JSON 트랜스파일러.

70편의 기술 백서에 담긴 수만 줄의 아키텍처와 엔지니어링 집념—ZeliDesk는 대한민국의 교실과 전산실, 그리고 국방 연구 현장이 외부의 어떤 위협에도 흔들리지 않는 가장 안전한 디지털 요새가 될 때까지 진화를 멈추지 않을 것입니다.