[Java] XML Parsing 방식(DOM, SAX 방식)
최근에 대용량 데이터 처리에 대한 업무 개선을 위해,
외부에서 받아서 처리하는 XML 데이터의 파싱 방식을 변경하는 작업을 진행했다.
XML 데이터를 파싱하는 대표적인 방식으로 DOM 방식과 SAX 방식이 있는데,
각각의 장단점과 방식을 변경한 이유에 대해 설명해보겠다.
1) XML 파싱(XML Parsing)
1-1) XML Parsing?
: XML(eXtensible Markup Language)은 데이터를 저장하고 전송하기 위한 표준화된 형식이고, XML 파싱은 이러한 XML 문서를 읽고 그 구조와 내용을 프로그램에서 사용할 수 있는 형태로 변환하는 과정이다.
1-2) XML 문서의 구조
: XML 문서의 구조를 아래 예시를 통해 알아보자.
XML 문서 예시
<?xml version="1.0" encoding="UTF-8"?>
<shop city="서울" type="마트">
<food>
<name>귤</name>
<sort>과일</sort>
<cost>3000</cost>
</food>
<food>
<name>상추</name>
<sort>야채</sort>
<cost>2000</cost>
</food>
</shop>
- 프롤로그: XML 선언과 문서 타입 정의를 포함
ex) <?xml version="1.0" encoding="UTF-8"?> - 루트 요소: 문서의 최상위 요소
ex) <shop city="서울" type="마트"> - 하위 요소: 루트 요소 아래에 중첩된 요소들
ex) <food> · · · </food> - 속성: 요소의 추가 정보를 제공하는 이름-값 쌍
ex) <name>귤</name> - 텍스트 콘텐츠: 요소 내부의 실제 데이터
2) DOM 방식(DOM Parser)
2-1) DOM 방식이란
: DOM(Document Object Model) 방식은 전체 XML 문서를 읽고 각 노드가 요소, 속성 또는 텍스트 조각을 나타내는 트리 구조의 객체로 표현하는 방식
2-2) DOM 방식 특징
- 트리 기반 파싱 방법
- 전체 문서를 메모리에 로드함
- 랜덤 액세스 가능
2-3) DOM 방식 장단점
3) SAX 방식(SAX Parser)
3-1) SAX 방식이란
: SAX(Simple API for XML) 방식은 문자열을 앞에서부터 차례로 읽어가면서 요소, 속성이 인식될 때 마다 이벤트를 발생시키고, 각각의 이벤트 발생에 대해 핸들러를 구현하는 방식
3-2) SAX 방식 특징
- 이벤트 기반 파싱 방법
- 문서를 순차적으로 처리함
- 메모리 효율적
3-3) SAX 방식 장단점
4) DOM vs SAX
: 위 내용들을 바탕으로 정리해본 각 파싱 방식의 특징 및 장단점이다.
5) 개선 방향
: 운영하고 있는 서비스는 대용량의 XML 데이터가 발생할 경우가 많고, 구조화를 하여 확장성이 좋은 코드 개발이 필요했다.
또한 XML 데이터를 읽고 수정을 하는 경우도 없었기 때문에 기존 DOM 방식에서 SAX 방식으로 개선을 하게 되었다.
6) 개선 결과(테스트)
: 아래는 DOM Parser -> SAX Parser 방식으로 변경한 뒤, 운영하는 서비스의 XML 데이터로 테스트해본 결과이다.
기존 DOM 방식과 SAX 방식을 각각 비교한 결과 속도 차이가 극명하게 차이나는 것은 아니였지만, 구조화를 한 것과 코드의 확장성을 고려한다면 충분한 개선점이 된 것 같다.
[reference]
https://bestjavacourseinchennai.wordpress.com/2018/10/23/difference-between-dom-and-sax-parsers-in-java/
https://www.tcpschool.com/xml/xml_basic_structure
https://blog.naver.com/kdi0373/220029180136