Skip to content

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-FFIliboffice_oxide와 C 헤더 include/office_oxide_c/office_oxide.h를 호출. Go와 C# 바인딩이 쓰는 것과 같은 C API.
    • ProcessBuilderoffice_oxide_cli 사이드카. stdin으로 입력을 스트림하고 stdout으로 출력을 읽음. 재시작이 간단하고 크래시를 격리.

둘 다 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배 차이입니다.

관련 항목