작성일 : 2001년 12월 18일 “Jingle bells, jingle bells Jingle all the way~” 크리스마스 케롤, 눈사람, 자선남비의 계절이 우리 앞으로 성큼 다가왔습니다. 산 중턱에 자리잡은 카페에서 차를 마시면서 산아래로 떨어지는 눈을 본 적이 있나요? 눈이 기다려지는군요. 겨울의 황홀함과 겨울의 온정과 겨울의 열정을 모아모아 우리 모두 12월을 힘차게 시작할까요? 물론 JDOM과 함께. 무언가를 시작한다는 것은 두렵고도 설레이는 일입니다. 지난호에 마소 독자들과 설레이는 첫 만남을 가졌었는데 JDOM의 개념을 잡는데 도움이 되었는지 궁금합니다. 일단 이번호에서 다룰 JDOM프로그래밍을 위해 간단히 지난호의 내용을 정리하겠습니다. JDOM이란 XML 문서를 읽고, 쓰고, 조작하기 위해 자바 코드를 사용하여 만든 DOM, SAX와 구별되는 새로운 API입니다. 자바 코드를 사용하였기 때문에 자바 개발자들이 쉽게 이용할 수 있으며, XML문서를 빠르게 다루기 위해 경량의 API를 사용합니다. 또한 기존의 API인 DOM, SAX와도 연동될 수 있습니다. JDOM은 org.jdom, org.jdom.input, org.jdom.output, org.jdom.adapters, org.jdom.transform 다섯개의 패키지로 구성되어 있는데, 이번호에서는 이 패키지들을 토대로 하여 기본적이면서도 반드시 필요한 JDOM프로그램들을 어떻게 만드는지에 대해 알아보도록 하겠습니다. 이 프로그램들은 릴리즈 된 JDOM의 베타7버전에 기반하였음을 알아두시기 바랍니다. 그럼 JDOM프로그래밍을 시작해 볼까요? 그러자면 JDOM을 먼저 여러분의 PC에 설치해야겠지요? JDOM의 설치는 어떻게? 기본적으로 JDK가 설치되어 있어야 하며, 되도록이면 1.2이상의 버전을 설치 합니다. 설치 과정은 윈도우 시스템을 위주로 설명하겠습니다. 자세한 내용에 대하여서는 JDOM의 웹사이트를 참고하거나 JDOM을 다운받고 압축은 푼후 readme.txt를 참고 하기를 바랍니다. 1. JDOM download 우선 http://jdom.org JDOM의 웹사이트를 방문합니다. 오른쪽의 “Downloads”메뉴 바로 아래에 “Binaries”와 “Source”라는 하위 메뉴가 있습니다. “Source” Download는 JDOM의 소스 코드를 제공하고 있으며, “Binaries” Download는 JDOM의 모든 jar archive 파일을 제공하고 있습니다. 일단 소스 코드와 빌딩 툴을 제공하는 “Binaries” Download를 이용하도록 하겠습니다. Binaries 메뉴를 클릭하여 최신버전(JDOM Beta 7)을 다운로드하여 여러분의 파일 시스템에 저장합니다. 2. 압축 풀기 다운로드 한 파일의 압축을 풀도록 합니다(설명을 위해 D드라이브에 압축을 풀었다고 가정합니다). 압축을 풀면 jdom-b7이라는 디렉토리가 만들어지며, 이 디렉토리는 build, etc, lib, 등등 여러 하위 디렉토리를 포함하고 있습니다. 3. Build JDOM JDOM의 빌딩 시스템은 자바 빌딩 툴(Java building tool)인 자카르타 Ant에 기반하였습니다. JDOM의 설치는 이 빌딩 툴이 자동으로 해줄 것입니다. 여러분이 해주어야 할 것은 시스템 환경변수 ”JAVA_HOME”의 값을 여러분이 설치한 JDK의 루트 디렉토리로 매치 시켜 주어야 하는 것입니다. 다음과 같이 할 수도 있으며,
필자(의 OS는 윈도우2000서버임)처럼, 제어판-시스템-환경변수에서 그 설정을 할 수도 있습니다. 시스템 환경 변수에 “JAVA_HOME”을 설정해 주고 나서, JDOM압축을 푼 디렉토리에 build.xml와 build.bat파일이 있는지 확인합니다. build.bat은 build.xml이라는 파일에 포함된 정보를 참조하기 때문에 build.xml과 build.bat은 반드시 한 디렉토리에 존재하여야 합니다. 자 그러면 도스창을 열어서 .\build.bat을 실행합니다(화면2). 빌드가 성공적으로 되면 “build successful”이라는 메시지가 나옵니다. 자, 이제 설치가 되었나요? 만약 설치가 제대로 되지 않았으면, JDOM배포판의 문서를 활용하거나 JDOM웹사이트의 FAQ를 참고하시기 바랍니다. 4. Classpath에 등록 마지막으로 여러분이 만들 JDOM프로그램의 컴파일을 위해 D:\jdom-b7\build\jdom.jar, D:\jdom-b7\lib\jaxp.jar, D:\jdom-b7\lib\xerces.jar, D:\jdom-b7\lib\xalan.jar, D:\jdom-b7\lib\crimson.jar를 CLASSPATH에 등록하여 줍니다. 이제 JDOM프로그램을 만들기 위한 준비가 되었습니다. 자, 그럼 JDOM을 이용하여 간단한 XML문서를 생성하는 HelloJDOM프로그램을 만들어 보겠습니다. 우선 JDOM API파일(D:\jdom-b7(JDOM설치 루트 디렉토리)\build\apidocs\index.html)을 열어 놓고 시작하는 것이 프로그램을 만드는데 훨씬 수월할 것입니다. HelloJDOM 다음의 XML문서를 생성하여 출력하는 프로그램을 만들어 보겠습니다.
org.jdom 패키지는 JDOM의 중요 패키지로서, Document, Element, Doctype, Namespace, Attribute와 같은 XML문서 혹은 그 일부를 표현하기 위해 필요한 JDOM의 주요 컴포넌트 클래스들을 포함하고 있습니다. 여기서 Document 객체는 XML document를, Elememt 객체는 XML element를, Attribute객체는 XML attribute를 나타내는 것이지요. JDOM은 인터페이스가 아닌 클래스 API입니다. 이것은 Document, Element, Attribute, Comment등이 모두 클래스이며 new 키워드를 사용하여 그 객체를 얻을 수 있다는 것을 말합니다. 또한 새로운 요소를 생성할 때 복잡한 팩토리를 사용하지 않아도 된다는 잇점을 제공하지요. 그래서 새로운 JDOM 문서는 다음과 같은 방법으로 만들어질 수 있습니다.
이 코드는 루트 요소로 “startOfJdom”이라는Element를 가지는 새로운 JDOM Document객체를 생성하도록 합니다. 루트 Element에 “Hello JDOM!!”이라는 텍스트를 추가하는 것은 다음과 같은 방법으로 할 수 있습니다
setText()라는 메소드가 엘러먼트(el)에 텍스트 값(Hello JDOM!!)을 세팅하는데 사용되었습니다. 이제 간단한 XML 문서를 만들었으니 이것을 도스창에 출력하는 방법에 대해 알아보겠습니다. 우선 문서의 출력을 위해서는 org.jdom.output 패키지에 포함된 DOMOutputter, SAXOutputter, XMLOutputter 클래스를 사용할 수 있습니다. 이 클래스들은 각각 JDOM트리를 DOM 트리로 출력하는 기능, JDOM 트리로부터 SAX2 이벤트를 발생할 수 있는 기능, JDOM트리를 표준 XML데이터로 출력하는 기능을 제공합니다. 이 중 XMLOutputter 클래스는 JDOM 트리를 파일, 스트림, 혹은 다른 방식으로 출력하는 것이 가능하기 때문에, XMLOutputter 클래스를 사용하도록 하겠습니다. XMLOutputter 인스턴스를 만든 후, XMLOutputter클래스의 output메소드를 사용해, 이미 만든JDOM XML문서를 시스템 화면에 출력하도록 하는 코드는 다음과 같습니다.
완성된 코드는 다음과 같습니다.
이 프로그램에 대한 출력 결과는 다음과 같습니다.
지금까지 아주 간단한 XML문서를 만들어서 출력하는 JDOM프로그램을 만들어 보았습니다. 그럼 좀더 복잡한 JDOM문서를 만드는 프로그램을 만들어 볼까요? 아무래도 실제적으로는 복잡한 문서를 만들 경우가 많을테니까요. 좀더 복잡한 JDOM문서 만들기 1. 우선 샘플 XML문서를 만들어 봅니다. HelloJDOM프로그램처럼, 이 XML문서를 JDOM 클래스를 사용하여 Document로 생성하는 프로그램을 만들도록 하겠습니다.
2. 우선적으로 만들어야 할 것이 JDOM Document이지요. JDOM Document와 루트 엘리먼트를 만들고, 루트 엘리먼트를 JDOM Document에 추가하도록 합니다.
3. 루트 엘리먼트를 만들었으면 ‘id’라는 어트리뷰트와 어트리뷰트 값을 루트 엘리먼트에 추가합니다.
4. 위의 샘플 XML문서의 “Description of computer” 커멘트를 루트 엘리먼트에 추가하도록 합니다
5. “hdd”라는 루트 엘리먼트에 포함되는 하위 엘리먼트를 만들어서 루트 엘리먼트에 추가합니다.
Element객체의 addContent()메소드는 Element 타입을 파라메터로 받고 Element타입을 리턴합니다. 그래서 다음과 같이 만들 수도 있습니다.
6. 루트 엘리먼트에 포함되는 나머지 서브 엘리먼트를 만들어서 루트 엘리먼트에 추가하도록 합니다. 이것은 앞의 5번 중 두번째 방식으로 하도록 합니다.
7. 이제 앞의 샘플 XML문서를 JDOM문서로 모두 표현한 것 같습니다. 이미 만들어진 JDOM문서 중, 어떻게 어떤 특정 엘리먼트에 접근하는지 알아볼까요? 루트 엘리먼트의 자식 엘리먼트에 접근하는 것은 다음과 같은 방법으로 할 수 있습니다. 이것은 computerElement가 가지고 있는 자식 엘리먼트중 “hdd”라는 이름을 가지는 첫번째 엘리먼트를 리턴합니다. 보통, 이름을 사용하여 자식엘리먼트를 구하고자 할 경우, getChild()메소드를 사용하고, 특정 엘리먼트에 포함된 모든 자식 엘리먼트를 구하고자 할 경우에는 getChildren()메소드를 사용합니다.
8. 특정 엘리먼트에 접근하는 것과 비슷한 방식으로 특정 엘리먼트를 지울 수도 있습니다.
이것은 루트 엘리먼트에 포함된 “year”라는 이름을 가지는 엘리먼트를 지우도록 합니다. 9. 그럼 어떤 특정 엘리먼트의 값은 어떻게 수정할 수 있을까요? 다음의 코드는 앞에서 만든 hdd 엘리먼트의 텍스트 값을 “4GB”에서 “20GB”로 바꾸도록 합니다.
10. 자 이렇게 XML문서를 만들고 수정한 결과 문서를 파일에 출력 하도록 하겠습니다. 문서의 출력은 HelloJDOM예제와 마찬가지로 XMLOutputter클래스를 사용하도록 하겠습니다. XMLOutputter클래스를 사용하면 indent, newline, 출력 포맷에 대한 옵션을 줄 수 있습니다. 아래의 XMLOutputter클래스는 문서를 출력함에 있어서 부모 엘리먼트와 자식 엘리먼트의 indent로 “ “스페이스 하나를 주고, 엘리먼트들 사이를 newline으로 구별하기로 한다는 것이지요. XMLOutputter클래스는 Writer나 OutputStream으로 그 출력 타겟(target)을 결정할 수가 있는데 여기서는 파일(computer.xml)로 출력하도록 하였습니다.
11. 이 모든 코드를 모으면 다음(JDOMWorld.java)과 같습니다.
JDOMWorld.java를 컴파일(d:\ javac JDOMWorld.java)한 후 실행(java JDOMWorld)하면 newFile.xml이라는 xml파일이 만들어지고 이 파일을 웹 브라우저에서 열어보면, 화면은 다음과 같습니다(화면3). 그런데 한글이 포함되어 있는 문서는 어떻게 처리할까요? 기본적으로는 별 문제가 없습니다. JDOM Encoding XMLOutputter클래스를 사용하여 출력 할 때 encoding에 대한 정보를 넣어 줄 수 있는데, 두 가지 방식이 있습니다. 첫번째는 public XMLOutputter(String indent, boolean newlines, String encoding) 이라는, 생성 할때 세 개의 파라메터를 가지는 XMLOutputter 클래스를 사용하여, 세번째 파라메터에서 출력 할때 원하는 인코딩을 설정해 주는 방식입니다. 이 경우는 XMLOutputter 클래스를 indent, newline 옵션과 encoding정보를 함께 주어 생성하고자 할 때 사용됩니다. 두번째는 XMLOutputter가 가지고 있는 메소드 중 “setEncoding()”이라는 것을 사용하여 지정해 주는 것입니다. XMLOutputter클래스를 첫번째 방식대로 생성하는 경우가 아니라면 XMLOutputter클래스의 나머지 생성자들은 encoding을 디폴트로 “utf-8”로 설정합니다. 그렇기 때문에 “utf-8”이외의 인코딩을 원할 경우에는 ‘setEncoding()’이라는 메소드를 사용하여 출력시의 encoding을 지정해 줍니다. 그래서 한글로 작성된 문서를 출력하고자 할 경우에는 이런 두가지 방식으로 한글 지원encoding을 설정할 수 있습니다. 보통은 “euc-kr”으로 해줍니다. 그렇다면 한글을 포함하고 있는 다음의 문서를 시스템 화면에 그대로 출력하는 프로그램(리스트1)을 앞에서 설명했던 ‘setEncoding()’메소드를 사용하여 만들어 보겠습니다.
<리스트1> HelloJDOM.java 무지하게 간단하죠? 그러나 기본적으로 디폴트 인코딩이 “utf-8”이기 때문에 모든 언어들을 지원할 수 있습니다. 자, 그럼 마지막으로 JDOM에서의 XSLT변환에 관해 알아보겠습니다. 일반적으로 XML에 기반한 웹 프로그래밍의 플로우는 XML문서를 만들고>수정하고>그것에 이쁜 스타일시트를 적용하여 웹 브라우저에 출력하는 것이죠. 그렇기 때문에 XML문서에 대한 XSLT변환부분은 반드시 필요한 부분이죠. JDOM에서의 XSLT변환 JDOM Document에 대한 XSLT변환을 어떻게 하는지 궁금한 분들이 많을 것입니다. 과연 함께 쓸수 있는지…그러나 저번호에서 JDOM API에서 제공되는org.jdom.transform 패키지에 대한 언급을 하였었죠? 이 패키지는 XSLT변환에 관한 기능을 제공하고 있다고 말씀을 드렸었지요. 대충 감이 오시나요? 이 패키지에 포함된 클래스를 사용하여 JDOM문서에 대한 XSLT변환을 함께 할 수 있습니다. 그럼 한글 문서를 표현하는HelloJDOM예제를XSLT변환하여 html파일로 저장하는 프로그램을 만들어보겠습니다.
1. 다음의 메소드는 JDOM Document에 XSL Transformation을 적용한 결과를 JDOM Document로 받아 리턴하는 것에 관한 것입니다. 이 메소드는 JDOM Document와 적용할 XSL 파일을 파라메터로 받아 그 변환된 결과를 JDOM Document로 리턴합니다. 우선 소스문서에 스타일시트를 적용하여 Transformation을 실행할 JAXP(JAXP의 TrAX부분)의 Transformer를 생성합니다. JDOMSource클래스는 Transformation의 인풋으로 사용할 Document를 담고 있으며, JDOMResult클래스는 org.jdom.transform에 포함된 클래스로 XSLT변환 후의 결과를 담을 것입니다. Transformer 는 이미 생성한 JDOM Document Source에 스타일시트를 적용하여 그 결과를 JDOMResult객체로 보냅니다.
2. 앞의 메소드를 구현하기 위해서는 물론 JAXP 클래스들이 임포트 되어야 하겠지요? JAXP클래스들을 임포트한 완성된 프로그램은 (리스트2)와 같으며, 적용할 XSL파일은 (리스트 3)와 같습니다.
<리스트2> HelloJDOMXsl.java
<리스트 3>NewFileXsl.xsl
3. HelloJDOMXsl.java를 컴파일하고 실행하면 newFile.html이라는 파일이 만들어질 것이고, 이 html파일을 브라우저에서 열면 (화면4)와 같습니다. 아주 간단하죠? JDOM의 Transformation관한 것은 JAXP의 TrAX에 기반하고 있고, 별도의 패키지를 통해 그것을 지원하고 있습니다. 아직 디버깅이라든지 약간 복잡한 xsl문서를 적용하기에는 불편한 점이 있긴 하지만 사용하는 데에는 어렵지 않습니다. JDOM프로그래밍은 무지 간단하다!! 지금까지 시작하는 JDOM프로그래머들을 위해 HelloJDOM프로그램과, XML을 생성하는 좀더 복잡한 JDOMWorld프로그램, XSLT변환 프로그램, JDOM에서의 한글 처리 방법에 대해 알아 보았습니다. 어떠셨나요? 도움이 되었나요? JDOM을 이제 막 접하시는 분들이 JDOM의 개념을 잡고 실제로 어떻게 이용할 수 있는지 도움이 되었기를 바라면서 아쉬운 작별을 해야겠습니다. 2001년의 마지막 달인 12월입니다. 한해를 정리하고 다가오는 2002년을 설계하면서 뜻깊은 한달을 보내기를 바랍니다. Happy New Year~~. |
2007년 12월 6일 목요일
JDOM 프로그래밍..
피드 구독하기:
댓글 (Atom)
JDOM엑 관한 글을 찾다가 들어오게 됐는데 너무 정리가 잘 돼 있어서 큰 도움이 됐네요...^^
답글삭제감사합니다.~ ^^