1. 학교 컴퓨터실과 국방 서버의 디스크 장애 현실: "어느 날 갑자기 찾아오는 0바이트 고갈과 시스템 다운"
전산 교육장과 공공 폐쇄망 환경에서 스토리지는 가장 취약한 인프라 구성 요소 중 하나입니다:
- C 드라이브 여유 공간 고갈로 인한 부팅 불가: 윈도우 업데이트 임시 파일, 브라우저 캐시, 학생들의 실습 데이터가 누적되어 여유 공간이 500MB 미만으로 떨어지면 가상 메모리(페이징 파일) 생성이 실패하여 OS가 정지합니다.
- 파티션 불균형 사용: 고속 256GB SSD(C:)는 가득 차 있는데, 보조 저장용 1TB HDD(D:)는 90% 이상 비어 있는 상황이 비일비재하지만 사용자가 이를 직관적으로 인지하지 못합니다.
- 물리적 I/O 지연 및 프로그램 동결: 컴퓨터실에 연결된 노후 USB 메모리나 분리된 외장 하드가 시스템 I/O 버스를 붙잡고 있어 일반 유틸리티가 응답 없음(Hang)에 빠집니다.
2. 윈도우 기본 디스크 관리 도구(diskmgmt.msc)의 한계: "느린 로딩, 복잡한 UI, 관리자 권한 필수 장벽"
윈도우에 내장된 '디스크 관리' 도구(diskmgmt.msc)는 엔드유저나 바쁜 교사가 일상적인 용량 점검용으로 사용하기에 너무 무겁고 불편합니다:
- 가상 디스크 서비스(VDS) 동기화 지연: 프로그램을 실행하면 "가상 디스크 서비스에 연결 중..." 메시지와 함께 모든 물리 버스를 재스캔하느라 수십 초의 딜레이가 발생합니다.
- UAC 관리자 권한 필수 요구: 단순한 용량 확인임에도 파티션 수정 권한이 포함된 관리자 권한(UAC)을 요구하여, 일반 학생 계정에서는 실행 자체가 차단됩니다.
- 시각적 인지성 부족: 텍스트 중심의 복잡한 표와 파티션 블록만 나열되어 있어, 어느 드라이브가 위험 수준(90% 이상 점유)인지 한눈에 파악하기 어렵습니다.
3. DriveInfo.GetDrives()와 IsReady 가용성 필터: 오프라인/미삽입 미디어 0초 필터링
운영체제 레벨에서 디스크 정보를 가져올 때 가장 흔히 발생하는 버그는 **미디어가 들어있지 않은 드라이브**를 조회할 때 생기는 I/O 블로킹입니다. 예를 들어 광학 디스크 드라이브(CD/DVD-ROM)나 카드 리더기는 드라이브 문자(E:, F:)는 존재하지만 실제 매체가 없어, 속성을 조회하려 하면 운영체제가 타임아웃(최대 30초)까지 응답을 멈춥니다.
ZeliDisk는 drive.IsReady 플래그를 가장 먼저 검사하여, 가용하지 않은 드라이브는 0초 만에 스킵함으로써 UI 스레드의 블로킹을 원천적으로 차단합니다:
private void LoadDisks()
{
var items = new ObservableCollection<object>();
foreach (var drive in DriveInfo.GetDrives())
{
// 미디어가 준비되지 않은 드라이브(CD-ROM 미삽입, 빈 카드리더 등)는 0초 스킵
if (drive.IsReady)
{
try
{
var item = new DiskItem
{
DriveLetter = drive.Name.Trim('\\'),
VolumeLabel = drive.VolumeLabel,
TotalSize = drive.TotalSize,
FreeSpace = drive.TotalFreeSpace,
UsedSpace = drive.TotalSize - drive.TotalFreeSpace
};
items.Add(item);
}
// ... 예외 격리 구문 ...
}
}
DiskItemsControl.ItemsSource = items;
}
4. 다중 예외 격리 샌드박싱: IOException(배드섹터)과 UnauthorizedAccessException(권한 거부) 무중단 방어
학교 컴퓨터실 PC에는 물리적으로 손상된 플래시 메모리, 불량 섹터가 발생한 노후 HDD, 또는 BitLocker로 암호화되어 일반 계정에서 접근이 통제된 파티션이 연결되어 있을 수 있습니다. 기존 유틸리티들은 이러한 드라이브를 만나는 순간 크래시가 발생하거나 무한 로딩에 빠집니다.
ZeliDisk는 3단계 계층적 예외 처리 샌드박스를 구축하여, 결함이 있는 특정 드라이브의 에러를 격리하고 정상 드라이브는 완벽하게 화면에 출력합니다:
try
{
var item = new DiskItem
{
DriveLetter = drive.Name.Trim('\\'),
VolumeLabel = drive.VolumeLabel,
TotalSize = drive.TotalSize,
FreeSpace = drive.TotalFreeSpace,
UsedSpace = drive.TotalSize - drive.TotalFreeSpace
};
items.Add(item);
}
catch (IOException ex)
{
// 물리적 I/O 장애, 배드 섹터, 장치 제거 중 에러 안전 격리
System.Diagnostics.Debug.WriteLine($"[ZeliDisk] Disk I/O Error {drive.Name}: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
// BitLocker 암호화 볼륨, 시스템 보안 폴더 권한 거부 안전 격리
System.Diagnostics.Debug.WriteLine($"[ZeliDisk] Access Denied {drive.Name}: {ex.Message}");
}
catch (Exception ex)
{
// 기타 시스템 예외 무중단 통과
System.Diagnostics.Debug.WriteLine($"[ZeliDisk] Disk Load Error {drive.Name}: {ex.Message}");
}
5. DiskItem 스토리지 모델링: B~TB 단위 변환과 정밀 사용률(UsagePercentage) 계산 엔진
사용자에게 `250059350016 바이트`라는 숫자는 직관적인 의미를 전달하지 못합니다. DiskItem 모델은 64비트 정수형(long) 바이트 값을 바탕으로 실시간 점유율(%)과 사람이 읽기 쉬운(Human-Readable) 단위로 자동 변환합니다:
- 0으로 나누기(Divide-by-Zero) 원천 방어: 빈 파티션이나 비정형 볼륨에서
TotalSize == 0일 경우NaN예외를 방지하고0.0%로 안전 폴백. - B, KB, MB, GB, TB 적응형 루프 포맷팅: 1024 단위 나눗셈 루프를 통해 소수점 둘째 자리까지 정밀 바이트 스트링 변환.
- 볼륨 레이블 자동 대체: 레이블이 지정되지 않은 드라이브는
로컬 디스크 (C:)로, 지정된 드라이브는DATA (D:)로 스마트 결합.
public class DiskItem
{
public string DriveLetter { get; set; }
public string VolumeLabel { get; set; }
public long TotalSize { get; set; }
public long UsedSpace { get; set; }
public long FreeSpace { get; set; }
// 점유율 계산 (TotalSize 0 검증 안전망)
public double UsagePercentage => TotalSize == 0 ? 0 : ((double)UsedSpace / TotalSize) * 100;
public string FormattedTotal => FormatBytes(TotalSize);
public string FormattedUsed => FormatBytes(UsedSpace);
public string FormattedFree => FormatBytes(FreeSpace);
public string FormattedPercent => $"{UsagePercentage:F1}%";
public string DisplayName => string.IsNullOrEmpty(VolumeLabel)
? $"로컬 디스크 ({DriveLetter})"
: $"{VolumeLabel} ({DriveLetter})";
public static string FormatBytes(double len)
{
string[] sizes = { "B", "KB", "MB", "GB", "TB" };
int order = 0;
while (len >= 1024 && order < sizes.Length - 1)
{
order++;
len = len / 1024;
}
return $"{len:0.##} {sizes[order]}";
}
}
6. 실시간 집계 텔레메트리와 WindowKit AlwaysOnTop 핀 고정 모니터링 UX
수업 진행 중이나 대용량 파일 복사 중에는 창이 다른 프로그램 뒤로 숨겨지지 않고 항상 화면 최상단에 고정되어 실시간으로 디스크 여유 공간 추이를 감시할 수 있어야 합니다.
ZeliDisk는 WindowKit.Attach(this, "zelidisk")를 통해 창의 이전 위치와 크기를 완벽히 복원하며, BtnPin_Click을 통한 WinUI 3 OverlappedPresenter.IsAlwaysOnTop 토글을 기본 제공합니다. 또한 전체 드라이브의 합산 총용량과 잔여 용량을 윈도우 타이틀바에 실시간 요약 브리핑합니다:
// 드라이브 전체 집계 요약 브리핑
if (items.Count > 0)
{
long totalAll = items.Cast<DiskItem>().Sum(d => d.TotalSize);
long usedAll = items.Cast<DiskItem>().Sum(d => d.UsedSpace);
long freeAll = items.Cast<DiskItem>().Sum(d => d.FreeSpace);
this.Title = $"ZeliDisk — {items.Count}개 드라이브 | 총 {DiskItem.FormatBytes(totalAll)}, 여유 {DiskItem.FormatBytes(freeAll)}";
}
// 창 최상단 핀 고정 토글
private void BtnPin_Click(object sender, RoutedEventArgs e)
{
if (AppWindow?.Presenter is not OverlappedPresenter presenter) return;
_isPinned = !_isPinned;
presenter.IsAlwaysOnTop = _isPinned;
TxtPin.Opacity = _isPinned ? 1.0 : 0.5;
PinBg.Color = _isPinned
? Windows.UI.Color.FromArgb(0x35, 0x0E, 0xA7, 0x6C)
: Windows.UI.Color.FromArgb(0x15, 0xFF, 0xFF, 0xFF);
}
7. 디스크 모니터링 도구(CrystalDiskInfo vs diskmgmt.msc vs TreeSize vs ZeliDisk) 비교 분석
공교육 및 공공 기관의 환경에 맞추어 기존 도구들과 비교 분석한 결과는 다음과 같습니다:
| 비교 항목 | Windows diskmgmt.msc | CrystalDiskInfo (상용/서드파티) | TreeSize Free | ZeliDisk (온디바이스) |
|---|---|---|---|---|
| 배포 및 설치 방식 | OS 내장 (느린 VDS 로딩) | 설치 필요 (인스톨러) | 설치형 또는 포터블 | Zero-Install 무설치 네이티브 |
| 관리자 권한(UAC) 요구 | 관리자 권한 필수 | SMART 조회 시 필수 | 일부 필요 | 일반 사용자 권한 0초 즉시 실행 |
| IsReady 사전 검증 | 타임아웃 대기 발생 | SMART 미지원 시 오류 | 순회 중 에러 발생 | 미삽입 미디어 0초 즉각 스킵 |
| I/O 에러 / 권한 격리 | 전체 창 일시 동결 | 장치 미인식 | 경고 팝업 연속 발생 | IOException 샌드박스 무중단 보호 |
| AlwaysOnTop 핀 고정 | 미지원 | 일부 지원 | 미지원 | 원클릭 최상단 핀 고정 대시보드 |
| 라이선스 단속 위험 | 무관 | 상업/공공 이용 조건 확인 | 기업/공공 라이선스 유료 | 완전 무상 보급 / 100% 라이선스 프리 |
8. 결론: "외부 설치와 관리자 권한 없는 학교·국방을 위한 가장 신속한 온디바이스 스토리지 인텔리전스"
스토리지는 컴퓨터 시스템의 토대입니다. 토대가 흔들리면 아무리 뛰어난 AI 모델이나 교육용 소프트웨어도 작동할 수 없습니다. 윈도우 관리자 권한이 없다는 이유로, 혹은 프로그램이 너무 무겁다는 이유로 디스크 상태를 방치하는 것은 더 큰 시스템 붕괴를 부릅니다.
ZeliDesk의 ZeliDisk는 마이크로소프트의 DriveInfo API를 가장 안전하고 우아하게 래핑하여, 결함 있는 드라이브를 스스로 격리하고 전체 볼륨의 상태를 0.1초 만에 한눈에 펼쳐 보입니다. 이제 전국의 학생, 교사, 국방 전산 담당자들은 소프트웨어 라이선스 걱정 없이 언제든 안전하게 시스템 스토리지 거버넌스를 완수할 수 있습니다.