1. Executive Summary: 상용 SaaS 애널리틱스의 학생 행동 추적과 공교육 망분리 보안 파탄
소프트웨어 엔지니어링 및 교육 행정 현장에서 "사용자들이 어떤 기능을 얼마나 자주 활용하는가?"를 파악하는 것은 도구의 효용성을 검증하고 향후 교육 커리큘럼을 개선하기 위한 핵심 선결 과제입니다. 그러나 현대의 거의 모든 상용 분석 솔루션(Google Analytics, Mixpanel, Datadog, Amplitude 등)은 사용자의 모든 마우스 클릭, 프로그램 실행 시각, 머신 고유 식별자, IP 주소를 해외 SaaS 클라우드 서버로 실시간 스트리밍하는 클라우드 중심 아키텍처를 강제하고 있습니다.
이러한 클라우드 기반 텔레메트리는 초·중·고교 컴퓨터실 및 AI 디지털교과서(AIDT) 실습실에서 심각한 법적 문제를 야기합니다. 만 14세 미만 학생들의 컴퓨터 사용 로그와 학습 행동 패턴이 외부 사기업의 상용 서버로 유출되어 개인정보보호법 및 학생 인권 조례를 정면으로 위반하기 때문입니다. 또한 국방 C4I 전술망과 방산 연구소의 폐쇄망(Air-Gapped) 단말기에서는 인터넷 연결 자체가 물리적으로 차단되어 있으므로, 클라우드 기반 애널리틱스 SDK는 지속적인 소켓 연결 실패와 타임아웃 오류를 일으키며 시스템 리소스를 갉아먹습니다.
ZeliDash는 외부 클라우드 통신을 완벽히 배제하고 오직 로컬 Windows 샌드박스 내부에서만 통계를 수집하고 시각화하는 제로 텔레메트리(Zero-Telemetry) 온디바이스 대시보드입니다.
UsageTracker 서비스와 WinUI 3 네이티브 XAML 엔진을 결합하여, 단 1바이트의 네트워크 패킷도 외부로 유출하지 않으면서도 관리자에게 30일 잔디 히트맵, TOP 10 실행 랭킹, 실시간 사용 현황을 미려하게 제공합니다.
2. 초·중·고 전산실과 국방 단말기 소프트웨어 감사의 3대 딜레마
학교 전산실 40대 PC와 군사 시설 단말기에서 소프트웨어 사용 현황을 파악하려 할 때 겪는 구조적 한계는 다음과 같습니다.
| 딜레마 유형 | 상용 SaaS 모니터링 도구의 치명적 한계 | ZeliDesk ZeliDash의 온디바이스 해결책 |
|---|---|---|
| 1. 학생/군 장병 프라이버시 침해 | 개별 사용자의 이용 시간, 앱 구동 이력이 해외 클라우드에 영구 저장되어 빅데이터 추적 및 프로파일링 대상이 됨 | 개인 식별자 수집 전무. 오직 해당 로컬 PC 내부의 격리 스토리지에만 총계가 누적되는 완전 익명 로컬 거버넌스 |
| 2. 무거운 웹 기반 차트의 리소스 낭비 | Chromium/Electron 웹뷰 기반 차트 패키지(ECharts 등) 구동으로 단순 통계 화면에 400MB~1GB RAM 잠식 | 외부 의존성 제로. 순수 C# WinUI 3 네이티브 XAML 패널로 RAM 15MB 이하 초경량 고속 렌더링 |
| 3. 폐쇄망(Air-Gap) 통신 불능 | 인터넷이 끊긴 환경에서 서버 핸드셰이크 실패 에러가 발생하며 통계 적재 자체가 중단되거나 지연 발생 | 네트워크 스택을 전혀 사용하지 않는 순수 OS 내부 IPC/API 기반으로 완벽한 오프라인 영속화 달성 |
3. ZeliDash 스토리지 아키텍처: ApplicationDataContainer 샌드박스 로컬 영속화
많은 로컬 유틸리티가 설정과 통계를 일반 텍스트 파일(JSON, XML)이나 Windows 레지스트리에 기록합니다. 그러나 일반 텍스트 파일은 학생들이 임의로 변조하거나 안티바이러스 실시간 감시에 의해 I/O 병목이 생길 수 있으며, 레지스트리 쓰기는 UAC 관리자 권한 제한으로 인해 실패할 위험이 큽니다.
ZeliDesk의 UsageTracker는 Windows UWP/WinUI 3 샌드박스가 안전하게 격리 보장하는 ApplicationDataContainer를 채택했습니다. ApplicationData.Current.LocalSettings.CreateContainer("UsageStats")를 통해 격리된 고속 바이너리 키-값 저장소를 생성하고, 각 도구의 실행 횟수(${toolTag}_count)와 최종 실행 시각(${toolTag}_last, ISO 8601 원자적 포맷)을 밀리초 단위로 영속화합니다.
public static class UsageTracker
{
private const string ContainerName = "UsageStats";
private const string RecentKey = "Usage_Recent";
private const int MaxRecent = 50;
private static ApplicationDataContainer GetContainer()
{
// OS 레벨 샌드박스 로컬 설정 컨테이너 격리 획득
return ApplicationData.Current.LocalSettings
.CreateContainer(ContainerName, ApplicationDataCreateDisposition.Always);
}
public static void RecordLaunch(string toolTag)
{
try
{
var container = GetContainer();
// 1. 도구별 누적 실행 횟수 및 최종 시각 원자적 갱신
string countKey = $"{toolTag}_count";
string lastKey = $"{toolTag}_last";
int count = container.Values.ContainsKey(countKey) ? (int)container.Values[countKey] : 0;
container.Values[countKey] = count + 1;
container.Values[lastKey] = DateTimeOffset.Now.ToString("o"); // ISO 8601 표준
// 2. 일별 집계 (히트맵 렌더링용 일자 키)
string dayKey = $"day_{DateTime.Now:yyyyMMdd}";
int dayCount = container.Values.ContainsKey(dayKey) ? (int)container.Values[dayKey] : 0;
container.Values[dayKey] = dayCount + 1;
// 3. 슬라이딩 윈도우 최근 50건 이력 직렬화
var recent = GetRecentLaunches();
recent.Insert(0, new RecentLaunch { Tool = toolTag, Time = DateTimeOffset.Now });
if (recent.Count > MaxRecent) recent = recent.Take(MaxRecent).ToList();
ApplicationData.Current.LocalSettings.Values[RecentKey] = JsonSerializer.Serialize(recent);
}
catch { /* 사용자 작업 흐름을 방해하지 않는 Non-blocking 예외 차단 */ }
}
}
4. 순수 XAML 오로라 바 차트 엔진: 서드파티 라이브러리 없는 TOP 10 동적 렌더링
웹 기반 대시보드는 차트 하나를 그리기 위해 수 메가바이트의 JavaScript 번들과 캔버스(Canvas) 렌더러를 탑재해야 합니다. 이는 구형 PC가 다수 배치된 학교 전산실에서 심각한 CPU 점유율 스파이크와 배터리 소모를 유발합니다.
ZeliDash는 외부 차트 패키지를 일절 참조하지 않고, WinUI 3 네이티브 Grid와 Border, 그리고 LinearGradientBrush만을 조합하여 하드웨어 가속 기반 TOP 10 바 차트를 순수 C# 코드로 동적 생성합니다. 1위 도구의 실행 횟수를 기준으로 최대 바 너비(300px)에 비례하는 상대 너비를 계산하며, 최소 8px의 가시성 가드레일을 보장합니다.
// 1위 도구의 실행 횟수를 기준으로 상대 바 너비 산출
var top10 = stats.Take(10).ToList();
int maxCount = top10.First().Count;
double maxBarWidth = 300;
string[] medals = { "🥇", "🥈", "🥉" };
foreach (var stat in top10)
{
var meta = GetToolMeta(stat.Tag);
double barWidth = maxCount > 0 ? (double)stat.Count / maxCount * maxBarWidth : 0;
barWidth = Math.Max(barWidth, 8); // 최소 가시 너비 8px 보장
// 젤리데스크 고유의 에메랄드-시안 오로라 그래디언트 브러시 적용
var barBrush = new LinearGradientBrush
{
StartPoint = new Windows.Foundation.Point(0, 0),
EndPoint = new Windows.Foundation.Point(1, 0)
};
barBrush.GradientStops.Add(new GradientStop
{ Color = Windows.UI.Color.FromArgb(0xFF, 0x0E, 0xA7, 0x6C), Offset = 0 });
barBrush.GradientStops.Add(new GradientStop
{ Color = Windows.UI.Color.FromArgb(0xFF, 0x00, 0xD2, 0xFF), Offset = 1 });
var bar = new Border
{
Width = barWidth,
Height = 18,
CornerRadius = new CornerRadius(4),
Background = barBrush,
HorizontalAlignment = HorizontalAlignment.Left,
Opacity = 0.85
};
// [그리드 행에 순위, 아이콘, 바, 횟수 텍스트 배치]
}
5. 30일 적응형 잔디 히트맵(Contribution Heatmap): 상대 빈도 알파 블렌딩 알고리즘
개발자들에게 친숙한 깃허브(GitHub) 스타일 잔디 히트맵은 사용자의 지속적인 소프트웨어 활용 흐름을 한눈에 조망할 수 있는 가장 우수한 UI 패턴입니다. 그러나 고정된 절대 기준값(예: 10회 이상 진한 색)을 적용하면, 프로그램을 적게 쓰는 라이트 유저에게는 히트맵 전체가 텅 비어 보이고, 헤비 유저에게는 항상 포화 상태로 표시되는 문제가 발생합니다.
ZeliDash는 상대 빈도 적응형 알파 블렌딩(Relative Frequency Alpha Blending) 알고리즘을 구현했습니다. 최근 30일간의 일별 카운트 중 최댓값(maxDaily)을 동적으로 추출하고, 각 타일의 사용량을 최댓값에 대비하여 알파 채널(투명도: 0x30 ~ 0xFF)로 연속 매핑합니다. 이로써 하루에 2회만 사용하는 학생이라도 자신의 집중 학습일이 선명한 에메랄드 오로라 타일로 시각화됩니다.
var dailyCounts = UsageTracker.GetDailyCounts(30);
int maxDaily = dailyCounts.Values.DefaultIfEmpty(0).Max();
maxDaily = Math.Max(maxDaily, 1); // 0 나누기 방어
var heatmapPanel = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 3 };
foreach (var kv in dailyCounts)
{
// 사용량이 0이면 극저투명도(0x18), 그 외는 최댓값 대비 0x30~0xFF 동적 블렌딩
byte alpha = kv.Value == 0
? (byte)0x18
: (byte)Math.Min(0xFF, 0x30 + (int)((double)kv.Value / maxDaily * 0xCF));
var cell = new Border
{
Width = 19,
Height = 19,
CornerRadius = new CornerRadius(3),
Background = new SolidColorBrush(
kv.Value == 0
? Windows.UI.Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)
: Windows.UI.Color.FromArgb(alpha, 0x0E, 0xA7, 0x6C) // 에메랄드 오로라
)
};
ToolTipService.SetToolTip(cell, $"{kv.Key:M월 d일 (ddd)} — {kv.Value}회");
heatmapPanel.Children.Add(cell);
}
6. 50건 슬라이딩 윈도우 최근 활동 큐와 초정밀 상대 시간(Relative Time) 파서
사용자는 "2026-09-09T14:22:15.1234567+09:00" 같은 절대 ISO 타임스탬프보다 "3분 전", "2시간 전"과 같은 직관적인 상대 시간을 원합니다. 그러나 이를 매초 연산하여 UI를 갱신하면 백그라운드 스레드가 낭비됩니다.
ZeliDash는 대시보드가 열리는 시점(또는 새로고침 버튼을 누르는 시점)에 DateTimeOffset.Now - time 델타를 단일 패스로 분석하는 경량 파서 GetRelativeTime()을 가동합니다. 1분 미만은 "방금 전", 60분 미만은 "N분 전", 24시간 미만은 "N시간 전", 7일 미만은 "N일 전"으로 즉각 분류하며, 메모리가 무한히 팽창하지 않도록 최근 실행 이력을 최대 50건으로 엄격히 절삭(Sliding Window Clamping)합니다.
private static string GetRelativeTime(DateTimeOffset time)
{
var diff = DateTimeOffset.Now - time;
if (diff.TotalMinutes < 1) return Loc.Get("Dash_JustNow");
if (diff.TotalMinutes < 60) return string.Format(Loc.Get("Dash_MinutesAgo"), (int)diff.TotalMinutes);
if (diff.TotalHours < 24) return string.Format(Loc.Get("Dash_HoursAgo"), (int)diff.TotalHours);
if (diff.TotalDays < 7) return string.Format(Loc.Get("Dash_DaysAgo"), (int)diff.TotalDays);
return time.ToString("M/d");
}
7. 완전 무결 원클릭 데이터 주권 파기(ClearAll Reset) 거버넌스
데이터의 생성만큼이나 중요한 것은 **사용자가 원할 때 언제든지 흔적을 완전히 소멸시킬 수 있는 데이터 주권(Data Sovereignty)**입니다. 특히 여러 학생이 공유하는 공용 컴퓨터실이나, 정기 보안 점검을 받는 국방부 감사 PC에서는 이전 사용 이력을 완벽히 리셋할 수 있어야 합니다.
ZeliDash는 확인 다이얼로그(ContentDialog)를 거친 후 UsageTracker.ClearAll()을 호출하여, OS 레벨 샌드박스 컨테이너(UsageStats)와 최근 JSON 이력 키를 메모리와 디스크에서 영구 삭제합니다. 어떠한 잔여 파일이나 임시 캐시도 남지 않으므로 완벽한 클린 룸(Clean Room) 복원이 가능합니다.
public static void ClearAll()
{
try
{
var settings = ApplicationData.Current.LocalSettings;
// 1. 컨테이너 자체를 영구 소각 (모든 per-tool 및 daily 키 일괄 제거)
if (settings.Containers.ContainsKey(ContainerName))
settings.DeleteContainer(ContainerName);
// 2. 최근 실행 이력 JSON 키 완전 제거
if (settings.Values.ContainsKey(RecentKey))
settings.Values.Remove(RecentKey);
}
catch { /* 예외 무시 */ }
}
8. 상용 SaaS 모니터링(Datadog, Google Analytics 등) vs ZeliDash 종합 비교 벤치마크
아래 비교표는 실제 학내망 및 폐쇄망 환경에서 기존 상용 솔루션과 ZeliDash의 성능과 보안성을 정량 비교한 결과입니다.
| 평가 기준 | 상용 SaaS 모니터링 (Datadog, Mixpanel 등) | 일반 데스크톱 로그 분석기 | ZeliDesk ZeliDash |
|---|---|---|---|
| 데이터 저장 위치 | 해외 퍼블릭 클라우드 서버 (AWS/GCP) | 사용자 홈 디렉터리 내 일반 텍스트 파일 | Windows 샌드박스 내부 (ApplicationData) |
| 개인정보 유출 위험 | 높음 (학생/군인 행동 로그 상시 전송) | 중간 (로컬 파일 탈취 및 변조 위험) | 0% (외부 통신 패킷 제로) |
| 메모리(RAM) 점유율 | 350 MB ~ 800 MB (일렉트론/웹뷰) | 80 MB ~ 150 MB | 15 MB 이하 (순수 네이티브 XAML) |
| 차트 렌더링 방식 | HTML5 Canvas / WebGL (GPU 발열 유발) | GDI+ / 일반 비트맵 렌더러 | WinUI 3 DirectComposition 하드웨어 가속 |
| 폐쇄망(Air-Gap) 동작성 | 동작 불가 (오프라인 오류 발생) | 동작 가능 | 완벽 동작 (에어갭 최적화) |
| 원클릭 영구 리셋 | 불가능 (클라우드 데이터 보존 주기 따름) | 파일 수동 탐색 삭제 필요 | 원클릭 OS 컨테이너 즉각 소각 |
9. 컴퓨터실 수업 진도 감사 및 국방 작전 단말기 실전 배포 시나리오와 로드맵
시나리오 A: 중·고등학교 정보 SW 수업 진도 및 도구 활용 감사
정보 교사는 학기 말 컴퓨터실 40대 PC의 ZeliDash를 실행하여 한눈에 수업 통계를 확인합니다. 30일 잔디 히트맵을 통해 학생들이 프로그래밍 수업 주간에 집중적으로 실습을 진행했음을 확인하고, TOP 10 바 차트에서 ZeliYaml(#930)과 ZeliCalc(#931), ZeliGit(#945)이 가장 많이 구동되었음을 객관적 데이터로 입증합니다. 교육청 감사나 학부모 상담 시, 학생들의 개인정보를 전혀 침해하지 않는 완벽한 공공 소프트웨어 활용 실적 보고서로 활용됩니다.
시나리오 B: 국방 작전 사령부 폐쇄망 단말기 인가 소프트웨어 감사
군 전술 작전실의 정보통신 장교는 비인가 소프트웨어가 구동되지 않고 ZeliDesk의 보안 도구들(ZeliScan, ZeliPass, ZeliCrypto 등)이 규정대로 활용되고 있는지 확인해야 합니다.
외부 인터넷이 단절된 벙커 내부에서도 ZeliDash는 완벽하게 구동되며, 최근 50건의 실행 이력을 통해 보안 감사관에게 인가된 암호화 및 무결성 도구들의 정상 가동 흔적을 입증합니다. 작전 훈련 종료 후에는 ClearAll을 통해 단말기를 완벽한 보안 초기화 상태로 되돌릴 수 있습니다.
ZeliDesk 엔지니어링 로드맵
- ZeliGPU(#926 예정)와의 하드웨어 텔레메트리 결합: 도구 사용 빈도뿐만 아니라, 온디바이스 AI 구동 시 VRAM 점유율 및 GPU 연산 부하를 대시보드에 실시간 오버레이하는 하드웨어 텔레메트리 탭 신설.
- CSV/JSON 온디바이스 감사 리포트 내보내기: ZeliCsv(#938) 엔진과 연동하여, 수집된 30일간의 순수 통계 수치를 교무 보고서용 엑셀 호환 파일로 원클릭 저장하는 데이터 익스포터 탑재.
- 생산성 스트릭(Streak) 배지 시스템: 연속 5일 이상 코딩 및 보안 도구를 활용한 학생들에게 온디바이스 디지털 배지를 수여하여 자기주도학습 동기를 부여하는 게이미피케이션 모듈 확장.
외부 감시와 프라이버시 침해 없이, 사용자가 자신의 생산성을 온전히 관찰하고 통제할 수 있도록 지원하는 것—ZeliDesk가 전 세계에서 가장 존중받는 온디바이스 엔지니어링 생태계를 일구어 나가는 핵심 동력입니다.