You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
rhwp 프로젝트를 진행하며 HWP와 HWPX 양쪽을 직접 파싱·직렬화·렌더링하다 보니 두 포맷에 대한 인상이 축적되었습니다. HWPX에 대한 현장 관찰을 공유하고, 동시대에 비슷한 작업을 하시는 분들의 관점도 듣고 싶어 글을 남깁니다.
출발점: 현장에서 느낀 인상
HWPX 설계자는 XML이 지금처럼 성숙하기 이전 시기에 XML을 공부하고 실험적으로 도입한 것으로 보입니다. HWPX 포맷을 볼수록 형식주의와 장식적 요소가 실용성보다 앞서 있고, 후발주자가 HWP 구조를 역으로 이해하려 할 때 구조적 장벽처럼 느껴지는 설계 결정들이 곳곳에서 눈에 띕니다.
관찰한 근거
rhwp에서 samples/hwpx 폴더 전체를 감사한 결과, 이 직관을 뒷받침하는 증거들이 있었습니다.
과잉 네임스페이스 (hh:/hp:/hc:/hs:/opf:): 4개 네임스페이스로 쪼갠 실질적 이득이 없습니다. XML 설계 초창기 "네임스페이스는 모듈화의 해답"이라는 담론이 남긴 흔적입니다. 2007년 OOXML/ODF도 비슷한 과잉 분할을 했다가 실무에선 불편함만 남았습니다.
표현 수단의 중복:
<hh:border> vs <hh:leftBorder>+<hh:rightBorder>+... — 같은 개념 두 번
hc:transMatrix/scaMatrix/rotMatrix 6원소 행렬을 속성으로 박음 → 명백히 어색한 XML 사용
이진 포맷 관성의 직역:
<hh:beginNum page="1" tbl="1" pic="1" equation="1" footnote="1" endnote="1"> — HWP 바이너리의 BeginNumber 구조체를 그대로 XML 속성으로 옮긴 흔적. XML 관용이면 <startNumber for="page">1</startNumber> 식이 더 자연스럽습니다.
fontRef/ratio/spacing/relSz/offset/... 모두 hangul/hanja/japanese/latin/other/symbol/user 7개 언어별 속성 — 바이너리의 배열 인덱스를 속성명으로 치환했습니다. 스키마 진화가 경직됩니다.
역공학 불친절 정황:
id가 문자열이지만 값은 사실상 u16 (0, 1, 2...) — 굳이 문자열 파싱
binaryItemIDRef="image1" 처럼 prefix+숫자 복합 — ID 해석기 별도 필요
raw_ctrl_data 같은 "바이너리 원본 보존" 필드가 HWP엔 있지만 HWPX엔 없음 → HWPX만 받은 구현자는 HWP로 거꾸로 복원 불가
"형식주의"보다 더 정확한 원인 진단
"형식주의"는 외형에 대한 묘사이고, 기술사적으로는 다음 셋이 섞였다고 봅니다:
시기적 한계: HWPX 초기 설계 시점(2010년대 초반)은 XML-first 설계와 바이너리-직역이 공존하던 과도기였습니다. JSON이 주류 되기 전이라 "확장성 = XML" 등식이 강했습니다.
OWPML 표준 추적의 부담: HWPX는 한국 국가 표준(KS X 6101) OWPML을 따르는 모양새를 취합니다. 표준화 위원회 결정이 섞이면서 "설계 일관성"보다 "정치적 합의"가 우선한 흔적이 남았습니다.
하위호환 짐: HWP 바이너리와 1:1 매핑 유지가 요구사항이었을 가능성이 큽니다. 그러면 XML 관용을 따를 자유 자체가 없었습니다. 그 결과가 "XML로 쓴 HWP 바이너리"라는 하이브리드입니다.
"역공학 방해 의도"에는 신중
의도적 난독화라기보다 방어적 설계의 부작용으로 보는 것이 실증적입니다:
의도적이라면 암호화·서명·난수 ID를 썼을 것입니다. 실제로는 평문 XML + 규칙적 ID
다만 결과적으로 후발주자가 같은 IR을 만들기 어려운 구조가 된 건 맞습니다
이것이 현장에서 느껴진 "구조적 장벽"의 실체 — 악의는 아니나 중립성·접근성 원칙은 분명히 위배
한 줄 요약
"형식주의"는 외형 묘사, "하이브리드 설계의 잔재"가 기술적 진단. 결과는 같음 — 후발주자에게 불친절한 포맷.
rhwp는 그 속에서 의미(IR)와 뼈대(XML)를 분리하여 전자만 진지하게 다루고 후자는 기계적으로 충족시키는 전략을 택했습니다. HWP IR이 HWPX IR보다 선명하므로, 시리얼라이저는 "IR → HWPX XML 장식"으로 보는 관점이 실용적입니다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
출발점: 현장에서 느낀 인상
관찰한 근거
rhwp에서
samples/hwpx폴더 전체를 감사한 결과, 이 직관을 뒷받침하는 증거들이 있었습니다.과잉 네임스페이스 (
hh:/hp:/hc:/hs:/opf:): 4개 네임스페이스로 쪼갠 실질적 이득이 없습니다. XML 설계 초창기 "네임스페이스는 모듈화의 해답"이라는 담론이 남긴 흔적입니다. 2007년 OOXML/ODF도 비슷한 과잉 분할을 했다가 실무에선 불편함만 남았습니다.표현 수단의 중복:
<hh:border>vs<hh:leftBorder>+<hh:rightBorder>+... — 같은 개념 두 번<hp:pos>속성 11개 +<hp:offset>별도 자식 — 좌표를 attr로도 child로도hp:sz와hp:curSz와hp:orgSz— 크기가 세 개hc:transMatrix/scaMatrix/rotMatrix6원소 행렬을 속성으로 박음 → 명백히 어색한 XML 사용이진 포맷 관성의 직역:
<hh:beginNum page="1" tbl="1" pic="1" equation="1" footnote="1" endnote="1">— HWP 바이너리의 BeginNumber 구조체를 그대로 XML 속성으로 옮긴 흔적. XML 관용이면<startNumber for="page">1</startNumber>식이 더 자연스럽습니다.fontRef/ratio/spacing/relSz/offset/...모두hangul/hanja/japanese/latin/other/symbol/user7개 언어별 속성 — 바이너리의 배열 인덱스를 속성명으로 치환했습니다. 스키마 진화가 경직됩니다.역공학 불친절 정황:
id가 문자열이지만 값은 사실상 u16 (0, 1, 2...) — 굳이 문자열 파싱binaryItemIDRef="image1"처럼 prefix+숫자 복합 — ID 해석기 별도 필요raw_ctrl_data같은 "바이너리 원본 보존" 필드가 HWP엔 있지만 HWPX엔 없음 → HWPX만 받은 구현자는 HWP로 거꾸로 복원 불가"형식주의"보다 더 정확한 원인 진단
"형식주의"는 외형에 대한 묘사이고, 기술사적으로는 다음 셋이 섞였다고 봅니다:
시기적 한계: HWPX 초기 설계 시점(2010년대 초반)은 XML-first 설계와 바이너리-직역이 공존하던 과도기였습니다. JSON이 주류 되기 전이라 "확장성 = XML" 등식이 강했습니다.
OWPML 표준 추적의 부담: HWPX는 한국 국가 표준(KS X 6101) OWPML을 따르는 모양새를 취합니다. 표준화 위원회 결정이 섞이면서 "설계 일관성"보다 "정치적 합의"가 우선한 흔적이 남았습니다.
하위호환 짐: HWP 바이너리와 1:1 매핑 유지가 요구사항이었을 가능성이 큽니다. 그러면 XML 관용을 따를 자유 자체가 없었습니다. 그 결과가 "XML로 쓴 HWP 바이너리"라는 하이브리드입니다.
"역공학 방해 의도"에는 신중
의도적 난독화라기보다 방어적 설계의 부작용으로 보는 것이 실증적입니다:
한 줄 요약
"형식주의"는 외형 묘사, "하이브리드 설계의 잔재"가 기술적 진단. 결과는 같음 — 후발주자에게 불친절한 포맷.
rhwp는 그 속에서 의미(IR)와 뼈대(XML)를 분리하여 전자만 진지하게 다루고 후자는 기계적으로 충족시키는 전략을 택했습니다. HWP IR이 HWPX IR보다 선명하므로, 시리얼라이저는 "IR → HWPX XML 장식"으로 보는 관점이 실용적입니다.
비슷한 관찰을 하신 분, 혹은 다른 진단을 가진 분들의 의견이 궁금합니다.
Beta Was this translation helpful? Give feedback.
All reactions