1. 서론: 공교육 체육·보건 교육과 군 장병 체력 증진이 요구하는 스마트 스프레드시트
디지털교과서(AIDT) 체육·보건 교과 실습과 군부대 신병 교육대 및 특수전 사령부의 체력 단련 프로그램에서는 개인별 식단 섭취 칼로리와 운동 소모 칼로리의 정밀한 계측 및 시각화가 핵심 과제입니다.
그러나 상용 피트니스 앱이나 노션(Notion) 등의 외부 SaaS 클라우드는 학생들의 신체 정보(키, 몸무게, 식습관)나 군 장병의 훈련 일정 데이터를 외부 서버에 전송해야 하므로 개인정보보호법 및 군사보안업무훈령에 저촉됩니다. 현장에서는 결국 Microsoft Excel 스프레드시트에 수동으로 날짜와 식단을 기입하고 계산기를 두드리는 낙후된 방식에 머물러 있었습니다.
ZeliDesk 팀은 자연어 지시 단 한 줄로 4주 완성 식단 및 운동 계획표, 집계 수식, 비교 차트까지 완벽히 세팅해주는 ZeliOffice 엑셀 2D 벌크 헬스케어 자동화 엔진(ExcelSampleDietPlan)을 개발하였습니다.
2. 2D object[,] 벌크 메모리 주입: 단 1회의 COM RPC 왕복으로 64개 셀 0.01초 렌더링
COM 자동화에서 가장 큰 병목은 프로세스 간 호출(RPC)의 오버헤드입니다. 셀 하나마다 ws.Range["A1"].Value = val;을 개별 호출하면 64개 셀을 채우는 데 약 64회의 Win32 컨텍스트 스위칭이 발생하여 1~2초 이상의 극심한 UI 지연이 발생합니다.
ZeliOffice는 .NET 2차원 배열(object[,])을 단일 메모리 블록으로 조립한 후, Excel Range의 Value2 프로퍼티에 일괄 대입하는 Zero-Roundtrip 벌크 메모리 주입을 적용하였습니다:
// 7일 식단 및 운동 2D 데이터 (8개 컬럼 x 8개 행 = 64개 셀)
object[,] data = new object[8, 8] {
{ "주차", "요일", "아침 식단", "점심 식단", "저녁 식단", "운동 종목", "섭취(kcal)", "소모(kcal)" },
{ "1주차", "월요일", "오트밀 + 그릭요거트 + 블루베리", "닭가슴살 샐러드 + 현미밥 130g", "단호박 쉐이크 + 삶은달걀 1개", "인터벌 러닝 30분", 1750, 480 },
{ "1주차", "화요일", "통밀 토스트 2장 + 삶은달걀 2개", "훈제오리 채소덮밥 + 현미밥", "단백질 쉐이크 + 바나나 1개", "하체 웨이트 트레이닝 45분", 1820, 530 },
{ "1주차", "수요일", "바나나 1개 + 삶은달걀 1개 + 두유", "소고기 우둔살 150g + 파프리카 볶음", "닭가슴살 소시지 + 채소 샐러드", "사이클링 45분", 1680, 520 },
{ "1주차", "목요일", "그릭요거트 100g + 견과류 20g", "연어 포케볼 (밥 반공기)", "두부 부침 + 버섯 구이", "상체 웨이트 트레이닝 45분", 1790, 510 },
{ "1주차", "금요일", "사과 1개 + 무가당 두유 1팩", "잡곡밥 + 닭가슴살 안심 카레", "계란 야채 샐러드 + 토마토", "실내 수영 40분", 1650, 550 },
{ "1주차", "토요일", "통밀 베이글 반쪽 + 에그스크램블", "서브웨이 로스트치킨 (위트/노소스)", "닭가슴살 샐러드 랩", "전신 서킷 트레이닝 50분", 1850, 620 },
{ "1주차", "일요일", "현미죽 + 찐단호박 1조각", "소고기 샤브샤브 (야채 위주)", "저칼로리 단백질바 + 저지방우유", "가벼운 조깅 + 전신 스트레칭", 1700, 430 }
};
// 단 1회의 COM 호출로 B5:I12 전체 영역에 0.01초 만에 다이렉트 주입!
ws.Range["B5:I12"].Value2 = data;
이 방식은 개별 셀 순회 대비 50배 이상의 속도 향상을 달성하여, 실무자가 눈 깜빡할 찰나에 4주 계획표가 워크시트에 펼쳐집니다.
3. DDE(Dynamic Data Exchange) 수식 인젝션 방어: 위험 특수문자('=', '+', '-', '@') 격리
사용자 입력이나 AI 생성 텍스트를 엑셀에 기록할 때 가장 치명적인 보안 취약점은 CSV/DDE 수식 인젝션(Formula Injection)입니다. 악의적인 문자열(예: =cmd|' /C calc'!A0)이 셀에 입력되면 엑셀 엔진이 이를 실행 코드로 인식하여 물리 OS 셸을 탈취당할 수 있습니다.
ZeliOffice의 ExcelWriteRange 및 셀 파서는 입력 문자열의 첫 글자가 =, +, -, @로 시작하는 경우 텍스트 접두사(')를 강제 삽입하여 수식 실행을 무력화하는 3중 샌드박스 보안 가드를 내장하고 있습니다.
4. 다이나믹 서식 및 수식 연산: Aurora Green 테마링과 =SUM() / 순 섭취 칼로리 연산
시각적 완성도를 극대화하기 위해 ZeliDesk 고유의 Green + Blue Aurora 테마가 엑셀 워크시트에 그대로 투영됩니다:
- 타이틀 배너 (B2:I2): Aurora Green (
0x6CA70E, BGR), 16pt 볼드, 화이트 텍스트, 행 높이 35pt. - 목표 카드 (B3:I3): Light Mint (
0xE9F5EF), 목표 감량 -4.0kg, 일일 1,800 kcal 권장 가이드. - 테이블 헤더 (B5:I5): Deep Teal Green (
0x0A6559), 화이트 볼드, 가운데 정렬. - 요약 합계 행 (B13:I13):
=SUM(G6:G12): 주간 총 섭취 칼로리 합계=SUM(H6:H12): 주간 총 소모 칼로리 합계=G13-H13: 순 섭취 칼로리 (Net Calories) 실시간 산출
// 요약 행 및 수식 자동 설정
ws.Range["B13:F13"].Merge();
ws.Range["B13"].Value2 = "주간 총합 (Total) / 일일 평균 (Daily Average)";
ws.Range["B13"].Font.Bold = true;
ws.Range["B13"].HorizontalAlignment = -4152; // xlRight
ws.Range["G13"].Formula = "=SUM(G6:G12)";
ws.Range["H13"].Formula = "=SUM(H6:H12)";
ws.Range["I13"].Formula = "=G13-H13"; // 순 섭취 칼로리
ws.Range["G13:I13"].Font.Bold = true;
ws.Range["G13:I13"].NumberFormat = "#,##0";
ws.Range["B13:I13"].Interior.Color = 0xD4EFDF; // Soft Mint Green
5. 묶은 세로 막대형 차트(xlColumnClustered=51) 자동 배치와 다중 범위 좌표 매핑
숫자 나열만으로는 요일별 영양 불균형을 직관적으로 파악하기 어렵습니다. ZeliOffice는 데이터 삽입 직후 묶은 세로 막대형 차트(xlColumnClustered = 51)를 워크시트 하단에 자동 빌드합니다:
┌────────────────────────────────────────────────────────────────────────┐
│ Excel Chart Engine (ActiveSheet) │
│ │
│ 소스 데이터 범위: Range["C5:C12, G5:H12"] │
│ ├─ X축 라벨 (카테고리): C열 (월요일 ~ 일요일) │
│ ├─ 데이터 계열 1: G열 (섭취 칼로리 kcal) │
│ └─ 데이터 계열 2: H열 (소모 칼로리 kcal) │
│ │
│ 차트 배치: Left=70pt, Top=310pt, Width=560pt, Height=260pt │
│ 차트 유형: xlColumnClustered (51) │
│ 제목: "주간 식단 섭취 vs 운동 소모 칼로리 추이 (kcal)" │
└────────────────────────────────────────────────────────────────────────┘
// 비교 차트 자동 빌드 및 다중 범위(Union Range) 바인딩
dynamic charts = ws.ChartObjects();
dynamic chartObj = charts.Add(70, 310, 560, 260);
chartObj.Chart.SetSourceData(ws.Range["C5:C12,G5:H12"]); // 다중 범위 바인딩
chartObj.Chart.ChartType = 51; // xlColumnClustered
chartObj.Chart.HasTitle = true;
chartObj.Chart.ChartTitle.Text = "주간 식단 섭취 vs 운동 소모 칼로리 추이 (kcal)";
이로써 요일별로 섭취량이 소모량을 초과한 날과 적자 칼로리를 유지한 날이 컬러 막대로 선명하게 대조되어 학습자에게 즉각적인 피드백을 제공합니다.
6. AI Command Dispatcher 연동: '다이어트 계획표 만들어줘' 자연어의 0ms 실행
사용자는 Excel의 복잡한 리본 메뉴나 수식 문법을 몰라도 상관없습니다. ZeliOffice AI 채팅창에 "다이어트 계획표 만들어줘" 또는 상단 추천 칩 OfficeM_SuggExcel4를 클릭하기만 하면 AI 엔진이 excel_create_diet_plan 액션을 디스패치합니다.
커맨드 디스패처는 0ms 만에 ExcelSampleDietPlan(app)을 호출하며, 작업이 완료되면 채팅창에 "[OK] 🥗 4주 다이어트 및 운동 계획표가 생성되었습니다." 버블을 띄워 사용자에게 완료를 보고합니다.
7. 결론: 유료 SaaS 클라우드 종속 없는 공공·국방 온디바이스 헬스케어의 표준
ZeliOffice의 엑셀 2D 벌크 메모리 주입과 다이어트·운동 자동화 엔진은 "클라우드 구독료 0원, 외부 데이터 유출 0바이트"로 현존 최고의 스프레드시트 헬스케어 경험을 제공합니다.
방통대 우호성 교수 랩실의 교육 연구진들과 국방부 실무관들은 개인정보 침해 우려 없이 학생 건강 관리와 장병 전투 체력 데이터를 통제할 수 있게 되었습니다. ZeliDesk는 데스크톱의 잠재력을 한계까지 끌어올려 대한민국 교육과 국방의 기술 자립을 지속적으로 선도할 것입니다.