Big XML파일을 읽을때 StAX를 사용하자

StAX(Streaming API for XML)는 자바 JDK 1.6부터 포함된 Parser API 입니다.
이전에 XML를 파싱하기 위해서는 아래와 같이 두가지 방식을 제공 했습니다.

(1) DOM 방식 :  문서 전체를 메모리에 읽어서 하나의 Tree 형태로 메모리로 읽어서 접근 (pull)
(2) SAX 방식 : 문서의 항목을 읽을때 마다 이벤트가 발생하여 데이터를 처리 한다 (push)

SAX는 메모리가 적고, 속도가 빠르다는 장점이 있지만 XML 엘리먼트를 하나하나
컨트롤해야 하며(생산성이 떨어짐) , XML 오브젝트에 Random Access를 하지 못하는 단점이 있음.
즉,  지난 엘리먼트를 참조 할경우 다시 처음 부터 reading을 해야 함

DOM은 SAX의 단점을 보완하지만 메모리 사용이 높다는 단점이 존재.

최근에는 JAXB(Java Architecture for XML Binding)를 많이 사용한다. JAXB는 XML to Object를
쌍방향 마샬링/언마샬링하는 API 입니다. 하지만 역시나 DOM과 비슷한 방식이기 때문에
메모리를 많이 사용하는 단점이 존재 합니다.

이러한 SAX , DOM의 장점을 보완한 새로운 파서 API 모델이 StAX 입니다.
StAX는 push 와 pull 방식을 동시에 제공하는 하이브리드한 형태 입니다.

xmlinput
(image from : http://docs.spring.io/spring-batch/trunk/reference/html/images/xmlinput.png)

XML 문서를 파싱할때 하나의 Fragment로 구분을 합니다. 즉 정해진 엘리먼트를 읽을때는
Dom 방식을 사용하며 Fragment로 처리하는 것은 SAX의 Push 방식을 사용하고 있습니다.
이건 마치 like JDBC Cursor 와 상당히 유사한 모델입니다.

Spring 같은 경우는 각 Fragment를 Object로 바인딩 하기 위해서 추상화를
제공 합니다.

oxm-fragments

(image from : http://docs.spring.io/spring-batch/trunk/reference/html/images/oxm-fragments.png)

그렇기 때문에 다양한 XML 파서 구현체를 선택 할 수 있습니다.
※ 개인적으로 Castor는 비추.. 2008년 이후 업데이트가 없으며 JAXB 보다 느림. 
또한 JAXB 보다 이전에 나온 모델

StAX 와 가장 잘맞는 조합은 JAXB 입니다. 즉 실제 파서는 JAXB를 사용하고
Reading 정책은 StAX 형식을 따르는 것입니다.

#Usecase

SAX :  XML이 복잡하지 않고, 메모리를 최소화 하면서 최대한 빠르 처리가 필요할때
DOM or JAXB : 메모리는 좀 소모 되지만 생산성, XML 오브젝트 핸드링, 성능이 필요할때
StAX : 속도는 JAXB보다 느리지만, 메모리 소모가 적은 경우.

SAX 같은 경우는 정말 대규모 요청이 들어오는 GW 서버
또는 안드로이드 같이 메모리 관리가 중요한 경우 사용을 하면 좋을 것 같고

JAXB 같은 경우도 SAX보다는 느리지만 결코 느리지 않기 때문에
비즈니스 로직이 주로 있는 웹 서비스에서 적합할듯 합니다.

StAX의 Usecase가 생각이 잘 나지 않았는데 최근에
진행하는 프로젝트에서 다수의 Big XML (2 GB) 파일을
Streaming 처리하는 경우가 있었는데 이때 사용을 하니
안정적으로 처리가 되었습니다.

특히나 Spring Batch를 사용할 경우 “StaxEventItemReader”를 지원 하는데
Fragment 단위로 나눠서 Hadoop에 저장을 합니다.
그 다음 Framgment를 읽을 경우 GC를 하기 때문에 Big XML을
읽어도 메모리에 부담 없이 처리가 가능 합니다.

혹시나 앞으로 저처럼 Big XML을 read할 경우 StAX를
꼭 한번 고려해 보셨으면 합니다.

추후 기회가 되면 Big CSV, Big DB Row를 배치로 처리하는
내용을 포스팅 하도록 하겠습니다.

참고 사이트

http://narenravi.blogspot.kr/2012/03/xml-parsers-performance-analysis-in.html
http://dyutiman.wordpress.com/2010/08/27/xml-stax-parser-in-java/

댓글 남기기