피드로 돌아가기
I wrote my third XML parser. Here's why this one was different.
Dev.toDev.to
Backend

2GB 규모 XML의 부분 추출을 위한 Streaming-first Parser 설계

I wrote my third XML parser. Here's why this one was different.

Paul2026년 4월 26일9intermediate

Context

수십만 개의 레코드를 포함한 대규모 XML 피드 처리 시 기존 Binder 기반 라이브러리의 전체 트리 메모리 로드 방식에 따른 리소스 고갈 문제 발생. 특히 불필요한 필드까지 모두 정의해야 하는 데이터 바인딩 구조로 인해 대용량 스트리밍 처리 효율성 저하.

Technical Solution

  • Binder 모델을 탈피하여 특정 경로의 데이터만 추출하는 Extraction 모델로 설계 변경
  • KSP(Kotlin Symbol Processing) 및 APT를 통한 컴파일 타임 코드 생성으로 런타임 오버헤드 제거
  • XPath 기반의 경로 지정 방식을 도입하여 문서 전체 구조 정의 없이 필요한 필드만 선택적 매핑
  • Memory-efficient Streaming 구현을 통해 전체 문서를 버퍼링하지 않고 순차 처리하는 구조 채택
  • Kotlin DSL의 Java 호환성 문제를 해결하기 위해 공통 Annotation 기반의 멀티 런타임 아키텍처 설계
  • Encoding 기능을 과감히 제거하고 Decoding 전용으로 한정하여 Streaming 성능 최적화 달성

- 대용량 XML 처리 시 Full-tree Deserialization 대신 Streaming-based Extraction 검토 - 도메인 모델이 외부 스키마와 일치하지 않을 경우 전체 바인딩보다 부분 추출 방식 적용 - 다국어 환경(Java/Kotlin) 지원 시 DSL 기반 설계보다 Annotation Processor 기반의 코드 생성 방식 고려 - 쓰기(Encoding)와 읽기(Decoding)의 책임 분리를 통한 라이브러리 복잡도 감소 및 성능 향상 도모

원문 읽기