2007년 12월 14일 금요일

[펌] 자바(Java)라... 그 역겨움이란...


OKJSP(http://okjsp.pe.kr/seq/108722)에 갔다가.. 좋은 글이 있길래 퍼왔습니다..

어느 정도 공감가는 글이고.. Java 개발자라면 한번 쯤은 읽어봐야 하지 않나 싶습니다..

그러나 이 분이 말하는 그 단점만 있는것은 아니고 잘짜여진 MVC모델은 좋은 퍼포먼스를 낸다고 생각합니다..

한번 쭉 읽어보시길...


more..

2007년 12월 13일 목요일

[MS-SQL] 조건에 따라 Insert 와 Update..

MS-SQL에서 IF문을 이용해 name이란 값을 받아서,

name에 해당하는 날짜에 값이 있으면 Update 없으면 Insert 한다.


[code type=sql] IF (select count(cnt)
     from t_count
     where convert(char(10), getdate(), 120) = regdate
     and pageName='name'
   ) > 0

   BEGIN
        update t_count set pagecnt = pagecnt+1 where pageName='name'
    END

   ELSE
     BEGIN
        insert into t_count values(convert(char(10), getdate(), 120), 'name', 1)     
    END[/code]

2007년 12월 10일 월요일

Aptana Studio 1.0 릴리즈...


Aptana Studio 1.0 이 릴리즈 되었다.

뭐 된지는 쫌 되었지만, 내가 오늘 알게 되었다. ㅡㅡ;


현재 나의 개발 환경은 MyEclipse 5.5.1 GA + Aptana 를 붙여서 쓰고 있었다.

MyEclipse는 JSP와 WAS를 잘 연결해주고, 개발을 편하게 만들어주고,

Aptana는 HTML, JS를 더욱더 편하게 만들어준다. 특히 JS에 자동완성 부분이 맘에 들어서,

요새 관심있는 DOM, AJAX를 볼때 더욱더 빛을 바란다.


사용자 삽입 이미지

Aptana Community 버젼 플러그인 설치후 스크린샷..




근데 이번에 Aptana Studio 1.0이 나왔다는 소식에 보았는데,

이제 MyEclipse 와 Aptana 만 붙이면 최강이 아닐까? ㅡㅡ;


거의 제대로 된 IE 디버깅 툴이 없는 걸로 아는데,

이번에 FTP지원과 IE디버깅 툴지원 만으로도 최고라고 말하고 싶다.


근데 가격이... $199 인데 이벤트 기간이라 해서 $99 에 판단다..


좋다고 느끼지만 비싸다고 생각이 드는건 뭘까...


Eclipse사용자들은 거의 Java, JSP유저라고 본다. 물론 기타 플러그인을 붙여서 쓰는 유져도 많다.

하지만 java유저가 더 많을것이라 생각드는데.. MyEclipse 의 기능을 반만 붙였으면 어떨까 싶다..

JSP 유저들이 사용하려면, 다른것과 같이 써야 한다는 말인데.. 흠...


여튼 좋은 툴인건 분명하다. 앞으로의 행보가 기대되는군...

2007년 12월 6일 목요일

JDOM 프로그래밍..

JDOM 프로그래밍 XML

2006/07/05 00:12

출처 : http://blog.naver.com/index236/80026003480

작성일 : 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의 웹사이트를 방문합니다.




(그림 1) 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의 루트 디렉토리로 매치 시켜 주어야 하는 것입니다. 다음과 같이 할 수도 있으며,

D:\> set JAVA_HOME=D:\jdk1.3

 

필자(의 OS는 윈도우2000서버임)처럼, 제어판-시스템-환경변수에서 그 설정을 할 수도 있습니다.

시스템 환경 변수에 “JAVA_HOME”을 설정해 주고 나서, JDOM압축을 푼 디렉토리에 build.xml와 build.bat파일이 있는지 확인합니다. build.bat은 build.xml이라는 파일에 포함된 정보를 참조하기 때문에 build.xml과 build.bat은 반드시 한 디렉토리에 존재하여야 합니다. 자 그러면 도스창을 열어서 .\build.bat을 실행합니다(화면2).


(그림 2) build.bat실행 화면

빌드가 성공적으로 되면 “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문서를 생성하여 출력하는 프로그램을 만들어 보겠습니다.

<?xml version="1.0"?>

<startOfJdom>

Hello JDOM!!

</ startOfJdom>

 

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 문서는 다음과 같은 방법으로 만들어질 수 있습니다.

Element el = new Element("startOfJdom");

Document doc = new Document(el);

 

이 코드는 루트 요소로 “startOfJdom”이라는Element를 가지는 새로운 JDOM Document객체를 생성하도록 합니다. 루트 Element에 “Hello JDOM!!”이라는 텍스트를 추가하는 것은 다음과 같은 방법으로 할 수 있습니다

el.setText("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문서를 시스템 화면에 출력하도록 하는 코드는 다음과 같습니다.

XMLOutputter outputter = new XMLOutputter();

try{

   outputter.output(doc, System.out);

}catch (Exception e) {

   System.err.println(e);

}

 

완성된 코드는 다음과 같습니다.

import org.jdom.Document; //JDOM Document클래스

import org.jdom.Element; //JDOM Element클래스

import org.jdom.output.XMLOutputter; //Output을 위한 클래스

 

public class HelloJDOM {

  

   public static void main(String args[]) {

      Element el = new Element("startOfJdom"); //Root Element를 만듬

      el.setText("Hello JDOM!!"); //Element의 값을 설정

      Document doc = new Document(el); //Element를 Document에 추가

           

      XMLOutputter outputter = new XMLOutputter();//출력을 위한 객체를 만듬

      try{

         outputter.output(doc, System.out); //시스템 화면에 Document 를 출력

      }catch (Exception e) {

         System.err.println(e);

      }

   }

}

 

이 프로그램에 대한 출력 결과는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>

<startOfJdom>Hello JDOM!!</startOfJdom>

 

지금까지 아주 간단한 XML문서를 만들어서 출력하는 JDOM프로그램을 만들어 보았습니다. 그럼 좀더 복잡한 JDOM문서를 만드는 프로그램을 만들어 볼까요? 아무래도 실제적으로는 복잡한 문서를 만들 경우가 많을테니까요.

좀더 복잡한 JDOM문서 만들기

1. 우선 샘플 XML문서를 만들어 봅니다. HelloJDOM프로그램처럼, 이 XML문서를 JDOM 클래스를 사용하여 Document로 생성하는 프로그램을 만들도록 하겠습니다.

<?xml version=1.0 encoding=utf-8?>

<computer id="089">

   <!-- description of computer-->

   <hdd>4GB</hdd>

   <ram>128MB</ram>

   <price>30,000</price>

   <year>2000</year>

</computer

 

2. 우선적으로 만들어야 할 것이 JDOM Document이지요. JDOM Document와 루트 엘리먼트를 만들고, 루트 엘리먼트를 JDOM Document에 추가하도록 합니다.

Element computerElement = new Element("computer");

Document myDocument = new Document(computerElement);

 

3. 루트 엘리먼트를 만들었으면 ‘id’라는 어트리뷰트와 어트리뷰트 값을 루트 엘리먼트에 추가합니다.

computerElement.addAttribute(new Attribute("id", "089"));

 

4. 위의 샘플 XML문서의 “Description of computer” 커멘트를 루트 엘리먼트에 추가하도록 합니다

computerElement.addContent(new Comment("Description of a car"));

 

5. “hdd”라는 루트 엘리먼트에 포함되는 하위 엘리먼트를 만들어서 루트 엘리먼트에 추가합니다.

Element hdd = new Element("hdd");

hdd.addContent("4GB");

computerElement.addContent(hdd);

 

Element객체의 addContent()메소드는 Element 타입을 파라메터로 받고 Element타입을 리턴합니다. 그래서 다음과 같이 만들 수도 있습니다.

computerElement.addContent(new Element(hdd).addContent(4GB));

 

6. 루트 엘리먼트에 포함되는 나머지 서브 엘리먼트를 만들어서 루트 엘리먼트에 추가하도록 합니다. 이것은 앞의 5번 중 두번째 방식으로 하도록 합니다.

computerElement.addContent(new Element("ram").addContent("128MB"));

computerElement.addContent(new Element("price").addContent("30,000"));

computerElement.addContent(new Element("year").addContent("2000"));

 

7. 이제 앞의 샘플 XML문서를 JDOM문서로 모두 표현한 것 같습니다. 이미 만들어진 JDOM문서 중, 어떻게 어떤 특정 엘리먼트에 접근하는지 알아볼까요? 루트 엘리먼트의 자식 엘리먼트에 접근하는 것은 다음과 같은 방법으로 할 수 있습니다. 이것은 computerElement가 가지고 있는 자식 엘리먼트중 “hdd”라는 이름을 가지는 첫번째 엘리먼트를 리턴합니다. 보통, 이름을 사용하여 자식엘리먼트를 구하고자 할 경우, getChild()메소드를 사용하고, 특정 엘리먼트에 포함된 모든 자식 엘리먼트를 구하고자 할 경우에는 getChildren()메소드를 사용합니다.

Element hddElement = computerElement.getChild("hdd");

 

8. 특정 엘리먼트에 접근하는 것과 비슷한 방식으로 특정 엘리먼트를 지울 수도 있습니다.

boolean removed = computerElement.removeChild("year")

 

이것은 루트 엘리먼트에 포함된 “year”라는 이름을 가지는 엘리먼트를 지우도록 합니다.

9. 그럼 어떤 특정 엘리먼트의 값은 어떻게 수정할 수 있을까요? 다음의 코드는 앞에서 만든 hdd 엘리먼트의 텍스트 값을 “4GB”에서 “20GB”로 바꾸도록 합니다.

hdd.setText("20GB");

 

10. 자 이렇게 XML문서를 만들고 수정한 결과 문서를 파일에 출력 하도록 하겠습니다. 문서의 출력은 HelloJDOM예제와 마찬가지로 XMLOutputter클래스를 사용하도록 하겠습니다. XMLOutputter클래스를 사용하면 indent, newline, 출력 포맷에 대한 옵션을 줄 수 있습니다. 아래의 XMLOutputter클래스는 문서를 출력함에 있어서 부모 엘리먼트와 자식 엘리먼트의 indent로 “ “스페이스 하나를 주고, 엘리먼트들 사이를 newline으로 구별하기로 한다는 것이지요. XMLOutputter클래스는 Writer나 OutputStream으로 그 출력 타겟(target)을 결정할 수가 있는데 여기서는 파일(computer.xml)로 출력하도록 하였습니다.

XMLOutputter outputter = new XMLOutputter(" ", true);

try {

   FileOutputStream f = new FileOutputStream("newFile.xml");

   OutputStreamWriter writer = new OutputStreamWriter(f, "utf-8");

   outputter.output(myDocument, writer);

   writer.close();

} catch (java.io.IOException e) {

   e.printStackTrace();

}

 

11. 이 모든 코드를 모으면 다음(JDOMWorld.java)과 같습니다.

import org.jdom.Document; //JDOM Document 클래스

import org.jdom.Element; //JDOM Element 클래스

import org.jdom.Attribute; // JDOM Attribute를 나타내는 클래스

import org.jdom.Comment; // JDOM Comment를 나타내는 클래스

import org.jdom.output.XMLOutputter; //출력을 위한 클래스

import java.io.*;

      

public class JDOMWorld {

   public static void main(String [] args){    

      //루트 엘리먼트를 만듬

      Element computerElement = new Element("computer");

      Document myDocument = new Document(computerElement);     

      //루트 엘리먼트에 어트리뷰트를 추가

      computerElement.setAttribute(new Attribute("id", "089"));

      //루트 엘리먼트에 커멘트를 추가

      computerElement.addContent(new Comment("Description of a car"));     

      Element hdd = new Element("hdd"); //hdd엘리먼트 생성

      hdd.addContent("4GB"); //hdd엘리먼트에 값을 추가

      computerElement.addContent(hdd); //hdd엘리먼트를 추가

      //ram, price, year 엘리먼트를 차례대로 추가

      computerElement.addContent(new Element("ram").addContent("128MB"));

      computerElement.addContent(new Element("price").addContent("30,000"));

      computerElement.addContent(new Element("year").addContent("2000"));

      //루트 엘리먼트로부터 hdd엘리먼트를 가져옴

      Element hddElement = computerElement.getChild("hdd");

      //루트 엘리먼트로부터 year엘리먼트를 삭제

      boolean removed = computerElement.removeChild("year");

      //hdd엘리먼트의 값을20GB로 바꿈

      hdd.setText("20GB");

      //출력을 위한 객체를 만듬, indent= , newline=ok로 설정

      XMLOutputter outputter = new XMLOutputter(" ", true);

      try {  

         FileOutputStream f = new FileOutputStream("newFile.xml");  

         OutputStreamWriter writer = new OutputStreamWriter(f, "utf-8");           

         //Document를 newFile.xml파일에 출력 

         outputter.output(myDocument, writer);        

         writer.close();

      } catch (java.io.IOException e) {   e.printStackTrace();}

   } 

}

 

JDOMWorld.java를 컴파일(d:\ javac JDOMWorld.java)한 후 실행(java JDOMWorld)하면 newFile.xml이라는 xml파일이 만들어지고 이 파일을 웹 브라우저에서 열어보면, 화면은 다음과 같습니다(화면3).


(그림 3) newFile.xml IE5이상에서 실행화면

그런데 한글이 포함되어 있는 문서는 어떻게 처리할까요? 기본적으로는 별 문제가 없습니다.

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()’메소드를 사용하여 만들어 보겠습니다.

<?xml version="1.0"?>

<JDOM의시작>

 안녕하세요!!

</ JDOM의시작>

 

import org.jdom.Document;//JDOM Document를 나타내는 클래스

import org.jdom.Element; //JDOM Element를 나타내는 클래스

import org.jdom.output.XMLOutputter; //출력을 위한 클래스

 

public class HelloJDOM {

  

   public static void main(String args[]) {

      Element el = new Element("JDOM의시작");

      el.setText("안녕하세요!!");

      Document doc = new Document(el);//루트 엘리먼트를 도큐먼트에     추가

      //출력을 위한 객체를 만듬

      XMLOutputter outputter = new XMLOutputter("  ", true);

      try{//출력 인코딩을 euc-kr로 세팅

          outputter.setEncoding("euc-kr");                           

          outputter.output(doc, System.out);

      }catch (Exception e) {

         System.err.println(e);

      }

   }

}

<리스트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파일로 저장하는 프로그램을 만들어보겠습니다.

TrAX(The Transformation API for XML)이란 무엇인가?

XSLT는 그 스펙이 발표되자마자 많은 벤더들에 의해 자바로 구현된 다양한 XSLT 프로세서들이 나왔습니다. 그래서 사용자들은 빠른 시일내에 XSLT의 다양한 세계를 경험할 수 있었지요. 그러나 불행하게도 이러한 XSLT 프로세서들은 각각 서로 다른 API를 제공하였습니다. 그래서 어떤 XSLT 프로세서를 사용하여도 돌아가는 어플리케이션을 만들고자 할 경우에는, 각 프로세서에 대한 모듈을 각각 따로 만들어 주어야 합니다.

이러한 단점으로 인해 벤더들은 서로 다른 API들에 대한 공통의 API를 만드는 데에 합의하였고, 그 결과로 나온 것이 바로 XML에 대한 Transformation API인 TrAX입니다. TrAX의 발전 속도는 처음에는 더디게 진행되었습니다. 그러나 Sun에서 XML에 대한 Java API인 JAXP의 부분으로 TrAX를 사용하기로 결정함에 따라 본격적으로 채용되게 되었으며, JAXP1.1, Xalan, Saxon에서 완벽하게 구현이 되었습니다.

TrAX는 XSLT 프로세서 개발자들의 공동 작업의 결과이며 현재 빠르게 확산되고 있습니다. 이들의 노력으로 인해 개발자들은 특정 XSLT프로세서에 종속적이지 않은 XSLT기반의 어플리케이션을 만들 수 있을 것입니다. JDOM에서 지원하는 transformation도 바로 TrAX에 기반하고 있습니다.

 

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객체로 보냅니다.

public static Document transform(Document in, String stylesheet)

      throws JDOMException {

     try {

        Transformer transformer =

TransformerFactory.newInstance().newTransformer(new StreamSource(stylesheet));

 

        JDOMResult out = new JDOMResult();

        transformer.transform(new JDOMSource(in), out);

        return out.getDocument();

     }

     catch (TransformerException e) {

        throw new JDOMException("XSLT Trandformation failed", e);

     }

   }

 

2. 앞의 메소드를 구현하기 위해서는 물론 JAXP 클래스들이 임포트 되어야 하겠지요? JAXP클래스들을 임포트한 완성된 프로그램은 (리스트2)와 같으며, 적용할 XSL파일은 (리스트 3)와 같습니다.

<리스트2> HelloJDOMXsl.java

import org.jdom.Document;//JDOM Document를 나타내는 클래스

import org.jdom.Element; //JDOM Element를 나타내는 클래스

import org.jdom.output.XMLOutputter;//출력을 위한 클래스

import org.jdom.JDOMException;//JDOM Exception처리 클래스

import org.jdom.transform.*; //JDOM Document의 XSL Transformation 지원 클래스

import javax.xml.transform.*; //JAXP의 Transformer클래스를 사용

import javax.xml.transform.stream.*;// StreamSource클래스 사용

import java.io.*;// FileOutputStream, OutputStreamWriter를 사용하기 위한 클래스

 

public class HelloJDOMXsl {

  

   public static void main(String args[]) {

      Element el = new Element("JDOM의시작");

      el.setText("안녕하세요!!");

      Document doc = new Document(el);//루트 엘리먼트를 JDOM Document에 추가     

      XMLOutputter outputter = new XMLOutputter("  ", true);//출력 객체를 만듬

      try{

         //JDOM Document를 XSL로 변환한 결과를 htmlDocument로 받음

         Document htmlDocument = transform(doc, "newFileXsl.xsl");         

         FileOutputStream f = new FileOutputStream("newFile.html");  //Write할 파일를 설정

         OutputStreamWriter writer = new OutputStreamWriter(f, "euc-kr"); 

         outputter.setEncoding("euc-kr");       

         outputter.output(htmlDocument, writer);//Transformation된 결과를 file에 Write

      }catch (Exception e) {

         System.err.println(e);

      }

   }

   public static Document transform(Document in, String stylesheet)

                                        throws JDOMException {

     try {

        //Transformation을 위한 Tranformer를 만듬

        Transformer transformer =

               TransformerFactory.newInstance().newTransformer(new StreamSource(stylesheet));

        // Transformation 후, 결과를 받을 JDOMResult객체를 생성

        JDOMResult out = new JDOMResult();

        //JDOM XML 소스에 XSL을 적용한 결과를 JDOMResult객체에 넣어줌

        transformer.transform(new JDOMSource(in), out);

        return out.getDocument();//JDOM Document를 리턴

     }

     catch (TransformerException e) {

        throw new JDOMException("XSLT Trandformation failed", e);

     }

   }

}

 

<리스트 3>NewFileXsl.xsl

<?xml version="1.0" encoding="euc-kr"?>

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 

  <xsl:template match="/"><!root element matchà

    <html>

       <head><title>sample xsl</title>

       </head>

       <body>

          <xsl:apply-templates select="JDOM의시작"/>

       </body>

    </html>

  </xsl:template>

 

  <xsl:template match="JDOM의시작">

    <font color="blue"><xsl:value-of select="."/></font>

  </xsl:template>

</xsl:stylesheet>

 

3. HelloJDOMXsl.java를 컴파일하고 실행하면 newFile.html이라는 파일이 만들어질 것이고, 이 html파일을 브라우저에서 열면 (화면4)와 같습니다.


(그림 4) newFile.html 실행 화면

아주 간단하죠? JDOM의 Transformation관한 것은 JAXP의 TrAX에 기반하고 있고, 별도의 패키지를 통해 그것을 지원하고 있습니다. 아직 디버깅이라든지 약간 복잡한 xsl문서를 적용하기에는 불편한 점이 있긴 하지만 사용하는 데에는 어렵지 않습니다.

JDOM프로그래밍은 무지 간단하다!!

지금까지 시작하는 JDOM프로그래머들을 위해 HelloJDOM프로그램과, XML을 생성하는 좀더 복잡한 JDOMWorld프로그램, XSLT변환 프로그램, JDOM에서의 한글 처리 방법에 대해 알아 보았습니다. 어떠셨나요? 도움이 되었나요? JDOM을 이제 막 접하시는 분들이 JDOM의 개념을 잡고 실제로 어떻게 이용할 수 있는지 도움이 되었기를 바라면서 아쉬운 작별을 해야겠습니다. 2001년의 마지막 달인 12월입니다. 한해를 정리하고 다가오는 2002년을 설계하면서 뜻깊은 한달을 보내기를 바랍니다. Happy New Year~~.