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

72종 시스템 유틸리티와 AI 서비스를 아우르는 단일 진실 공급원(SSOT): LauncherItemRegistry의 선언적 메타데이터 카탈로그 및 4대 런처 타입(Web·NativeApp·SystemCmd·InternalApp) 디스패치 아키텍처

"수십에서 수백 종의 기능을 제공하는 거대 통합 데스크톱 애플리케이션을 개발할 때 가장 흔히 저지르는 구조적 실수는, 각 화면의 XAML 버튼 클릭 이벤트마다 실행 경로와 타겟 문자열을 직접 하드코딩하는 것입니다. 새 기능이 추가되거나 카테고리가 변경될 때마다 사이드 서랍, 퀵런치 바, 단축키 매퍼, 검색 인덱스 코드를 전수 수정해야 하며, 이는 심각한 유지보수 부채와 UI 불일치 버그를 유발합니다. ZeliDesk는 100여 개에 달하는 AI 서비스와 72종 시스템 유틸리티, Windows 네이티브 설정을 단 하나의 선언적 메타데이터 카탈로그인 LauncherItemRegistry로 완벽히 일원화했습니다. 4대 디스패치 타입(Web·NativeApp·SystemCmd·InternalApp) 추상화와 플러그인 런타임 동적 합류(Merge)를 지원하는 단일 진실 공급원(SSOT) 아키텍처를 공개합니다."

1. 거대 데스크톱 플랫폼의 도전 과제: UI와 도구 인벤토리의 분리

ZeliDesk는 단순한 단일 목적 프로그램이 아닌, 초·중·고 교육 현장과 군 전산실, 공공기관을 위한 올인원 올-인-원 온디바이스 데스크톱 워크스페이스입니다. 현재 솔루션에는 다음과 같이 광범위하고 이질적인 성격의 도구들이 탑재되어 있습니다:

이 총합 100여 종에 달하는 실행 대상을 사이드 네비게이션 드로어(Drawer), 하단 퀵런치 바(QuickLaunchBar), 인터랙티브 유틸리티 가이드(UtilityGuide), 시스템 트레이 메뉴 등 다양한 뷰 계층에서 일관되게 표현하고 0ms 지연 없이 디스패치해야 합니다. ZeliDesk는 이를 위해 선언적 도메인 모델과 단일 진실 공급원(SSOT) 패턴을 구축했습니다.

2. 4대 런처 타입 추상화: LauncherItem 및 LauncherItemType

서로 다른 기술 스택(웹 URL, 로컬 EXE 바이너리, Windows 프로토콜 URI, WinUI 3 내부 윈도우 인스턴스)으로 구동되는 이질적인 대상들을 단일한 데이터 계약(Contract)으로 표준화하기 위해 LauncherItem 모델을 정립했습니다:

ZeliDesk/Models/LauncherItem.cs C#
namespace ZeliDesk.Models
{
    public enum LauncherItemType
    {
        Web,        // WebView2 메인 브라우저 탭 또는 팝업으로 네비게이션
        NativeApp,  // Windows ShellExecute를 통한 외부 바이너리 실행
        SystemCmd,  // ms-settings: 등 윈도우 네이티브 프로토콜 디스패치
        InternalApp // ZeliDesk WinUI 3 WindowKit 내부 격리 인스턴스 활성화
    }

    public class LauncherItem
    {
        public string Name { get; set; }      // 표시 명칭 (예: "🧠 sLMdown", "⚙️ 시스템 설정")
        public string Target { get; set; }    // URL 또는 내부 앱 식별자/실행파일/URI
        public string Icon { get; set; }      // 카탈로그 및 퀵런치 표출용 유니코드 이모지
        public LauncherItemType Type { get; set; } // 4대 런처 실행 엔진 분기 플래그
        public string Category { get; set; }  // 드로어 아코디언 그룹 분류 ("시스템 도구", "네트워크 도구" 등)
        public string Args { get; set; }      // NativeApp 실행 시 전달할 커맨드라인 파라미터 (선택)
    }
}

이 추상화를 통해 프론트엔드 UI 컴포넌트(서랍 리스트뷰, 버튼)는 클릭된 아이템이 내부 창인지, 웹 브라우저 탭인지, 윈도우 셸 프로세스인지 전혀 알 필요 없이 오직 LauncherItem 객체만을 디스패처에 전달하는 완벽한 관심사의 분리(Separation of Concerns)를 이뤄냈습니다.

3. LauncherItemRegistry: 단일 진실 공급원(SSOT) 카탈로그

LauncherItemRegistry는 외부 DB나 무거운 JSON/XML 파일을 파싱하지 않고, C# 정적 클래스와 제네릭 List<LauncherItem> 컬렉션으로 구성되어 앱 시작 시 단 0.05ms 만에 100여 개 항목의 메모리 카탈로그를 빌드합니다:

ZeliDesk/Services/LauncherItemRegistry.cs (구조 발췌) C#
public static class LauncherItemRegistry
{
    public static List<LauncherItem> GetAllItems()
    {
        return new List<LauncherItem>
        {
            // ── AI 서비스 (Web 타입) ──
            new() { Category = "AI 서비스", Name = "🏠 ZeliAI",     Target = "https://zeliai.com",             Type = LauncherItemType.Web, Icon = "🏠" },
            new() { Category = "AI 서비스", Name = "Claude",        Target = "https://claude.ai",              Type = LauncherItemType.Web, Icon = "🤖" },

            // ── 온디바이스 시스템 도구 (InternalApp 타입) ──
            new() { Category = "시스템 도구", Name = "🧠 sLMdown",      Target = "slmdown",          Type = LauncherItemType.InternalApp },
            new() { Category = "시스템 도구", Name = "📋 ZeliClip",     Target = "zeliclip",         Type = LauncherItemType.InternalApp },
            new() { Category = "시스템 도구", Name = "👁️ ZeliOCR",      Target = "zeliocr",          Type = LauncherItemType.InternalApp },

            // ── Windows 시스템 네이티브 앱 (NativeApp 타입) ──
            new() { Category = "시스템 도구", Name = "🎨 그림판",       Target = "mspaint.exe",      Type = LauncherItemType.NativeApp },
            new() { Category = "시스템 도구", Name = "📊 작업 관리자",   Target = "taskmgr.exe",      Type = LauncherItemType.NativeApp },

            // ── 하드웨어 / 시스템 설정 (SystemCmd 타입) ──
            new() { Category = "하드웨어 설정", Name = "⚙️ 시스템 설정",    Target = "ms-settings:",                   Type = LauncherItemType.SystemCmd },
            new() { Category = "하드웨어 설정", Name = "🖥️ 디스플레이",     Target = "ms-settings:display",            Type = LauncherItemType.SystemCmd }
        };
    }
}

선언적 C# 컬렉션을 채택함으로써 얻는 이점은 압도적입니다:

  1. 컴파일 타임 정적 타입 검증: 문자열 오타나 속성 누락을 컴파일러가 즉각 적발하여 런타임 NullReferenceException을 사전 차단합니다.
  2. I/O 디스크 지연 제로 (0ms): 설정 파일을 파일 시스템에서 비동기로 읽고 직렬화/역직렬화하는 오버헤드가 전혀 없습니다.
  3. 단일 편집 지점 (Single Point of Modification): 신규 도구를 추가할 때 이 레지스트리 목록에 new() { ... } 단 1줄만 추가하면 서랍, 퀵런치, 검색기가 동시에 활성화됩니다.

4. 플러그인 런타임과의 동적 하이브리드 결합

고정된 정적 레지스트리만을 사용한다면 사용자가 추후 설치하는 동적 플러그인(DLL)을 수용할 수 없습니다. ZeliDesk의 MainWindow.xaml.cs는 LauncherItemRegistry의 정적 카탈로그를 로드한 직후, PluginLoader가 발견한 동적 플러그인들을 동일한 규격으로 인메모리 합성(Merge)합니다:

MainWindow.xaml.cs (정적 레지스트리 + 동적 플러그인 결합) C#
// 1. 단일 진실 공급원(SSOT)에서 기본 도구 100여 종 일괄 적재
_allItems = LauncherItemRegistry.GetAllItems();

// 2. AssemblyLoadContext로 격리 적재된 외부 플러그인을 메인 카탈로그에 동적 합류
foreach (var pkv in ZeliDesk.Services.PluginLoader.Plugins)
{
    _allItems.Add(new ZeliDesk.Core.Models.LauncherItem
    {
        Category = ZeliDesk.Services.Loc.Get("Category_Plugin"), // 다국어 카테고리 지원
        Name = $"{pkv.Value.Icon} {pkv.Value.ShortName}",
        Target = pkv.Key,
        Type = ZeliDesk.Core.Models.LauncherItemType.InternalApp,
        Icon = pkv.Value.Icon
    });
}

// 3. 합성된 완성형 카탈로그로 사이드 서랍 및 퀵런치 바 렌더링
BuildDrawer();
BuildQuickLaunchBar();

이 하이브리드 결합 파이프라인 덕분에 코어 엔진의 기본 유틸리티와 타사/사용자 제작 플러그인이 완벽하게 동등한 일급 시민(First-Class Citizen)으로 취급되며 동일한 사용자 경험을 제공합니다.

5. 4대 디스패치 파이프라인과 0ms 라우팅 아키텍처

사용자가 UI에서 아이템을 클릭하면, LauncherItemType에 따라 전용 샌드박스 엔진으로 즉각 라우팅됩니다:

graph TD
    UserClick[사용자 아이템 클릭 이벤트] --> Dispatcher{LauncherItemType 판별}
    
    Dispatcher -->|Type == Web| WebView2[CoreWebView2.Navigate]
    Dispatcher -->|Type == InternalApp| WindowKit[WindowKit.ActivateOrSpawn]
    Dispatcher -->|Type == NativeApp| ShellExec[NativeLauncher.Launch]
    Dispatcher -->|Type == SystemCmd| WindowsURI[Windows.System.Launcher]
    
    WebView2 --> Screen1[0ms 브라우저 탭 활성화]
    WindowKit --> Screen2[0ms WinUI 3 격리 창 표출]
    ShellExec --> Screen3[Windows 셸 프로세스 디스패치]
    WindowsURI --> Screen4[ms-settings 네이티브 오케스트레이션]
                
타입 (Type) 디스패치 처리기 동작 메커니즘 및 샌드박싱
Web NavigateTo(target) WebView2 컨트롤의 신규 탭을 생성하거나 기존 활성 탭을 해당 웹 URL로 0ms 전환
InternalApp LaunchInternalApp(target) WindowKit 단일 인스턴스 캐시를 조회하여 창이 이미 열려 있으면 전면 활성화(Activate), 없으면 신규 인스턴스화
NativeApp NativeLauncher.Launch(target, args) Win32 ShellExecute API를 불리언 예외 샌드박스로 감싸 프로세스 크래시 없이 시스템 EXE 실행
SystemCmd Launcher.LaunchUriAsync(new Uri(target)) Windows Runtime URI 프로토콜 스키마를 통해 운영체제 네이티브 설정 화면으로 다이렉트 점프

6. 공교육 및 국방 전산망 관점의 엔터프라이즈 거버넌스 가치

전산실 PC 40대를 동시에 관리해야 하는 초·중·고 정보 교사나 군부대 전산 보안 담당관에게 소프트웨어 기능의 '예측 가능성'과 '중앙 통제성'은 생명과도 같습니다:

7. 결론: 가장 단순한 메타데이터가 가장 강력한 플랫폼을 만든다

소프트웨어 아키텍처에서 가장 우아한 해법은 종종 가장 직관적인 구조에서 나옵니다. ZeliDesk는 복잡한 동적 프록시나 외부 설정 파일 파서에 의존하지 않고, '선언적 C# 컬렉션'과 '4대 런처 타입 열거형'이라는 본질에 집중했습니다.

그 결과 100여 종의 방대한 도구군을 단 133줄의 C# 코드로 완벽히 장악했으며, 0.05ms의 찰나에 사이드 서랍과 퀵런치 바를 완성하고 사용자의 클릭에 0ms로 응답하는 초고속 데스크톱 플랫폼을 구축할 수 있었습니다. UI와 데이터의 완벽한 분리를 실현한 LauncherItemRegistry는 ZeliDesk의 모든 도구를 하나로 꿰어내는 가장 견고한 디지털 신경망입니다.

← 이전 기술 백서 #892 800GB 대용량 온디바이스 AI 모델 허브의 클라이언트 엔드포인트 거버넌스: ZeliDesk ModelHubConfig의 단일 진실 공급원(SSOT) 라우팅 및 폐쇄망 온프레미스 전환 아키텍처 다음 기술 백서 → #890 WinUI 3 스플래시 화면의 하드웨어 가속 비디오 엔진과 블랙 프레임(Black Frame) 0초 차단: ZeliDesk SplashWindow의 페이크 로딩 트릭(Fake Loading Trick) 및 무작위 비디오 디스패치 아키텍처
⚡ ZeliDesk 72종 올인원 데스크톱 슈트 체험하기

단일 진실 공급원(SSOT) 아키텍처 기반의 72종 유틸리티와 온디바이스 AI를 지금 경험하세요.

ZeliDesk Suite 무료 다운로드