← 목록
기타 2026-07-15 5KB 읽기 5분

크라우니 오피스 문서편집기 — 히스토리(버전) 실스냅샷 시스템 (punch #8)

개요

크라우니 오피스 문서(Docs) 편집기 우패널 "히스토리" 탭이 하드코딩된 4건(verDefs)만 보여주고 "이 버전 복원" 버튼은 onClick 자체가 없어 죽어있던 문제(spec/문서기능-판정표.md punch #8)를 해결. 브릿지 1~7차(서식/상태바/실행취소/찾기/삽입/개요/댓글)와 동일 패턴으로 crownyBridge.js에 이어붙였다. 앱 번들(bundle/office/app/index.html) 무수정, 네이티브 (crowny-browser.m/crowny-shell.m/Makefile) 무수정.

무엇을 했는지

  1. 실측 우선: bundle/office/app/index.html이 4.2MB 번들 로더(DCLogic)라 정적 grep이
무의미함을 확인 → CDP(:9333, win/cdp평가.js)로 라이브 window.__dcRegistry.ModuleDocsLogic.toString()/html을 직접 덤프해 실제 상태·템플릿(verDefs/verSel/restoreStyle) 확인. 이 버전 복원 div는 부모 카드의 onClick="{{v.select}}"만 상속(클릭해도 재선택 no-op) — 자체 핸들러 전무 확인.
  1. 한선씨 정본 bundle/office/bridge/버전이력.한선 신규 작성: 스냅샷 레코드
"id|시각|라벨|글자수" 직렬화, 상한 50(가장 오래된 것부터 폐기), 자동트리거판정 (경과시간≥2분 OR 글자변화≥200자 — 자동저장복구.한선 "더티/간격" 게이트 확장), 자동인접병합판정(버전비교.한선 변경량 발상 단순화), 복원선택유효, 복원백업스냅샷추가 (데이터 손실 방지). hanseonc_high 컴파일 + crownyc run 자체시험 24/24 PASS (VM 함정 1건 발견·문서화: 추가(배열,값)은 제자리변경(in-place)이라 별칭 변수도 함께 갱신됨 — 순수함수 가정 금지, 테스트 케이스명 복원백업_배열추가는제자리변경_별칭도갱신).
  1. crownyBridge.js 섹션 12 추가: 프레임워크가 소유한 verDefs 4건 정적 렌더를 섹션
10(개요)·11(댓글)과 동일 전략(콘텐츠 마커 앵커 — 하단 안내문구 리프 노드)으로 완전 인수. - 신규 UI: "현재 버전 저장" 버튼(수동 트리거, 히스토리 패널에 새로 주입) - 자동 트리거: input 이벤트 즉시 체크 + 5초 배경 폴링(유휴 상태 시간트리거 커버) - 복원: 클릭 시 ①현재 상태를 "복원 전 백업" 라벨로 먼저 커밋 ②flushHistory()restoreHTML()commitSnapshot()(섹션 6, punch #3 재사용)으로 실행취소 스택에도 하나의 undo 단계로 연동 — ⌘Z로 복원 자체를 되돌릴 수 있음 - 실행취소(punch #3) 스택과 완전 분리된 별도 저장소(VERSIONS_* 전역)

실측 검증 (CDP :9333, before/after)

  • 초기: 시딩 스냅샷 1건("자동 저장 · 99단어")
  • 편집1 + "현재 버전 저장" 클릭 → 카드 2건 (수동 저장 추가 확인)
  • 편집2 + 저장 클릭 → 카드 3건
  • 가장 오래된 스냅샷 선택 → 복원버튼 노출(display:noneblock 실측) → 복원 클릭 →
innerHTML 실제 변경(474자→428자, 시딩 버전 내용으로 복원) + 카드 4건(백업 자동 추가, 라벨 "복원 전 백업" 확인)
  • ⌘Z 디스패치 → innerHTML이 복원 직전 상태(474자)로 정확히 롤백
(undoRestoredToPreRestoreContent: true)
  • 회귀 1~7차 전부 정상: B서식 적용/상태바 실측(101단어·369자, 하드코딩 아님)/실행취소·재실행
버튼 존재/찾기 트리거/개요 3항목 실동기화/댓글 추가버튼 생존/히스토리 4건 유지
  • 게이트: CrownyBrowser 네이티브 프로세스 3초 생존(PID 불변) 확인, native/*.m·Makefile·
앱번들 mtime 전부 이번 세션 이전(무수정) 확인

관련 파일

  • /Users/ef/crownybrowser/bundle/office/bridge/crownyBridge.js — 섹션 12(히스토리 스냅샷),
섹션 5(schedule에 renderHistoryIfNeeded 추가), input 리스너에 maybeAutoVersionCommit 추가
  • /Users/ef/crownybrowser/bundle/office/bridge/버전이력.한선 — 신규, 정본, 자체시험 24/24
  • /Users/ef/crownybrowser/spec/문서기능-판정표.md — punch #8 원 판정 근거
  • /Users/ef/crownybrowser/spec/오피스-개발계획.md — Phase 1-A 착수 순서(§7 히스토리 스냅샷)

잔여 이슈

  • 자동인접병합판정(정본에 구현됨, JS applyVersionMergeAndCap에서 사용)은 짧은 테스트
세션에서는 트리거되지 않음(연속 자동스냅샷이 쌓일 만큼 오래 관찰 안 함) — 장시간 세션에서 추가 실측 권장.
  • 다중 사용자 저자 표시 없음(로컬 단일 세션 가정, 댓글모델의 "나"와 동일 관례) — 실제 협업
붙으면 저자 필드 확장 필요.
  • Phase 1-A punch list 잔여: #9 키보드 단축키 배선, #10 툴바 드롭다운 3종(스타일/폰트/크기).