IT_Programming/Java

JDOM (The Java DOM)

JJun ™ 2010. 2. 2. 01:24
-----------------------------------------------------------------------------------
출처: http://kkhhss1012.springnote.com/pages/4655969#toc_3
-----------------------------------------------------------------------------------
 
1. JDOM이란 무엇인가?#

JDOM은 XML을 다루기(reading,writing,manipulating) 위해 자바 코드를 사용하여 만든 새로운 API이다. JDOM은 XML문서를 다루는 데 있어서 Java-oriented API를 사용하기 때문에 특별히 자바 프로그래머들을 위해 최적화되었다고 할 수 있다.

 

JDOM은 자바 개발자들에게 보다 직관적인 방법으로 XML을 핸들링하도록 하는 오픈 소스 API이다. JDOM은 그 이름처럼 자바를 기반으로 하여 만들어 졌으며, 자바의 속성을 그대로 가지고 있다. 또한 자바 라이브러리를 사용한다. 그렇기 때문에 자바를 잘 사용하고 XML을 핸들링 하고자 하는 사람들은 자바의 개념을 그대로 유지해가면서 XML개발을 좀더 쉽게, 그리고 그들에게 익숙한 방법으로 할 수 있는 것이다.

 

JDOM은 웹 컨소시움에서 표준으로 정의한 SAX와 DOM과도 상호연동 되지만, 이들보다는 더 간단하다. JDOM은 SAX와 DOM의 장점만을 골라 새로운 클래스와 인터페이스를 만들어서 JDOM 사용자들에게

제공할 것이다. JDOM은 DOM과 SAX로 만들어진 컴포넌트와 통신이 가능하다.

이것은 이미 DOM과 SAX로 만들어진 프로그램과의 호환을 가능하게 한다.

 

JDOM은 Apache프로젝트(예를 들어,Apache 서버에서 적용되었던)에서 사용하는 라이센스 모델을 따른다. 즉 JDOM은 소스가 공개되어 있으며, 최소한의 제약사항만을 가지고 JDOM을 사용할 수 있다.

 

그렇다면 JDOM이 추구하고자 하는 것은 무엇일까? 간단하게 두 가지로 요약될 수 있다.

첫번째는 보다 직접적으로 자바 프로그래머들에게 JDOM API를 사용하게 하는 것이다. 기존의 XML API들은 언어 독립적으로 설계되었다. 그렇기 때문에 특정 언어를 사용하는 개발자(예를 들어 자바나 C개발자들,..)들이 XML프로그래밍을 하는데 있어서 혼란이 있었다.

 

예를 들어

this is element

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

와 같은 엘리먼트가 있을 경우, XML API에서는, 컨텐츠를 컨텐츠가 포함된 엘리먼트의 child로 보기 때문에 다음과 같이 그 컨텐츠에 접근한다.

String  text = element.getFirstChild().getNodeValue();

 

그러나, JDOM은 보다 직접적으로 프로그래머가 원하는 방식으로 그 컨텐츠를 얻을 수 있다

String text = element.getText();

 

 

 

JDOM은 프로그래머의 작업을 수월하게 한다.

두번째는, JDOM은 빠르고 가볍다. 문서를 로딩하고 조작하는데 있어, JDOM은 그것을 빠르게,

그리고 메모리 사용도 최소화 하여 처리할 수 있다. 즉, DOM보다 빠르고 SAX 같은 속도를 가지는

SAX 보다 더 많은 API를 보유하고 있도록 구현되었다.

 

JDOM이 표준 API의 문제들을 해결하였다??

이미 XML 표준 API가 있는데 왜 JDOM을 써야 할까? 표준이라고 해서 완벽한 것은 아니다.

DOM은 XML문서를 완전히 메모리에 로드한 후 사용하며, XML을 다루는데 있어 필요한 모든 API를

포함하고 있다. 이러한 과도한 메모리 사용과 복잡한 프로세싱은, 웹 어플리케이션과 프로그램에 부담을

주게 된다. SAX는 XML문서를 메모리에 로드하여 사용하지 않는다. 그 대신에 순차적으로 이벤트를

발생시켜 XML문서를 프로세싱한다. 즉 시작 태그와 끝 태그를 만나는 모든 시점에 이벤트를 발생시킨다.

이러한 간단한 API를 가진 SAX는 그것의 빠른 수행속도로 인해 READ-ONLY프로그램에 적당하다.

그러나 이러한 SAX의 이벤트 모델은 Object Oriented 자바 개발자들에게 직관적이지 않으며, 문서를

조작하고, random access를 할 수 없는 단점을 가지고 있다. 그래서 JDOM은 DOM과 SAX의 장점만을

수용하여 구현하였다. 그래서 JDOM의 특성은 DOM이나 SAX 어느 하나에 가깝다고 말하기 어렵다.

JDOM은 도큐먼트 전체를 놓고 보면 random access가 가능하다. 그러나 놀랄만하게도....

그것을 메모리 전체에 로드하지 않는다. 즉 필요한 부분만 메모리에 로드한다.

JDOM은 2001년 4월에 Jason Hunter 와Brett McLaughlin라는 사람이 JDOM의 배타판을 발표했다.

현재 배타7까지 나와 있으며 조만간 JDOM1.0이 발표될 것이다. http://jdom.org에서 JDOM을 다운 받아

사용할 수 있다. 자바와 함께 XML을 사용하는 것은 정말 간단하다.

사용자는 JDK, 몇 개의 클래스 라이브러리, 텍스트 에디터만 있으면 된다.

Document Object Model (DOM)은 XML데이터를 조작하는 데 있어서는 굉장히 인기 있는 표준 API이다.

그러나 JDOM이 좀더 안정적으로 되면 자바 개발자들에게는 JDOM이 훨씬 편리한 API가 될 것이다.

 
2. W3C DOM과 다른점은?#

- DOM은 프로그래밍 언어에 독립적으로 설계되었다.

  그래서 자바면 자바, C처럼 특정한 언어를 사용하는 사용자에게는 매우 불편할 수도 있다.

 

- DOM은 자바 클래스 라이브러리를 매우 제한적으로 사용하며, 또한 많은 부분들이 자바 클래스 라이브러리

  와 중복된다. 한 예로, Java.util.Iterator를 사용하는 거 대신 NodeIterator를 새로 만들어서 사용한다.

 

- DOM의 일부 영역은 매우 엉성하게 디자인 되었다. Overloading 메서드는 모든 프로그래밍 언어가 그것을

  지원하지 않기 때문에(예를 들면, 자바스크립트), 잘 사용되지 않고 있다. 단 한 종류의 exception만이 있다.

 

- equals(), hashCode(), clone(), toString()같은 자바 유틸리티 메소드들이 전혀 정의되지 않았다

 
3. JDOM API#

- Org.jdom.Document에서 XML Document를 생성할 수 있다.

  다음과 같이 Document 클래스를 생성할 수 있다.

Document doc = new Document(new Element("RootElement"));

 

- builder를 사용하여 file, stream, url으로부터 도큐먼트 트리를 생성할 수 있다.

SAXBuilder builder = new SAXBuilder();

Document doc = builder.build(url);

 

builder는 org.jdom.input 패키지에서 포함되어 있으며, 아래의 두 가지 builder클래스가 있다.

public SAXBuilder(String parserClass, boolean validation);

public DOMBuilder(String adapterClass, boolean validation);

 

SAXBuilder는 파일로부터 읽어 들여 JDOM Document tree를 생성하고, SAX Parser를 사용한다. SAXBuilder는 SAX 이벤트를 발생시키면서 대응하는 도큐먼트를 메모리에 로드한다(그래서 빠르다). DOMBuilder는 org.w3c.dom.Document로부터 JDOM Document를 생성하기 위해 사용한다.

이 클래스는 이미 만들어진 dom로부터 JDOM tree를 생성할 때만 사용함을 주의해야 한다.

 

위의 두 파서는 디폴트로 XERCES parser를 사용하며, validation 은 “false”이다.

DOMBuilder는 constructor에서 adapterClass를 필요로 한다. 이는 모든 DOM 파서들이 같은 API를 따르고 있지 않기 때문이다. 그래서 JDOM은 다양한 파서들에 대해 같은 API를 사용하기 위해 adapter클래스를

사용하며, Xerces, Crimson, IBM's XML4J, Sun's Project X 등의 파서들에 대해 적용될 수 있다.

 

- XML의 출력

  XMLOutputter, SAXOutputter, DOMOutputter가 있는데, 주로 org.jdom.output.XMLOutputter를

  사용하는데, 이것은 XML을 원하는 OutputStream으로 보낸다.

 
4. Sample 설명#

BuilderTest.java : 간단한 builder 사용법, saxbuilder를 사용하여, xml 파일을 읽어 들여 루트 태그 이름을

                          바꾼 후, 그것을 파일에 출력한다. dombuilder를 사용하여 그 읽어들인 xml파일을

                          화면에 출력한다.

 

DOMBuilderDemo : dom tree를 사용하여 jdom을 생성

SAXBuilderDemo : sax2.0 parser를 사용하여 jdom build

 
5. 참고 사이트#

http://www.jdom.org

http://www.webreference.com

JDOM API DOCS