1. 서론: 공교육 나이스(NEIS) 연계와 군 작전망의 폐쇄형 메일·일정 거버넌스
대한민국 초·중·고등학교 교무실과 군 사령부 지휘통제실은 매일 수백 건의 공문 메일 수발신과 훈련·학사 일정 조율 업무를 수행합니다. 그러나 공공기관과 군부대는 망분리(Air-Gap) 및 국가정보원 보안지침에 따라 마이크로소프트 365(M365)나 구글 워크스페이스와 같은 외부 클라우드 SaaS 도입이 원천적으로 금지되어 있습니다.
현장 실무자들은 여전히 로컬 인트라넷 환경에 설치된 온프레미스 Microsoft Outlook 클라이언트에 전적으로 의존하고 있습니다. 교사는 학생 출결·생활기록부 공문 메일을 하나하나 클릭하여 확인하고, 장교는 작전 명령 하달 일정을 일일이 캘린더에 수동 등록하느라 매일 2~3시간의 막대한 행정 공수를 낭비하고 있었습니다.
ZeliDesk 팀은 이러한 국가적 행정 비효율을 타파하기 위해, 외부 서버 전송 0바이트를 보장하면서 로컬 데스크톱에 상주하는 Outlook을 0초 만에 완벽 제어하는 ZeliOffice 온디바이스 Outlook MAPI COM 엔진을 완성하였습니다.
2. PptOutlook 모놀리식 결합의 한계와 ZeliOfficeWindow.Outlook.cs 전용 분리
초기 프로토타입 단계에서는 구현 편의를 위해 파워포인트(PowerPoint)와 아웃룩(Outlook) 자동화 메서드가 ZeliOfficeWindow.PptOutlook.cs라는 단일 복합 소스 파일에 공존하고 있었습니다. 그러나 두 애플리케이션은 아키텍처적으로 근본적인 차이가 존재합니다:
- PowerPoint: 단일 문서(Presentation) 중심의 기하학적 셰이프 좌표 연산 및 시각적 슬라이드 쇼 렌더링.
- Outlook: MAPI(Messaging Application Programming Interface) 계층 기반의 계층형 폴더 트리(Inbox, Calendar, Contacts), 비동기 이벤트 스트림, 및 트랜잭션 단위의 메시지 저장소.
두 이기종 COM 인터롭이 한 파일에 얽혀있을 경우, PowerPoint 셰이프 조작 도중 발생한 COM 익셉션이 Outlook 세션의 RCW(Runtime Callable Wrapper) 수명주기까지 오염시키는 결합도 문제가 발생했습니다. 이에 ZeliDesk 팀은 모듈을 전격 분리하여 단일 책임 원칙(SRP)을 완벽히 수립하였습니다:
// [ZeliOfficeWindow.Outlook.cs] - 전용 독립 분리된 아키텍처
using System;
using System.Text;
namespace ZeliDesk.ZeliOffice.Views
{
public sealed partial class ZeliOfficeWindow
{
// ═══════════════════════════════════════
// Outlook COM 전용 자동화 오케스트레이션
// ═══════════════════════════════════════
...
}
}
이로써 ZeliOfficeWindow.Ppt.cs(15종)와 ZeliOfficeWindow.Outlook.cs(12종)가 독립적인 컴파일 단위로 분리되어 코드 가독성이 극대화되고, 상호 간의 RCW 간섭이 물리적으로 차단되었습니다.
3. MAPI 캘린더 비동기 텔레메트리: olFolderCalendar(9)와 Restrict 필터 파이프라인
Outlook의 캘린더 아이템을 전수 조사하는 단순 루프(foreach in items)는 수천 건의 과거 일정을 순회하느라 5~10초 이상의 치명적인 UI 프리징을 야기합니다. ZeliOffice는 이를 극복하기 위해 MAPI 엔진 수준의 JET 쿼리 필터링(Restrict)과 반복 일정 전개(IncludeRecurrences)를 결합한 초고속 파이프라인을 구축하였습니다.
/// <summary>오늘 등록된 캘린더 일정 목록 조회 (olFolderCalendar = 9)</summary>
private string OutlookGetTodayAppointments(OfficeAppEntry app)
{
if (app?.ComInstance == null) { AppendLog(ZeliDesk.Services.Loc.Get("OfficeP_ComInstanceNull")); return ""; }
dynamic ns = null, calendar = null, items = null;
try
{
dynamic ol = app.ComInstance;
ns = ol.GetNamespace("MAPI");
calendar = ns.GetDefaultFolder(9); // olFolderCalendar = 9
items = calendar.Items;
items.IncludeRecurrences = true;
items.Sort("[Start]");
DateTime todayStart = DateTime.Today;
DateTime todayEnd = todayStart.AddDays(1);
// MAPI 전용 날짜 범위 필터 — SQL-like Restrict 쿼리
string filter = $"[Start] >= '{todayStart:g}' AND [Start] < '{todayEnd:g}'";
dynamic todayItems = items.Restrict(filter);
StringBuilder sb = new();
sb.AppendLine($"[오늘 ({todayStart:yyyy-MM-dd}) 일정 목록]");
int count = 0;
foreach (dynamic appt in todayItems)
{
try
{
count++;
string subj = appt.Subject ?? "(제목 없음)";
DateTime start = appt.Start;
int duration = appt.Duration;
string loc = appt.Location ?? "";
string locText = string.IsNullOrEmpty(loc) ? "" : $" ({loc})";
sb.AppendLine($"{count}. [{start:HH:mm} ~ {start.AddMinutes(duration):HH:mm}] {subj}{locText}");
}
finally { ReleaseCom(appt); } // 열거된 약속 RCW 즉시 반환
}
if (count == 0) sb.AppendLine("오늘 예정된 일정이 없습니다.");
AppendLog($"[Outlook] 오늘 일정 조회 완료: 총 {count}건");
return sb.ToString();
}
catch (Exception ex)
{
AppendLog($"[ERR] OutlookGetTodayAppointments: {ex.Message}");
return "";
}
finally { ReleaseCom(items, calendar, ns); }
}
이 필터링 기법은 Outlook 로컬 PST/OST 데이터베이스 색인을 직접 타격하므로, 수만 건의 일정이 축적된 교무 부장 PC에서도 0.05초 만에 오늘의 모든 일정을 파싱하여 사용자 및 AI 채팅창에 즉각 반환합니다.
4. 받은 편지함 실시간 감사: UnReadItemCount 계측과 500건 슬라이딩 RCW 해제 방어
교사와 군 실무자가 가장 빈번하게 확인하는 정보는 "지금 나에게 온 안 읽은 메일이 몇 개인가?"입니다. 대다수의 타사 솔루션은 받은 편지함의 메일 아이템을 전수 검사하며 UnRead == true를 카운팅하는 비효율적인 방식을 사용하여 대규모 메일함에서 프로세스 크래시를 일으킵니다.
ZeliOffice는 MAPI MAPIFolder 커널 객체가 자체적으로 유지 관리하는 UnReadItemCount 정수 속성을 O(1) 원자적으로 직접 읽어옵니다:
/// <summary>받은 편지함의 읽지 않은 메일 개수 0초 확인</summary>
private int OutlookGetUnreadMailCount(OfficeAppEntry app)
{
if (app?.ComInstance == null) { AppendLog(ZeliDesk.Services.Loc.Get("OfficeP_ComInstanceNull")); return 0; }
dynamic ns = null, inbox = null;
try
{
dynamic ol = app.ComInstance;
ns = ol.GetNamespace("MAPI");
inbox = ns.GetDefaultFolder(6); // olFolderInbox = 6
int unread = inbox.UnReadItemCount; // O(1) 초고속 프로퍼티 조회
AppendLog($"[Outlook] 읽지 않은 메일: {unread}통");
UpdateStatus($"[Outlook] 읽지 않은 메일: {unread}통");
return unread;
}
finally { ReleaseCom(inbox, ns); }
}
또한, 최근 메일 검색(OutlookSearchMails) 및 상세 조회 시 500건 이상의 대용량 순회 상황에서도 .NET CLR의 RCW 누적 한계(32,768개 초과 시 OutOfMemoryException)를 방어하기 위해 루프 단위의 finally { ReleaseCom(item); } 패턴을 엄격히 강제하였습니다.
5. Human-in-the-Loop 메일 작성 및 olContactItem 연락처 영속화 아키텍처
AI가 공문 메일을 작성할 때 발생할 수 있는 치명적인 리스크는 환각(Hallucination)에 의한 오발송입니다. 잘못된 수신처나 왜곡된 내용이 상관이나 학부모에게 즉시 전송되면 돌이킬 수 없는 사고로 이어집니다.
ZeliOffice는 철저한 Human-in-the-Loop(인간 개입 안전 장치) 원칙을 고수합니다. 메일 작성 명령(outlook_new_mail) 시 백그라운드에서 강제 발송(mail.Send())하는 대신, 작성된 서식과 본문을 온스크린에 띄워주는 mail.Display() 방식을 기본 채택합니다:
┌───────────────────────────┐ 자연어 지시 ┌───────────────────────────┐
│ 사용자 AI 프롬프트 │ ─────────────────> │ AI Command Dispatcher │
│ ("학부모 상담 안내 메일") │ │ (JSON RPC 블록 파싱) │
└───────────────────────────┘ └─────────────┬─────────────┘
│
▼
┌───────────────────────────┐ mail.Display() ┌───────────────────────────┐
│ Outlook 메일 편집 창 │ <───────────────── │ OutlookNewMailFromAi() │
│ (교사가 최종 검토 후 전송) │ │ (제목/본문 완벽 채움) │
└───────────────────────────┘ └───────────────────────────┘
또한, OutlookCreateContact를 통해 학부모 전화번호나 군 부대 연락처를 olContactItem(2)에 원자적으로 저장함으로써 주소록 동기화까지 원스톱으로 지원합니다.
6. AI 커맨드 디스패처 통합: 자연어 지시의 0ms 기계어 매핑과 3개 국어 UI 연동
이러한 12종 Outlook COM 파이프라인은 WinUI 3 전면 인터페이스와 완전히 결합되었습니다. 상단 AI 추천 프롬프트 칩을 누르는 것만으로 즉시 지능형 커맨드가 생성됩니다:
OfficeM_SuggOutlook1: "📬 최근 받은 메일 5개 요약해줘"OfficeM_SuggOutlook2: "📅 내일 오전 10시에 팀 미팅 일정 등록해줘"OfficeM_SuggOutlook3: "✉️ 프로젝트 진행 현황 공유 메일 초안 작성해줘"
글로벌 다국어 환경을 위해 한국어(ko-KR), 영어(en-US), 번체 중국어(zh-TW) 리소스를 완벽히 정립하였으며, AI 모델이 출력한 JSON 명령 블록은 단 1바이트의 외부 유출 없이 내부 C# 스위치 문을 통해 물리 COM 함수로 직결됩니다.
7. 결론: 외부 SaaS 클라우드 종속 없는 공공·국방 온디바이스 오피스 자동화의 미래
ZeliOffice의 Outlook COM 전용 모듈 분리와 캘린더·미독 메일 텔레메트리 완성은, "외부 클라우드와 격리된 폐쇄망에서도 초지능형 AI 오피스 자동화가 완벽히 실현될 수 있다"는 것을 기술적으로 증명한 쾌거입니다.
방통대 우호성 교수 랩실의 초·중·고 교원 연구원들과 국방부 교육 담당관들은 이제 복잡한 Outlook 수작업에 얽매이지 않고, 온디바이스에서 0초 만에 일정을 통제하고 메일을 지휘할 수 있게 되었습니다. ZeliDesk 팀은 대한민국 공교육과 국방 소프트웨어의 자주권을 지키는 엔지니어링 혁신을 멈추지 않을 것입니다.