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를 사용하세요. 또는 office_oxide_cli를 stdio로 호출하는 사이드카 프로세스로 실행해도 됩니다. 동일한 엔진을 사용하면서 JVM 브리지 코드가 필요 없습니다.
Python 비교 치트시트
일반 텍스트
Tika (REST 모드)
import tika
from tika import parser
tika.initVM() # JVM startup; ~1-2s on first call
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, etc.
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 오버헤드 | 파일당 1ms 미만 |
성능 (Office 포맷만)
DOCX, XLSX, PPTX, DOC, XLS, PPT가 혼합된 100만 건의 Office 문서 인제스트를 tika-server와 비교한 결과:
| 파이프라인 | 실제 소요 시간 | 비고 |
|---|---|---|
| tika-server (REST), 워커 8개 | ~3 h 40 m | HTTP 오버헤드 포함 |
| tika-app (인프로세스 JVM), 워커 8개 | ~1 h 50 m | Tika 최선의 경우 |
| office_oxide, 워커 8개 | ~3 m | 네이티브 파싱 |
포맷 구성에 따라 수치가 달라지지만, 인제스트 중심의 Office 워크로드에서는 보통 30–60배 차이가 납니다.
관련 문서
- 성능 벤치마크 — 포맷별 전체 수치
- RAG를 위한 Office — Tika 대체 RAG 패턴
- MCP 서버 — 크로스 언어 파이프라인용 사이드카