1. 보이지 않는 보안 구멍, 클립보드: "스누핑(Snooping)과 개인정보 유출 위험"
현대 데스크톱 환경에서 운영체제의 클립보드는 모든 응용프로그램이 공유하는 가장 취약한 통로 중 하나입니다:
- 클립보드 스누핑(Clipboard Snooping): 많은 무료 서드파티 클립보드 유틸리티들이 편리한 '기기 간 동기화'를 명분으로 사용자가 복사한 모든 텍스트를 외부 원격 서버로 무단 전송합니다.
- 학생 개인정보 및 군사 기밀 노출: 나이스(NEIS) 시스템에서 복사한 학생 주민등록번호, 학교 통장 비밀번호, 군부대 인트라넷 접속 토큰이 백그라운드 클립보드 데몬에 의해 평문으로 가로채어질 위험에 노출되어 있습니다.
- 기존 Windows 내장 클립보드(Win + V)의 한계: Microsoft 계정 로그인 시 클라우드 동기화 위험이 상존하고, 대용량 이미지 캡처 내역이 불안정하게 소실되거나 재부팅 시 원하는 텍스트를 정밀 복원하기 어렵습니다.
2. WinRT DataTransfer의 심층 구조와 연속 복사(Race Condition)의 함정
UWP/WinUI 3 플랫폼에서 클립보드를 제어할 때 가장 까다로운 기술적 난제는 `Clipboard.ContentChanged` 이벤트의 폭주(Event Flood)와 스레드 경합입니다:
- 연속 복사(Double Copy)의 함정: 사용자가 실수로 혹은 확인 차
Ctrl + C를 0.1초 간격으로 두 번 누르면 이벤트 핸들러가 병렬로 진입하여 동일한 데이터가 중복 적재됩니다. - UI 스레드와 파일 I/O 스레드의 충돌: UI 컬렉션에 새 클립을 추가하는 도중 백그라운드 태스크가 디스크 파일(
zeliclip_history.json)에 쓰기를 시도하면IOException (The process cannot access the file because it is being used by another process)크래시가 발생합니다.
ZeliDesk의 `ZeliClip`은 이벤트 중복 구독을 원천 해제한 후 등록하고, DispatcherQueue를 통해 UI 스레드와 백그라운드 데이터의 일관성을 완벽히 동기화했습니다.
3. 시퀀스 락(Sequence Lock) 기반 비동기 영속화: 쓰기 병합(Coalescing)과 무손실 원자성
클립보드 항목이 추가될 때마다 디스크에 JSON 파일을 즉시 쓰면, 디스크 I/O 병목이 발생하고 SSD 수명이 갉아먹힙니다. ZeliClip은 고성능 데이터베이스 엔진에서 사용하는 시퀀스 락(Sequence Lock)과 쓰기 병합(Write Coalescing) 알고리즘을 적용했습니다:
private static readonly object _historySaveLock = new object();
private static long _historySaveSeq = 0; // UI 스레드에서 증가하는 최신 요청 순번
private static long _historyWrittenSeq = 0; // 마지막으로 디스크에 기록 완료된 순번
private void SaveHistory()
{
// 1. UI 스레드에서 최신 텍스트 클립 리스트의 불변(Immutable) 스냅샷 생성
var snapshot = AllClips
.Where(c => c.ClipType == ClipType.Text && !string.IsNullOrEmpty(c.Text))
.Take(MaxPersistedClips)
.Select(c => new PersistedClip {
Text = c.Text, Timestamp = c.Timestamp, IsPinned = c.IsPinned
}).ToList();
long mySeq = Interlocked.Increment(ref _historySaveSeq);
// 2. 비동기 작업자 스레드에서 시퀀스 비교를 통한 중간 쓰기 생략(Coalescing)
Task.Run(() =>
{
lock (_historySaveLock)
{
// 내가 대기하는 동안 더 새로운 요청(mySeq < _historySaveSeq)이 이미 들어왔다면
// 구버전 스냅샷 쓰기를 즉시 건너뜀 (불필요한 디스크 I/O 90% 제거)
if (mySeq < _historySaveSeq && _historyWrittenSeq >= mySeq) return;
try
{
var dir = Path.GetDirectoryName(HistoryFilePath);
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
// 3. 원자적 쓰기 (임시 파일 기록 후 원자적 교체로 파일 깨짐 100% 방어)
string tempFile = HistoryFilePath + ".tmp";
string json = JsonSerializer.Serialize(snapshot);
File.WriteAllText(tempFile, json, Encoding.UTF8);
File.Move(tempFile, HistoryFilePath, overwrite: true);
_historyWrittenSeq = mySeq;
}
catch (Exception ex)
{
Debug.WriteLine($"[ZeliClip] History save failed: {ex.Message}");
}
}
});
}
사용자가 빠르게 10번 연속 복사를 하더라도 중간 9번의 디스크 쓰기는 자동으로 병합되어 생략되며, 마지막 10번째 상태만이 임시 파일(.tmp) ➔ 원자적 파일 교체(File.Move) 방식으로 안전하게 기록됩니다. 급작스러운 전원 차단이나 강제 종료에도 파일이 0바이트로 깨지는 결함이 영구히 발생하지 않습니다.
4. 텍스트·이미지·파일 3대 포맷의 지능형 링버퍼 메모리 거버넌스
클립보드 매니저를 오랫동안 켜두면 수백 장의 고화질 스크린샷과 파일 목록이 메모리를 잠식하여 프로그램이 기가바이트 단위로 비대해집니다. ZeliClip은 MIME 타입별 엄격한 상한선(Ring-Buffer Cap)과 핀 고정(Pinning) 보호를 결합했습니다:
| 데이터 유형 | WinRT 포맷 감지기 | 메모리 상한 규격 | 오버플로우 시 폐기 전략 |
|---|---|---|---|
| 텍스트 클립 (Text) | StandardDataFormats.Text |
최대 100개 유지 | 핀(Pin) 고정되지 않은 가장 오래된 텍스트부터 자동 트림 |
| 이미지 비트맵 (Image) | StandardDataFormats.Bitmap |
최대 20개 유지 | RAM 폭발 방지를 위해 20장 초과 시 비트맵 스트림 즉시 폐기 |
| 파일 목록 (StorageItems) | StandardDataFormats.StorageItems |
동일 파일 시퀀스 자동 병합 | 연속 동일 파일 복사 감지 시 최상단 이동만 수행 (중복 적재 차단) |
교사가 수업이나 행정에서 자주 쓰는 양식 문구는 '핀 고정(Pin)' 버튼을 누르면 100개의 링버퍼 트림 한도를 무시하고 영구히 보존되어 업무 효율을 극대화합니다.
5. MSIX 샌드박스와 Unpackaged 환경을 모두 수용하는 LocalAppData 스토리지 설계
Windows 앱을 MSIX 패키지로 배포하면 Windows.Storage.ApplicationData.Current가 가상화된 컨테이너 격리 폴더로 리다이렉션됩니다. 반면 개발 모드나 휴대용(Portable) 실행 시에는 ApplicationData 접근 시 런타임 크래시가 일어납니다.
ZeliClip은 패키징 유무와 무관하게 100% 호환되는 `Environment.SpecialFolder.LocalApplicationData` (`%LOCALAPPDATA%\ZeliDesk\zeliclip_history.json`) 경로를 정규화하여, 설치 버전이든 포터블 무설치 버전이든 단일한 히스토리 지속성을 완벽하게 보장합니다.
6. 상용 클립보드 툴 vs Windows 내장 클립보드(Win+V) vs ZeliDesk ZeliClip 비교
| 비교 항목 | 상용 클라우드 클립보드 앱 (Ditto/유료툴) | Windows 기본 클립보드 (Win+V) | ZeliDesk ZeliClip |
|---|---|---|---|
| 개인정보 유출 위험 | 클라우드 동기화로 외부 유출 위험 극대 | MS 계정 클라우드 동기화 옵션 상존 | 100% 완전 온디바이스 격리 (외부 전송 0바이트) |
| 원자적 파일 영속화 | SQLite DB 락 충돌 및 파일 깨짐 빈발 | 재부팅 시 비정상 손실 잦음 | 시퀀스 락 + 원자적 File.Move로 100% 무손실 |
| 멀티 포맷 지원 | 텍스트 중심, 이미지 처리 무거움 | 텍스트/이미지 분리 검색 불편 | 텍스트·이미지·파일 3대 탭 필터링 및 실시간 검색 |
| 메모리 링버퍼 거버넌스 | 무제한 적재로 메모리 누수 유발 | 단순 25개 제한 | 텍스트 100개 + 이미지 20개 정밀 캡 & 핀 고정 |
| 디스크 I/O 최적화 | 복사마다 디스크 쓰기 발생 | 운영체제 내부 스케줄링 | 연속 복사 시퀀스 쓰기 병합(Coalescing) 적용 |
7. 결론: "내 손끝의 데이터가 단 1비트도 새어 나가지 않는 완벽한 디지털 프라이버시"
사용자가 복사하고 붙여넣는 모든 글자에는 개인의 삶과 업무의 비밀이 깃들어 있습니다. 진정한 엔지니어링의 품격은 사용자에게 '클라우드의 편리함'을 핑계로 프라이버시의 희생을 강요하지 않는 데 있습니다.
ZeliDesk의 ZeliClip은 가장 기초적인 클립보드 기능 하나에도 운영체제 레벨의 이벤트 감시, 수학적 시퀀스 락, 원자적 쓰기 병합, 완전한 물리적 격리를 투영했습니다. 학교와 군부대의 어떤 민감한 데이터도 사용자의 PC 밖으로 절대 나가지 않는 안전지대—ZeliDesk가 약속하는 기술적 신뢰의 기준입니다.