← 기술 블로그 목록으로 돌아가기
#997 • Office Automation & AI Engineering

교무행정·군 문서 자동화를 위한 AI 오피스 연동(HWP·Excel·Word)과 3중 방어막 설계

수백 장의 한글(HWP) 및 거대 엑셀 시트 제어 시 발생하는 950K 컨텍스트 폭발과 COM 마샬링 병목. 한글 2024 COM의 7대 기괴한 결함들을 격파하고 2차원 벌크 쓰기로 50배 속도를 달성한 실전 엔지니어링 백서.

"AI가 아무리 시를 잘 짓고 그럴듯한 답변을 내놓아도, 교무실에서 매일 마주하는 기안문(HWP)의 표를 채우지 못하고 학급 성적표(Excel)를 직접 조작하지 못하면 공교육 현장에서는 단 1초 만에 외면받습니다."

1. 공교육·공공기관의 현실: "한글(HWP)과 엑셀을 못 다루면 진짜 AI가 아니다"

대한민국 초·중·고등학교와 공공기관, 군부대의 모든 행정은 아래아한글(HWP/HWPX)과 마이크로소프트 엑셀(Excel)이라는 거대한 두 축 위에서 작동합니다. 가정통신문, 교육과정 편제표, 학교생활기록부 기초자료, NEIS 연계 통계표, 복무 기안문 등 생산되는 문서의 95% 이상이 이 두 포맷에 갇혀 있습니다.

기존의 수많은 AI 챗봇들은 웹 브라우저 안에서 텍스트만 생성해 주는 반쪽짜리 도구에 불과했습니다. 교사는 AI가 생성해 준 답변을 일일이 복사해서 한글 프로그램에 붙여넣고, 깨진 표의 테두리를 다시 그리고, 폰트와 행간을 수동으로 조절해야 했습니다. 결과적으로 'AI를 쓰는 게 오히려 일이 더 많아진다'는 불만이 터져 나왔습니다.

ZeliDesk의 ZeliOffice는 이러한 한계를 부수기 위해 시작되었습니다. Windows OS의 네이티브 COM(Component Object Model) 인터페이스를 통해 현재 사용자가 작업 중인 실제 HWP, Excel, Word 프로그램에 AI가 실시간으로 문맥을 주입하고, 셀을 채우고, 표를 그리며 서식을 다듬는 완전 자동화 파이프라인을 구현했습니다.

2. 아래아한글(HWP) 2024 COM 자동화의 7대 난제와 극복기

마이크로소프트 Office(VBA/COM)와 달리, 아래아한글의 COM 인터페이스(HWPFrame.HwpObject)는 30년 넘게 축적된 레거시 구조와 독자적인 액션 테이블(HAction/HParameterSet) 구조로 악명 높습니다. 특히 최신 한글 2024 환경에서는 이전 버전과 다른 기괴한 동작들이 속출했습니다. ZeliOffice 팀이 겪은 7대 난제와 해결 전략을 공개합니다.

💡 한글 2024 COM 자동화 핵심 극복 요약

보안 모듈 무인 승인 ➔ CharShape 상태 머신 구축 ➔ ParagraphShape 액션 정규화 ➔ 200ms 딜레이 RPC 완충 ➔ Win32 GA_ROOT 스냅 ➔ FullName 다형성 Fallback.

① 보안 경고 팝업 무인 차단: RegisterModule

한글 COM을 생성하자마자 "외부 프로그램이 한글 문서에 접근하려고 합니다. 허용하시겠습니까?"라는 보안 대화상자가 화면을 가로막아 모든 백그라운드 자동화가 올스톱되는 문제가 발생합니다. 이를 해결하기 위해 레지스트리에 보안 모듈 DLL을 등록하고, 인스턴스 생성 즉시 무인 승인 코드를 주입했습니다:

// 한글 보안 경고 무인 우회
try 
{ 
    ((dynamic)instance).RegisterModule("FilePathCheckDLL", "FilePathCheckerModule"); 
} 
catch { }

② '글자가 점(.)으로 쪼그라드는' CharShape 1pt 리셋 미스터리

AI 비서에게 "이 내용을 새 문서에 요약해서 작성해줘"라고 명령했을 때, 표는 정상적으로 생성되는데 표 아래의 제목과 본문 텍스트가 육안으로 보이지 않는 미세한 점(.)으로 인쇄되는 기현상이 발생했습니다. (텍스트를 드래그해서 폰트 크기를 키우거나 복사-붙여넣기하면 정상 글자가 나타남).

원인은 한글 2024 COM의 치명적인 설계 결함이었습니다. AI가 SetFontSize(13) 후 SetBold(true)를 연속 실행할 때, 볼드 처리를 위해 호출한 hwp.HAction.GetDefault("CharShape")가 방금 지정한 높이(1300 = 13pt)를 보존하지 않고 최소 기본값인 100(1pt)으로 강제 리셋해 버린 것입니다.

// [해결책] C# 내부 CharShape 상태 머신 설계
private int _hwpCharHeight = 1000; // 10pt
private int _hwpCharBold = 0;
private int _hwpCharItalic = 0;

private void ApplyHwpCharShape(OfficeAppEntry app)
{
    dynamic hwp = app.ComInstance;
    hwp.HAction.GetDefault("CharShape", hwp.HParameterSet.HCharShape.HSet);
    var cs = hwp.HParameterSet.HCharShape;
    // 이전 설정값을 내부 상태 머신에서 강제 유지
    cs.Height = _hwpCharHeight;
    cs.Bold = _hwpCharBold;
    cs.Italic = _hwpCharItalic;
    hwp.HAction.Execute("CharShape", cs.HSet);
}

이와 같이 상태 머신을 구축하여 글꼴 크기나 볼드가 변경될 때마다 전체 상태를 함께 원자적(Atomic)으로 주입함으로써 글자가 깨알 점으로 축소되는 현상을 원천 박멸했습니다.

③ ParaShape 런타임 NullReference 크래시 극복

과거 매크로 코드에서 자주 쓰이던 hwp.CreateAction("ParaShape") 방식이 한글 2024에서는 null을 반환하여 Cannot perform runtime binding on a null reference 예외를 뿜어냈습니다. 이를 액션 테이블 정규 파라미터셋인 hwp.HAction.GetDefault("ParagraphShape", hwp.HParameterSet.HParaShape.HSet) 파이프라인으로 전면 개편하여 정렬(Left/Center/Right/Justify)과 줄간격을 완벽히 정상화했습니다.

④ 연속 표 생성 시의 RPC_E_SERVERFAULT (0x80010105) 격퇴

AI가 80여 개의 명령어를 연속 실행하며 여러 개의 표를 연달아 삽입할 때, 한글 COM 서버가 내부 레이아웃 트리를 재구성하기 전에 다음 표 명령이 들어와 RPC_E_SERVERFAULT (0x80010105) 치명적 예외를 발생시켰습니다.

// 표 생성 완료 후 안전 탈출 및 비동기 완충
hwp.HAction.Run("CloseEx");     // 표 편집 모드 안전 종료
hwp.HAction.Run("MoveDocEnd");  // 커서를 문서 최하단으로 강제 이동
System.Threading.Thread.Sleep(200); // 한글 내부 레이아웃 스레드 동기화 대기

표 편집 모드를 빠져나오는 즉시 MoveDocEnd로 커서를 문서 끝으로 빼내고 200ms 완충 딜레이를 부여함으로써, 10개 이상의 표가 포함된 거대 보고서도 충돌 없이 단숨에 작성되도록 안정화했습니다.

⑤ Clear(1)의 함정과 FileNew + SetMessageBoxMode(1)

초기에는 "새 문서" 동작을 위해 hwp.Clear(1)을 호출했습니다. 그러나 이는 문서 버퍼만 비울 뿐 뷰(View) 윈도우를 제대로 초기화하지 못해 창이 화면에 뜨지 않거나, 저장되지 않은 문서가 있을 때 "저장하시겠습니까?" 모달 창에 COM 호출 스레드가 영구 블로킹(Deadlock)되는 문제가 있었습니다.

이를 해결하기 위해 대화상자 자동 응답 모드(SetMessageBoxMode(1))를 일시 활성화한 후 FileNew 액션을 실행하고 즉시 모드를 복원하는 무차단 패턴을 정립했습니다.

⑥ 다중 문서 탭 스피너: Path vs FullName 3단계 Fallback

ZeliOffice 상단의 '활성 문서' 콤보박스에서 한글 문서 제목이 공백으로 나오던 버그는 XHwpDocument.Path가 파일명이 아닌 폴더 디렉토리 경로만 반환하기 때문이었습니다. 이를 극복하기 위해 다음과 같은 3단계 견고한 Fallback 알고리즘을 도입했습니다:

우선순위 호출 속성 반환 예시 처리 방식
1단계 Active_XHwpDocument.FullName C:\문서\2026학년도_학사일정.hwp Path.GetFileName으로 파일명 추출
2단계 hwp.CurFileName 2026학년도_학사일정.hwp 활성 뷰의 현재 파일명 직접 획득
3단계 미저장 새 문서 (Fallback) (경로 없음) 컬렉션 인덱스를 추적하여 새 문서 N 자동 생성

3. Excel COM 성능 혁신: 2차원 SafeArray 벌크 쓰기로 50배 단축

초기 프로토타입에서 AI가 1,000행의 학생 명렬표 데이터를 엑셀에 입력할 때, 셀 하나하나에 값을 넣는 단일 셀 반복문(sheet.Cells[r, c] = val)을 사용했습니다.

.NET CLR과 엑셀 프로세스 간의 프로세스 간 통신(IPC) 마샬링 오버헤드로 인해, 1,000개의 셀을 채우는 데 무려 28초가 소요되며 엑셀 창이 '응답 없음'으로 프리징되었습니다.

// [기존 방식 - 28초 소요] 1,000회 IPC 마샬링 오버헤드
for(int r = 1; r <= 1000; r++) {
    sheet.Cells[r, 1] = data[r]; // 매번 컨텍스트 스위칭 발생!
}

// [ZeliOffice 혁신 - 0.2초 주파] 2차원 SafeArray 단 1회 벌크 주입
object[,] bulkData = new object[1000, 5];
// C# 메모리 상에서 데이터 고속 배열 구성...
Range targetRange = sheet.Range["A1", "E1000"];
targetRange.Value2 = bulkData; // 단 1회의 COM 마샬링으로 끝!

excel_write_range 엔진을 도입한 결과, 1,000개 행의 성적 및 출결 통계가 0.2초 만에 즉각 렌더링되는 경이로운 성능 향상(50배 이상)을 이뤄냈습니다.

4. 초거대 공문서 제어: 950K 토큰 폭발을 막아낸 3중 방어막 아키텍처

학교 현장의 30~50페이지짜리 거대 규정집이나 교육계획서 전체를 AI에게 질의할 때, 문서 전체 텍스트가 950,000 토큰(950K)을 상회하여 대형 언어 모델(LLM)의 128K 컨텍스트 윈도우를 터뜨리는 현상이 빈번했습니다.

ZeliOffice는 어떤 대형 공문서가 들어오더라도 시스템 다운 없이 안전하게 처리할 수 있도록 3중 방어 아키텍처(3-Layer Defense Pipeline)를 구축했습니다.

[ ZeliOffice 3중 방어막 아키텍처 ]
┌────────────────────────────────────────────────────────────────────────┐
│ Layer 1: Pre-flight 지능형 토큰 예측 및 스마트 압축 (128K API 한도 보호)   │
│  - 실시간 입력 토큰 사전 계산 (BPE 토크나이저 연동)                     │
│  - 누적 히스토리가 800K에 근접할 경우 오래된 대화를 손실 없이 압축 요약  │
├────────────────────────────────────────────────────────────────────────┤
│ Layer 2: 스마트 헤드/테일 발췌 & 12,000자 안전 캡핑                      │
│  - 17페이지 이상의 대형 공문서 읽기 시 전체 덤프 대신                      │
│  - 서식 서두(4,000자) + 결론·서명부(2,000자) 스마트 추출               │
│  - 핵심 맥락을 완벽히 보존하면서 토큰 낭비 90% 이상 절감               │
├────────────────────────────────────────────────────────────────────────┤
│ Layer 3: 대량 실행 가드레일 (인간 중심 안전 승인)                       │
│  - 50개 이상 명령어: 경고 뱃지 및 점검 알림                             │
│  - 200개 이상 대량 수정: 사용자 확인 모달 팝업으로 오작동 원천 차단      │
└────────────────────────────────────────────────────────────────────────┘

5. Win32 화면 분할: 최상위 프레임(GA_ROOT) 추적과 사이드 바이 사이드 스냅

교사가 AI와 대화하면서 오피스 문서가 실시간으로 채워지는 과정을 한눈에 보려면, 좌측에는 HWP/Excel 창, 우측에는 ZeliOffice 창이 나란히 50:50으로 붙는 사이드 바이 사이드(Side-by-Side) 스냅이 필수적이었습니다.

그러나 한글 COM 인스턴스에서 넘겨주는 윈도우 핸들(HWND)은 문서 뷰 내부의 자식 컨트롤 핸들(Child Window)인 경우가 많아, 여기에 SetWindowPos를 날리면 한글 프로그램 전체가 이동하는 것이 아니라 내부 캔버스만 깨지는 현상이 발생했습니다.

// Win32 API로 최상위 루트 프레임 윈도우 완벽 추적
[DllImport("user32.dll", ExactSpelling = true)]
private static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags);
private const uint GA_ROOT = 2;

public static void SnapSideBySide(IntPtr childHwnd)
{
    // 자식 창 핸들로부터 실제 운영체제 최상위 프레임 창을 획득
    IntPtr rootHwnd = GetAncestor(childHwnd, GA_ROOT);
    if (rootHwnd == IntPtr.Zero) rootHwnd = childHwnd;

    // 작업 표시줄을 제외한 화면 작업 영역(WorkArea) 50:50 정확 분할
    var workArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
    int halfWidth = workArea.Width / 2;

    // 좌측: 오피스 프로그램 / 우측: ZeliOffice
    SetWindowPos(rootHwnd, IntPtr.Zero, 0, 0, halfWidth, workArea.Height, SWP_NOZORDER);
}

GetAncestor(hwnd, GA_ROOT)를 적용함으로써, 교사가 [바로 연결] 버튼을 누르는 순간 별도의 마우스 조작 없이도 한글과 엑셀 창이 모니터 좌측 절반에 자석처럼 달라붙고, ZeliOffice AI가 우측 절반에 배치되어 즉시 시각적인 협업이 가능한 완벽한 UX를 완성했습니다.

6. 결론: "교사를 행정에서 해방시키고 교육의 본질로 돌려보내다"

진정한 인공지능의 가치는 기술의 복잡성을 자랑하는 데 있지 않고, 사용자가 가장 지루해하고 고통스러워하는 반복 작업을 완벽하게 대신 처리해 주는 실용성에 있습니다.

대한민국 교사들은 매일 밤늦은 시간까지 수십 건의 공문서와 통계 시트에 치여 학생들과 눈을 맞출 시간을 빼앗기고 있습니다. ZeliOffice는 화려한 말장난을 하는 AI가 아니라, 가장 거칠고 까다로운 공공 오피스 환경의 밑바닥까지 내려가 튼튼한 방어선과 고속 파이프라인을 구축한 대한민국 유일의 실전형 오피스 AI입니다.

공교육과 교무행정을 위한 가장 진보한 AI, ZeliDesk

복잡한 환경 설정 없이 Microsoft Store에서 원클릭으로 설치하고, 강력한 HWP·Excel 자동화의 신세계를 경험해 보세요.

⚡ Microsoft Store에서 무료 다운로드