Search
👍

OOXML 버전 관리 도구 oogit 개발기

간단소개
초간단 .pptx, .docx, .xlsx 버전 관리 툴 개발기!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Scrap
태그
9 more properties

OOXML

.pptx, .docx, .xlsx 등의 문서 파일 포맷이 Office Open XML이라는 포맷입니다.
마이크로소프트에서 개발한 개방형 표준 포맷으로, 사실 zip 파일입니다.

기본 아이디어

Git이나 SVN 등에 pptx, docx, xlsx 등의 파일을 그대로 올려도 버전 관리를 할 수는 있습니다.
하지만 이렇게 할 경우 바이너리 파일이기 때문에 내부적으로는 비효율적으로 저장됩니다.
압축을 풀어서 관리한다면 압축된 상태로 저장하는 것보다는 효율적으로 저장될 것입니다.
사실 SVN으로 7년쯤 전에 간단히 만들어 본 적이 있으나, XML을 정렬해서인지 잘 동작하지 않았습니다.

oogit

oogit은 pptx, docx, xlsx 등의 OOXML 파일을 git 저장소에서 쉽게 checkout/update할 수 있게 해 주는 cli 툴입니다.
oogit
basic-examples
POSIX 시스템에서는 zip/unzip이 있다면 그냥 사용할 수 있고, Windows 환경에서는 Git Bash 사용이 권장됩니다.
사용법도 간단합니다. 아직 개발 중이라 사용법이 나중에 바뀔 수도 있지만, 일단은 이렇습니다.
# 처음에 git 저장소에 올릴 때 oogit init MyFile.pptx https://github.com/my/repository.git branch-name # 또는 이미 git으로 관리되고 있던 경우 oogit checkout MyFile.pptx https://github.com/my/repository.git branch-name # ============================================================================== # 파일을 수정한 후, git 저장소에 동기화할 때 oogit commit MyFile.pptx # 뭔가 잘못 됐다! 예전 버전의 파일을 되찾고 싶을 때 oogit checkout MyBackup.pptx https://github.com/my/repository.git "<commit-hash>"
Shell
복사

개발 과정

처음에는 Node.js + TypeScript를 사용하려고 했습니다.
git과 상호작용을 많이 해야 하기 때문에, 두가지 옵션 중 하나를 선택해야 했습니다.
1.
child process를 spawn한다. 매우 귀찮음
2.
es-git 등의 라이브러리를 사용한다.
개인적으로 이거 말고도 할 게 많기 때문에, 개발 편의성을 최우선으로 생각한 결과 2번 옵션을 선택했습니다.
대충 다음의 라이브러리들을 사용하려고 했습니다.
adm-zip - Node.js ZIP 구현체
commander - 커맨드라인 인자 파서
es-git - git을 편하게 쓸 수 있게 해 주는 라이브러리
typia - 런타임 스키마 valdiator
… 그리고 typescript, esbuild, unplugin-typia, rimraf 등의 수많은 빌드 디펜던시…
그런데 문제가 좀 생겼습니다.
AI가 라이브러리의 사용법을 잘 모른다. 이 쉬운 걸 굳이 내가 다 해?
그리고 사용자가 Node.js를 사용해야 한다거나 하는 사소한 이슈들…

Bash로 전환

사실 zip은 웬만하면 다 있는 zip/unzip 커맨드를 사용하면 되고, Windows는 기본으로 지원합니다.
bash를 쓰면 인자 파싱은 좀 귀찮지만 어쩄든 가능은 하고, git과의 상호작용이 매우 간단해집니다.
무엇보다, 별도의 라이브러리를 쓰지 않고, AI가 bash의 문법은 아주 잘 알고 있기 때문에 제가 할 일이 줄어든다는 점이 가장 컸습니다.
Node.js, TypeScript로 몇 시간 깔짝대다 일부 기능만 구현하고 너무 불편해서 bash로 갈아탄지 약 3시간만에 기본 기능을 모두 완성했습니다. (사실 더 빠를 수도 있었는데, 제가 bash에 익숙하지 않아서…)

이후 계획

oogit으로 버전을 관리하게 되면 버전 관리를 위한 메타데이터 파일이 하나 생깁니다.
지금은 oogit을 사용할 때마다 매번 repository를 새로 clone하게 돼 있지만, 메타데이터와 같이 git repository를 저장해두고 재사용한다면 대역폭 낭비를 최소화할 수 있을 것입니다.
물론 이것도 제가 아니라 Codex같은 AI에게 시킬 계획입니다.

교훈

사실 누구나 알고 있을 만 한 당연한 사실이지만,
적절한 도구를 사용하자. AI가 잘 한다면 더 좋다.
다시 한 번 굳이 몸소 깨달을 수 있는 시간이었습니다.

여담

es-git, typia를 AI가 특히 못 했는데, llms.txt가 없어서 사용법을 알려주는 것도 여의치 않았습니다.
사실 llms.txt가 있었다면 타입스크립트로 더 개고생했을지도…
라이브러리를 만들게 된다면 llms.txt를 꼭 같이 만들어두도록 합시다!