Apache Tika에서 마이그레이션
Apache Tika는 DOCX, XLSX, PPTX와 레거시 DOC, XLS, PPT를 포함한 방대한 파일 포맷에서 텍스트를 추출하는 사실상의 JVM 표준 라이브러리입니다. 파이프라인이 Office 문서 전용이라면 Office Oxide가 올바른 교체재입니다: 같은 6개 포맷, JVM 불필요, 네이티브 속도, 더 단순한 배포.
언제 마이그레이션할까
다음 중 하나라도 해당하면 전환하세요:
- 인제스트 파이프라인이 Office 문서만 다룸(Tika가 함께 지원하는 PDF, EPUB, RTF, ODT 등 불필요)
- 컨테이너 / Lambda / 데스크톱 앱에 JVM을 번들하고 튜닝하기 싫음
- Java JAR뿐만 아니라 Python, Node.js, Go, C#, Rust의 네이티브 바인딩이 필요
- 파일별 레이턴시가 중요함; Tika의 시작 비용과 JVM 웜업은 수명 짧은 워커에 타격
- LLM과 RAG 파이프라인을 위한 구조화된 Markdown / IR 출력 원함
Tika에 남는 게 나은 경우:
- Office Oxide가 커버하지 않는 롱테일 포맷을 인제스트(Tika는 약 1,400개 타입 처리)
- 이미 JVM 인제스트 서비스가 있고, 네이티브 바인딩을 더하려고 아키텍처를 바꿀 만한 가치가 없음
- 그 롱테일 전역에 걸친 Tika의 MIME 탐지에 의존
흔한 절충안: 롱테일은 Tika에 두고, .docx / .xlsx / .pptx / .doc / .xls / .ppt(대부분의 엔터프라이즈 코퍼스에서 물량을 장악)는 Office Oxide로.
설치
Python
pip install office-oxide
(tika 또는 apache-tika Python 래퍼와 그 위에서 돌리던 JVM을 대체합니다.)
Rust
[dependencies]
office_oxide = "0.1.0"
Java
JVM에 진심이라면 C FFI와 JNA / JNR-FFI로 Office Oxide를 사용하세요. 또는 stdio로 호출되는 사이드카 프로세스로 office_oxide_cli를 실행하세요 — 같은 엔진, JVM 브리지 코드 없음.
비교 치트시트 — Python
일반 텍스트
Tika(REST 모드)
import tika
from tika import parser
tika.initVM() # JVM 시작; 첫 호출 시 ~1-2s
parsed = parser.from_file("report.docx")
text = parsed["content"]
metadata = parsed["metadata"]
office_oxide
from office_oxide import Document
with Document.open("report.docx") as doc:
text = doc.plain_text()
props = doc.as_docx().core_properties() # author, modified 등
JVM 시작 없음, REST 왕복 없음, 밀리초 미만 추출.
바이트 입력(임시 파일 없이)
Tika
import io, requests
from tika import parser
data = requests.get(url).content
parsed = parser.from_buffer(io.BytesIO(data))
office_oxide
import requests
from office_oxide import Document
data = requests.get(url).content
with Document.from_bytes(data, "docx") as doc:
print(doc.plain_text())
서버 / 배치 처리
Tika — 보통 HTTP 뒤에서 tika-server 모드로 실행.
java -jar tika-server.jar -h 0.0.0.0 -p 9998
import requests
text = requests.put("http://localhost:9998/tika",
data=open("report.docx", "rb"),
headers={"Accept": "text/plain"}).text
office_oxide — JVM과 서버를 버리고 라이브러리를 직접 호출. 사이드카 아키텍처(언어 독립 클라이언트)가 필요하면 MCP 서버 또는 stdio로 호출하는 CLI를 사용하세요.
비교 — JVM 사용자용
파이프라인이 Java/Kotlin/Scala이고 JVM을 버리고 싶지 않다면:
- Office가 아닌 모든 것은 Tika에 맡기세요.
- Office 포맷에는
office-oxide를 호출하세요. 두 가지 옵션:- JNA / JNR-FFI로
liboffice_oxide와 C 헤더include/office_oxide_c/office_oxide.h를 호출. Go와 C# 바인딩이 쓰는 것과 같은 C API. ProcessBuilder로office_oxide_cli사이드카. stdin으로 입력을 스트림하고 stdout으로 출력을 읽음. 재시작이 간단하고 크래시를 격리.
- JNA / JNR-FFI로
둘 다 Office 포맷에 Tika를 돌리는 것보다 빠르며 — JVM 위에 JVM이라는 기묘한 구성을 피합니다.
Tika 대비 얻는 것
| Tika | Office Oxide | |
|---|---|---|
| DOCX, XLSX, PPTX | ✓ | ✓ |
| 레거시 DOC, XLS, PPT | ✓ | ✓ |
| PDF, EPUB, RTF, ODT 등 | ✓ | ✗(PDF는 pdf_oxide 사용) |
| 일반 텍스트 추출 | ✓ | ✓ |
| Markdown 출력 | 부분 | ✓(내장 to_markdown) |
| 구조화된 IR / JSON | XHTML SAX 이벤트 | ✓(타입 지정된 DocumentIR) |
| 찾기·바꾸기 템플릿화 | ✗ | ✓(EditableDocument) |
| 셀 쓰기(XLSX) | ✗ | ✓(set_cell) |
| 레거시 → 최신 변환 | ✗ | ✓(save_as) |
| JVM 필요 | ✓ | ✗ |
| 네이티브 속도 | JVM 오버헤드 | 파일당 <1 ms |
성능(Office 포맷만)
백만 Office 문서 인제스트(DOCX, XLSX, PPTX, DOC, XLS, PPT 혼합)를 tika-server와 비교:
| 파이프라인 | 벽시계 시간 | 비고 |
|---|---|---|
| tika-server(REST), 워커 8개 | ~3 h 40 m | HTTP 오버헤드 포함 |
| tika-app(in-process JVM), 워커 8개 | ~1 h 50 m | Tika 베스트 케이스 |
| office_oxide, 워커 8개 | ~3 m | 네이티브 파싱 |
수치는 포맷 조합에 따라 달라집니다; 인제스트 위주 Office 워크로드에선 보통 30–60배 차이입니다.
관련 항목
- 성능 벤치마크 — 포맷별 전체 수치
- RAG를 위한 Office — Tika 교체용 RAG 패턴
- MCP 서버 — 교차 언어 파이프라인용 사이드카