← 기술 백서 목록으로 돌아가기

컴퓨터실 40대 PC의 브라우저 탭과 퀵런치 0초 일괄 동기화: ZeliConfig의 선언적 XML 스키마 거버넌스 및 제로터치 워크스페이스 배포 아키텍처

"컴퓨터실 40대 PC를 관리하는 교사나 정보 담당관에게 가장 고통스러운 작업은 학기 초마다 40대의 모니터 앞을 일일이 돌아다니며 필수 수업 탭을 열고, 도구 모음을 배치하는 수작업입니다. ZeliConfig는 단 2개의 선언적 XML 파일과 LINQ to XML 메타데이터 검증 파이프라인을 통해, 중앙 마스터 이미지나 USB 배포 한 번으로 40대 전 단말기의 초기 워크스페이스를 0초 만에 완벽 동기화하는 제로터치 거버넌스를 실현합니다."

1. 컴퓨터실과 전산실의 배포 악몽: 40대 PC의 파편화된 환경 설정과 교사의 끝없는 수작업

초·중·고등학교 컴퓨터실, AI 디지털교과서(AIDT) 전용 실습실, 대학 소프트웨어 실습실, 그리고 군 전산 교육장은 수십 대에서 수백 대의 PC가 동일한 수업 목표를 위해 동시에 운용되는 집단 실습 환경입니다. 그러나 실제 현장에서는 다음과 같은 심각한 환경 파편화 문제가 반복됩니다:

비교 항목 상용 엔터프라이즈 MDM / GPO 수동 브라우저 북마크 설정 ZeliDesk ZeliConfig 선언적 아키텍처
배포 방식 도메인 서버 구축, 에이전트 설치 필수 40대 PC 개별 방문 수동 클릭 XML 파일 2개 복사 / 마스터 이미지 0초 반영
오타 및 손상 방어 정책 배포 실패 시 침묵 또는 오류 로그 관리 체계 없음 HasToolMeta 교차 검증 & 하드코딩 폴백 100% 기동
편집 용이성 전용 콘솔 및 관리자 권한 필수 개별 브라우저 GUI 메모장으로 1분 만에 태그 수정 가능한 직관적 XML
폐쇄망(Air-Gap) 호환 중앙 서버 통신 불능 시 오작동 로컬 한정 완전 오프라인 온디바이스 동작, 외부 텔레메트리 0회

2. 2대 핵심 선언적 스키마: HJHinit_BrowserTab & HJHinit_UtilList

ZeliConfig는 애플리케이션의 핵심 작업 영역을 두 가지 선언적 XML 스키마로 분리하여 관리합니다. 이 파일들은 AppContext.BaseDirectory/ZeliConfig/ 하위에 위치하여 인스톨러나 파일 복사만으로 즉시 교체할 수 있습니다.

① HJHinit_BrowserTab.xml: 상단 브라우저 탭 및 서랍(Drawer) 초기 구성

앱 최초 실행 시 브라우저 탭 바에 표시될 서비스 목록과 닫기 금지 플래그, 오로라 글로우 효과, 햄버거 메뉴(서랍) 카테고리의 초기 접힘(collapsed) 상태를 선언합니다.

XML (ZeliConfig/HJHinit_BrowserTab.xml) Declarative Browser Tab & Drawer Schema
<?xml version="1.0" encoding="utf-8"?>
<ZeliConfig>
  <BrowserTabs>
    <!-- 기본 필수 탭: closable="false"로 학생들의 임의 종료 방지, glow="true"로 오로라 효과 -->
    <Tab name="ZeliAI" url="https://zeliai.com"
         icon="Z" color="#00D2FF" glow="true" closable="false" />
  </BrowserTabs>

  <DrawerDefaults>
    <!-- 학생들의 인지 부하 감소를 위해 고급 도구는 초기에 접힌 상태로 제공 -->
    <Category name="AI 서비스"     collapsed="true" />
    <Category name="시스템 도구"    collapsed="false" />
    <Category name="개발자 도구"    collapsed="false" />
    <Category name="네트워크 도구"  collapsed="false" />
    <Category name="하드웨어 설정"  collapsed="false" />
  </DrawerDefaults>
</ZeliConfig>

② HJHinit_UtilList.xml: 상단 퀵런치 바 고정 유틸리티 우선순위

72종의 방대한 ZeliDesk 유틸리티 중 수업 현장에서 가장 자주 쓰이는 핵심 도구 8~10종을 상단 퀵런치 바에 왼쪽부터 순서대로 고정 배치합니다.

XML (ZeliConfig/HJHinit_UtilList.xml) QuickLaunch Priority Order Schema
<?xml version="1.0" encoding="utf-8"?>
<ZeliConfig>
  <QuickLaunchDefaults>
    <!-- 왼쪽에서 오른쪽 순으로 배치되는 유틸리티 식별 태그 -->
    <Util tag="zeligen" />
    <Util tag="zelioffice" />
    <Util tag="zelifolder" />
    <Util tag="zelinote" />
    <Util tag="zelifind" />
    <Util tag="zeliclip" />
    <Util tag="zeliping" />
    <Util tag="zelissh" />
    <Util tag="zelisnap" />
  </QuickLaunchDefaults>
</ZeliConfig>

3. 메타데이터 교차 검증: LINQ to XML과 HasToolMeta 무결성 안전망

현장 교사가 XML 파일을 직접 메모장으로 수정하다가 존재하지 않는 태그(예: 오타 <Util tag="zelinotee" />)를 적거나 중복 태그를 넣는 실수를 범할 수 있습니다. ZeliConfig 로더는 LINQ to XML (XDocument) 파이프라인 상에서 실시간 메타데이터 필터링을 집행합니다.

C# (MainWindow.xaml.cs) LoadDefaultPinsFromXml Integrity Pipeline
private List<string> LoadDefaultPinsFromXml()
{
    try
    {
        string xmlPath = System.IO.Path.Combine(
            AppContext.BaseDirectory, "ZeliConfig", "HJHinit_UtilList.xml");

        if (System.IO.File.Exists(xmlPath))
        {
            var doc = XDocument.Load(xmlPath);
            
            // 1. tag 추출
            // 2. null/빈문자열 제거
            // 3. HasToolMeta(t) 사전 검증으로 미지원 태그 원천 탈락
            // 4. Distinct() 중복 제거
            var tags = doc.Descendants("Util")
                .Select(el => el.Attribute("tag")?.Value)
                .Where(t => !string.IsNullOrEmpty(t) && HasToolMeta(t))
                .Distinct()
                .ToList();

            if (tags.Count > 0)
            {
                System.Diagnostics.Debug.WriteLine(
                    $"[ZeliConfig] HJHinit_UtilList.xml 로드 완료: {string.Join(", ", tags)}");
                return tags;
            }
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(
            $"[ZeliConfig] HJHinit_UtilList.xml 로드 실패 → 폴백 사용: {ex.Message}");
    }

    // 파일이 깨졌거나 삭제되었을 때의 절대 안전망: 하드코딩 기본값 0초 Fallback
    return _defaultPinsFallback.Split('|').ToList();
}

위 파이프라인의 핵심은 HasToolMeta(t)입니다. 내부 딕셔너리에 등록되지 않은 유효하지 않은 식별자는 UI 바인딩 전에 완벽히 제거되므로, UI 상에 빈 아이콘이나 깨진 버튼이 노출되는 렌더링 결함을 0%로 방지합니다.

4. 동적 UI 주입: 닫기 금지(closable=false)와 ZeliAI 오로라 글로우 렌더링

HJHinit_BrowserTab.xml을 파싱할 때 ZeliDesk는 단순히 URL을 로딩하는 것을 넘어, 수업 환경 통제를 위한 고급 UI 속성을 인스턴스화합니다:

C# (MainWindow.xaml.cs) Dynamic Tab Creation with Security & Aurora Styling
private void LoadBrowserTabsFromXml()
{
    try
    {
        string xmlPath = System.IO.Path.Combine(
            AppContext.BaseDirectory, "ZeliConfig", "HJHinit_BrowserTab.xml");

        if (!System.IO.File.Exists(xmlPath)) return;

        var doc = XDocument.Load(xmlPath);
        var tabs = doc.Descendants("Tab").ToList();
        if (tabs.Count == 0) return;

        foreach (var tabEl in tabs)
        {
            string name = tabEl.Attribute("name")?.Value;
            string url = tabEl.Attribute("url")?.Value;
            string icon = tabEl.Attribute("icon")?.Value ?? "🌐";
            string color = tabEl.Attribute("color")?.Value ?? "#808080";
            bool isGlow = tabEl.Attribute("glow")?.Value == "true";
            bool isClosable = tabEl.Attribute("closable")?.Value != "false";

            if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(url)) continue;

            // closable=false ➔ TabViewItem.IsClosable = false 바인딩 (수업 탭 보호)
            // glow=true ➔ Aurora Gradient Brush 배경 합성
            var tabItem = CreateBrowserTab(name, url, icon, color, isGlow, isClosable);
            TabViewControl.TabItems.Add(tabItem);
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine($"[ZeliConfig] 탭 로드 실패: {ex.Message}");
    }
}

closable="false" 속성이 지정된 탭은 TabViewItem 헤더의 우측 [X] 닫기 버튼 자체가 생성되지 않습니다. 이를 통해 학생들이 수업 도중 실수로 실습용 AI 탭을 닫아버려 수업 진도를 놓치는 사고를 하드웨어/OS 수준에서 원천 차단합니다.

5. 2단계 계층형 영속성 (Two-Tier State Hierarchy): 초기 템플릿과 로컬 커스텀의 조화

선언적 설정이 너무 강력하여 사용자가 직접 바꾼 설정을 매번 덮어써 버린다면 개인화의 이점이 사라집니다. ZeliDesk는 선언적 템플릿(XML) ➔ 런타임 로컬 영속화(LocalSettings)의 정교한 2단계 계층 구조를 채택했습니다:

Architecture Concept Two-Tier Configuration Life-Cycle
[최초 설치 / 초기화 실행]
       │
       ▼
ZeliConfig/*.xml 로드 ──▶ HasToolMeta 무결성 검증 ──▶ 초기 UI 렌더링
       │
       ▼
사용자 커스텀 (드래그앤드롭 퀵런치 순서 변경, 새 탭 추가)
       │
       ▼
ApplicationData.Current.LocalSettings에 원자적 저장
       │
       ▼
[이후 일상 기동] ──▶ LocalSettings 우선 로드 (개인화 유지)
[초기화 버튼 클릭] ──▶ LocalSettings 클리어 ➔ XML 템플릿으로 0초 복구

이 아키텍처 덕분에 평소에는 사용자가 편의에 맞게 퀵런치 아이콘을 재배치하며 자유롭게 사용하다가도, 새 학기가 시작되거나 컴퓨터실 실습 환경을 원래 상태로 되돌리고 싶을 때는 '설정 초기화' 클릭 한 번으로 XML 원본 상태로 즉각 롤백(Rollback)할 수 있습니다.

6. 공교육 AIDT & 국방 전산실 B2B/B2G 도입 효과 및 향후 로드맵

ZeliConfig의 제로터치 선언적 아키텍처는 공공 교육망 및 국방 전산 환경에서 막대한 운영 효율성을 입증하고 있습니다:

  1. ZeliDesk.Server와의 정책 동기화 확장: 로컬 XML뿐만 아니라 학내 로컬 캐시 서버(`ZeliDesk.Server`)에서 최신 정책 XML을 서명 검증 후 자동 다운로드하는 옵션 제공.
  2. 교과목별 템플릿 프로파일러 탑재: '정보 과목 실습 모드', '인공지능 실습 모드', '교무행정 모드' 등 교과별 맞춤형 XML 프리셋 원클릭 전환 파이프라인 구축.
  3. JSON-Schema 및 XSD 실시간 유효성 감사기 연동: ZeliYaml(#930) 및 ZeliJson(#937) 엔진과 연계하여 설정 파일 변경 시 문법 오류를 사전에 하이라이트하는 GUI 에디터 제공 예정.

단순한 환경 설정을 넘어, 대규모 디지털 교육 현장의 수업 준비 시간을 제로(0)로 수렴시키는 선언적 워크스페이스 오케스트레이션—ZeliDesk가 온디바이스 유틸리티 공학으로 실현하는 공교육 관리의 표준입니다.

← 이전 기술 백서 #917 공교육 멀티미디어 교안 시연과 영상 싱크 0초 동기화: ZeliPlay의 온디바이스 하드웨어 가속 미디어 파이프라인 및 수업 전용 창 오케스트레이션 아키텍처 다음 기술 백서 → #915 컴퓨터실 40대 PC의 자원 고갈과 병목 0초 진단: ZeliStat의 Win32 커널 성능 카운터 및 EMA 동적 피크 텔레메트리 아키텍처
⚡ ZeliDesk ZeliConfig 워크스페이스 거버넌스 체험하기

단 2개의 선언적 XML 파일로 브라우저 탭과 퀵런치 바를 손쉽게 커스터마이징하세요. 40대 PC 배포가 0초 만에 완료되는 제로터치 오케스트레이션을 직접 확인할 수 있습니다.

ZeliDesk Suite 무료 다운로드