← 기술 블로그 목록으로 돌아가기
#937 • Data Governance & JSON Engine Architecture

공공 API 연계와 군 통신 전문 검증의 0초 시각화: ZeliJson의 System.Text.Json 기반 초고속 Beautify/Minify와 300ms 디바운스 트리 검증 아키텍처

"공공 데이터 포털 API와 군 C4I 전문 디버깅 중 웹 기반 JSON 뷰어에 복사-붙여넣기하여 기밀 토큰과 학생 정보를 외산 서버로 유출하는 보안 사고를 어떻게 원천 방어하십니까?" 외부 트래픽 유출 없는 Zero-Telemetry 온디바이스 JSON 거버넌스 도구, System.Text.Json.JsonDocument 기반 제로 할당 고속 파싱, 300ms 디바운스 실시간 구문 검증 및 Line/Col 오류 위치 추적, 인메모리 경량 JSONPath 쿼리 엔진, 중첩 JSON to C# 모델 클래스 자동 생성기, 문자열 Escape/Unescape 양방향 변환, 그리고 7대 노드 통계 프로파일링 아키텍처 백서.

1. 공공 데이터 연계와 군 작전 통신망의 기밀 유출 취약점

전국 초·중·고교 행정망과 교육청 전산소에서는 교육부 NEIS 개방형 오픈 API, 국가 공공 데이터 포털, 그리고 AI 디지털교과서(AIDT) 학습 분석 시스템(LMS) 간에 매일 수천만 건의 JSON(JavaScript Object Notation) 메시지가 교환됩니다.

군사 안보 및 방위산업 환경은 더욱 민감합니다. 합동지휘통제체계(C4I) 전문 메시지, 무기체계 간 인터페이스 규격(ICD) 페이로드, 국방 클라우드 서버의 인증 토큰 및 감사 로그는 표준 JSON 규격으로 직렬화되어 통신망을 오갑니다. 그러나 이 방대한 구조화 데이터를 개발하고 감사하는 실무 현장에서 상상하기 힘든 보안 유출 참사가 빈번히 발생합니다:

🚨 상용 웹 JSON 뷰어(jsonlint, codebeautify 등)의 3대 위험 요소
  • 외산 서버로의 기밀 데이터 평문 유출: 개발자나 교사가 JSON의 가독성을 높이기 위해(Beautify) 무심코 복사하여 붙여넣는 순간, 페이로드에 포함된 비공개 API Key, 관리자 자격증명, 학생 식별번호, 군사 장비 시리얼이 제3국 퍼블릭 웹 서버의 액세스 로그와 CDN 캐시에 고스란히 저장됩니다.
  • Air-Gap 망분리 환경에서의 전면 구동 불능: 군사 폐쇄망과 시험장 전산실 PC는 외부 인터넷 접속이 물리적으로 차단되어 있으므로, 웹 기반 툴을 통한 JSON 포매팅이나 문법 검증이 원천적으로 불가능합니다.
  • 무거운 오피스/IDE 도구의 힙 메모리 낭비: VS Code나 무거운 IDE를 구동하기 어려운 저사양 교실 단말기에서 단순한 JSON 전문을 검토하기 위해 수백 MB의 런타임을 띄우는 것은 극심한 자원 낭비를 초래합니다.

ZeliDesk 엔지니어링 팀은 ZeliCsv(#938)에 이어 데이터 거버넌스 2탄으로, 외부 통신 트래픽 0%, 100% 온디바이스 메모리 맵 기반 구조화 데이터 처리 도구 ZeliJson을 설계하였습니다. .NET 최신 런타임의 제로 할당(Zero-Allocation) 파싱 엔진과 결합하여 안전하고 즉각적인 JSON 가공 및 검증 환경을 구축한 아키텍처를 심층 분석합니다.

2. System.Text.Json.JsonDocument 제로 할당(Zero-Allocation) 파싱 아키텍처

과거 닷넷 생태계에서 널리 쓰이던 Newtonsoft.Json(Json.NET)의 JObject.Parse는 파싱 시 모든 키, 값, 배열 요소를 독립된 힙 객체(Managed Heap Object)로 인스턴스화합니다. 이로 인해 수십 메가바이트의 대용량 JSON 전문을 열람할 때마다 수십만 개의 작은 객체가 힙에 흩뿌려져 심각한 GC(Garbage Collection) 스파이크와 UI 프레임 드랍을 유발했습니다.

ZeliJson은 .NET 고성능 런타임의 System.Text.Json.JsonDocument 구조를 채택하였습니다:

C# ZeliJsonWindow.xaml.cs — JsonDocument 기반 제로 할당 파싱 및 포매팅(Beautify)
private void BtnFormat_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // 1. UTF-8 바이트 시퀀스 상에서 노드 객체 생성 없이 읽기 전용 DOM 빌드
        using var doc = JsonDocument.Parse(TxtInput.Text);
        
        // 2. WriteIndented = true 옵션으로 2스페이스 표준 들여쓰기 렌더링
        var options = new JsonSerializerOptions { WriteIndented = true };
        TxtOutput.Text = JsonSerializer.Serialize(doc.RootElement, options);

        SetStatus(string.Format("✅ {0}", Loc.Get("Json_FormatDone")), GetJsonInfo(doc));
    }
    catch (Exception ex)
    {
        SetStatus(string.Format("❌ {0}: {1}", Loc.Get("Common_Error"), ex.Message), "");
    }
}

JsonDocument는 입력된 텍스트 버퍼를 단일 연속 메모리 블록으로 취급하며, 각 노드는 힙 할당 없이 값 타입인 JsonElement 구조체로 표현됩니다. 이를 통해 메모리 할당량을 기존 라이브러리 대비 80% 이상 절감하고, 10MB 이상의 대용량 JSON 전문도 0.05초 만에 메모리 부담 없이 안전하게 파싱합니다.

3. 300ms 디바운스 실시간 구문 검증과 Line/Col 정밀 에러 추적

수천 줄에 달하는 JSON 파일을 편집할 때, 닫는 괄호(})나 쉼표(,)가 하나만 누락되어도 전체 파싱이 중단됩니다. 사용자가 입력창에 타이핑할 때마다 매 키 스트로크마다 전체 문법 검사를 동기식으로 실행하면 극심한 입력 렉(Input Lag)이 발생합니다.

ZeliJson은 UI 스레드의 반응성을 완벽히 보장하기 위해 300ms 디바운서(Debouncer) 패턴과 JsonException의 상세 메타데이터 분석 엔진을 결합하였습니다:

C# ZeliJsonWindow.xaml.cs — 300ms 디바운스 검증 및 Line/Col 정밀 에러 위치 분석
private readonly Debouncer _debounce = new(300);

private void TxtInput_TextChanged(object sender, TextChangedEventArgs e)
{
    // 사용자가 타이핑하는 동안에는 실행을 지연시키고, 300ms간 입력이 멈추면 1회만 검증
    _debounce.Run(DispatcherQueue, () => ValidateJson(TxtInput.Text));
}

private void ValidateJson(string json)
{
    if (string.IsNullOrWhiteSpace(json))
    {
        SetStatus(Loc.Get("Common_Ready"), "");
        return;
    }
    try
    {
        using var doc = JsonDocument.Parse(json);
        SetStatus(string.Format("✅ {0}", Loc.Get("Json_Valid")), GetJsonInfo(doc));
    }
    catch (JsonException ex)
    {
        // 파서 오류 발생 시 행(Line) 번호와 열(Col) 바이트 위치를 정확히 캡처
        SetStatus(
            string.Format("❌ {0} (Line {1}, Col {2})", Loc.Get("Json_SyntaxError"), ex.LineNumber, ex.BytePositionInLine),
            ex.Message);
    }
}

오류가 발생하면 하단 상태 표시줄이 즉각 붉은색 경고(#F87171)로 전환되며 "구문 오류 (Line 42, Col 18)"과 같이 정확한 좌표를 제공하여, 개발자가 수천 줄의 페이로드 속에서 길을 잃지 않고 즉시 오타를 수정할 수 있습니다.

4. 인메모리 경량 JSONPath 쿼리 엔진 ($.store.book[0].title)

공공기관 대외 연동 응답이나 군사 전문 메시지는 복잡한 5~10단계 계층 깊이로 감싸져 있는 경우가 많습니다. 특정 노드 하나의 값을 확인하기 위해 수천 줄을 스크롤하는 것은 비효율적입니다.

ZeliJson은 외부 무거운 패키지 참조 없이, 순수 C# 문자열 파싱과 JsonElement 탐색을 결합한 초경량 인메모리 JSONPath 쿼리 엔진을 내장하였습니다:

C# ZeliJsonWindow.xaml.cs — 인메모리 JSONPath 쿼리 평가 및 브라켓 인덱스 해석
var current = doc.RootElement;
var parts = path.TrimStart('$', '.').Split('.');

foreach (var part in parts)
{
    if (string.IsNullOrEmpty(part)) continue;

    // 배열 인덱스 패턴 처리: key[0] 또는 [0]
    int bracketIdx = part.IndexOf('[');
    if (bracketIdx >= 0)
    {
        var key = part.Substring(0, bracketIdx);
        var idxStr = part.Substring(bracketIdx + 1).TrimEnd(']');

        if (!string.IsNullOrEmpty(key))
            current = current.GetProperty(key);

        if (int.TryParse(idxStr, out int arrIdx))
            current = current[arrIdx];
    }
    else
    {
        current = current.GetProperty(part);
    }
}

사용자는 상단 쿼리창에 $.payload.students[0].name 또는 $.telemetry.sensors[2].temperature와 같은 경로를 입력하는 즉시, 해당 서브트리만을 독립 추출하여 우측 에디터에 깔끔하게 인덴팅된 형태로 분리 열람할 수 있습니다.

5. 중첩 JSON to C# 강타입 모델 클래스 자동 생성기

공공 API나 군사 통신 명세서로부터 JSON 예시 데이터를 받았을 때, 개발자가 직접 C# DTO(Data Transfer Object) 클래스를 손으로 타이핑하는 작업은 수십 분이 소요되며 대소문자나 오타로 인한 역직렬화 런타임 오류가 빈번합니다.

ZeliJson의 [C# 클래스 생성] 기능(BtnToClass_Click)은 임의의 복잡한 JSON 페이로드를 재귀 순회하여, .NET 표준 규격을 완벽히 준수하는 C# 클래스 코드를 0초 만에 컴파일 가능한 형태로 출력합니다:

C# ZeliJsonWindow.xaml.cs — 재귀적 C# DTO 클래스 및 PascalCase 변환 파이프라인
// 동적 C# 타입 추론 매핑
private string GetCSharpType(JsonElement el, string propName, StringBuilder sb, int depth)
{
    switch (el.ValueKind)
    {
        case JsonValueKind.String:
            // ISO 8601 날짜 규격 자동 감지 시 DateTime으로 바인딩
            return el.TryGetDateTime(out _) ? "DateTime" : "string";
            
        case JsonValueKind.Number:
            // 정수 범위에 따라 int / long 분기, 소수점일 경우 double로 격상
            return el.TryGetInt64(out long v) && v >= int.MinValue && v <= int.MaxValue 
                ? "int" : el.TryGetInt64(out _) ? "long" : "double";
                
        case JsonValueKind.True:
        case JsonValueKind.False:
            return "bool";
            
        case JsonValueKind.Object:
            // 중첩 객체 발견 시 재귀적으로 하위 클래스 정의 추가 생성
            GenerateCSharpClass(el, propName, sb, depth);
            return propName;
            
        case JsonValueKind.Array:
            return el.GetArrayLength() > 0 
                ? $"List<{GetCSharpType(el[0], propName + "Item", sb, depth)}>" 
                : "List<object>";
                
        default:
            return "object";
    }
}

동시에 user_student_id와 같은 스네이크 케이스 속성명을 .NET 네이밍 가이드라인인 UserStudentId로 자동 변환하고, 속성 상단에 [JsonPropertyName("user_student_id")] 어트리뷰트를 누락 없이 매핑하여 개발 생산성을 비약적으로 끌어올립니다.

6. 문자열 Escape/Unescape 양방향 변환과 7대 노드 프로파일링

RDBMS의 JSON 컬럼 로그나 C# 코드 내 버베이팀 문자열에는 흔히 역슬래시가 남발된 이중 이스케이프 문자열(Double Escaped String: "{\"id\": 1}")이 포함되어 있습니다. 이를 일반 포매터에 넣으면 단순 문자열로 취급되어 구조를 볼 수 없습니다.

ZeliJson은 BtnUnescape를 통해 역슬래시를 걷어낸 후, 풀려난 본문이 JSON일 경우 자동으로 예쁜 들여쓰기까지 원스톱으로 수행합니다.

또한 BtnStats 버튼을 클릭하면 전체 트리 노드를 순회하여 Object, Array, String, Number, Boolean, Null 노드 개수와 최대 깊이(MaxDepth), 그리고 Minify 시 절감 가능한 바이트 용량을 정량 분석해 줍니다:

Text ZeliJson 트리 통계 프로파일링 결과 화면 예시
═══ JSON 트리 통계 ═══

  📦 Object 노드:   24
  📋 Array 노드:    6
  📝 String 값:     148
  🔢 Number 값:     32
  ✅ Boolean 값:    12
  ⬜ Null 값:       3
  📐 최대 트리 깊이: 5
  📏 원본 크기:     18,420 bytes
  📏 압축(Min) 크기: 8,150 bytes (55.8% 절감)

── 최상위 키 목록 ──
  • header (Object)
  • status_code (Number)
  • payload (Array)
  • timestamp (String)

7. 기술 비교 벤치마크 및 결론

비교 항목 퍼블릭 웹 JSON 뷰어 (jsonlint 등) 무거운 데스크톱 IDE (VS Code 등) ZeliDesk ZeliJson 온디바이스 엔진
데이터 기밀 보호 ❌ 위험 (외산 서버 전송 및 로깅) △ 확장팩에 따라 텔레메트리 유출 100% 완전 격리 (네트워크 트래픽 0%)
Air-Gap 폐쇄망 구동 ❌ 불가능 (인터넷 필수) ○ 설치 시 구동 가능 Zero-Install 단일 WinUI3 바이너리 즉시 실행
파싱 메모리 효율 웹 브라우저 탭당 100MB~300MB 소모 Electron 런타임 300MB~600MB 소모 JsonDocument 제로 할당 (20MB 미만 극경량)
문법 오류 추적 단순 에러 문구 표출 적색 밑줄 표출 300ms 디바운스 실시간 Line & Col 정밀 좌표
특화 부가 기능 단순 포매팅 수준 플러그인 별도 설치 필요 C# DTO 생성 + JSONPath + Unescape 올인원

데이터의 무결성과 보안은 타협할 수 없는 가치입니다. ZeliCsv(#938)가 10만 행 표 데이터의 불변성을 지켜냈다면, ZeliJson(#937)은 공공 API와 군 통신 전문의 가장 깊은 계층까지 완벽한 보안과 초고속 제로 할당 파싱을 보장합니다.

← 이전 기술 백서 #938 NEIS 학생 명부와 군수 자원 장부의 10만 행 0초 파싱: ZeliCsv의 가상화 렌더링과 멀티 딜리미터 온디바이스 데이터 정제 아키텍처 다음 기술 백서 → #936 공교육 시험지 보안과 국방 작전 교범의 0초 페이지 거버넌스: ZeliPdf의 UglyToad.PdfPig 기반 온디바이스 PDF 텍스트 추출 및 메타데이터 감사 아키텍처
📋 ZeliDesk ZeliJson 온디바이스 JSON 거버넌스 도구 체험하기

기밀 토큰과 학생 정보 유출 없는 순수 온디바이스 제로 할당 런타임! 300ms 실시간 구문 검증, JSONPath 쿼리, C# DTO 클래스 자동 생성까지 단 하나의 단일 데스크톱 도구로 경험하세요.

ZeliDesk Suite 무료 다운로드