피드로 돌아가기
Dev.toBackend
원문 읽기
2GB 규모 XML의 부분 추출을 위한 Streaming-first Parser 설계
I wrote my third XML parser. Here's why this one was different.
AI 요약
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)의 책임 분리를 통한 라이브러리 복잡도 감소 및 성능 향상 도모