현상
편집 영역에서 표를 삭제하거나 행/열을 삽입·삭제해도 Ctrl+Z 로 되돌릴 수 없음. 셀 분할/병합도 동일. 사용자가 실수로 표를 날리면 복구 불가.
진단 결과 (v0.7.3 시점)
근본 원인
rhwp-studio 에는 두 개의 편집 경로가 있음:
- 텍스트 편집 —
history.ts 의 EditCommand 스택을 통해 정상적으로 do/undo 쌍 등록
- 표 편집 —
hwpctl/actions/table-edit.ts 에서 WASM doc.deleteTableRow/Column/... 을 직접 호출. history.execute() 나 saveSnapshot() 을 거치지 않음
관련 코드:
누락된 Command (8건)
- 표 생성 (`createTable`)
- 표 삭제 (`deleteTable`)
- 행 삽입 (`insertTableRow`)
- 행 삭제 (`deleteTableRow`)
- 열 삽입 (`insertTableColumn`)
- 열 삭제 (`deleteTableColumn`)
- 셀 분할 (`splitTableCell`)
- 셀 병합 (`mergeTableCells`)
관련 이슈
해결 방안
A안 — 정공법: 개별 EditCommand 로 래핑
각 표 연산마다 do/undo 쌍을 갖는 EditCommand 클래스 추가. 텍스트 편집과 동일한 방식.
- 장점: 메모리 효율 (delta 만 저장), 표준 패턴 일관성
- 단점: 8개 Command 구현 필요, IR 수준 역연산 로직 (특히 셀 병합 복원) 복잡
B안 — 스냅샷 + SnapshotCommand 일괄 래핑
표 편집 전 `Document` clone → 편집 실행 → SnapshotCommand(before, after) 로 history 등록. 기존 SnapshotCommand 패턴 재사용.
- 장점: 구현 최소 (`table-edit.ts` 에서 `history.execute(new SnapshotCommand(...))` 래핑만)
- 단점: 메모리 사용량 ↑ (대형 문서에서 표 1건 편집당 전체 문서 2개 복제)
C안 — 하이브리드
쉬운 연산(행/열 삽입·삭제)은 A안, 복잡한 연산(셀 병합·분할)은 B안. 점진적 이전.
제안 마일스톤
M07x (v0.7.x) — 사용자 데이터 보호 관점에서 우선순위 높음. v1.0.0 전 필수.
테스트 체크리스트
현상
편집 영역에서 표를 삭제하거나 행/열을 삽입·삭제해도
Ctrl+Z로 되돌릴 수 없음. 셀 분할/병합도 동일. 사용자가 실수로 표를 날리면 복구 불가.진단 결과 (v0.7.3 시점)
근본 원인
rhwp-studio 에는 두 개의 편집 경로가 있음:
history.ts의EditCommand스택을 통해 정상적으로 do/undo 쌍 등록hwpctl/actions/table-edit.ts에서 WASMdoc.deleteTableRow/Column/...을 직접 호출.history.execute()나saveSnapshot()을 거치지 않음관련 코드:
누락된 Command (8건)
관련 이슈
해결 방안
A안 — 정공법: 개별 EditCommand 로 래핑
각 표 연산마다 do/undo 쌍을 갖는 EditCommand 클래스 추가. 텍스트 편집과 동일한 방식.
B안 — 스냅샷 + SnapshotCommand 일괄 래핑
표 편집 전 `Document` clone → 편집 실행 → SnapshotCommand(before, after) 로 history 등록. 기존 SnapshotCommand 패턴 재사용.
C안 — 하이브리드
쉬운 연산(행/열 삽입·삭제)은 A안, 복잡한 연산(셀 병합·분할)은 B안. 점진적 이전.
제안 마일스톤
M07x (v0.7.x) — 사용자 데이터 보호 관점에서 우선순위 높음. v1.0.0 전 필수.
테스트 체크리스트