Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


XMLBeans를 이용한 xml binding
 
XMLSchema를 이용하여 소스및 각종 레퍼런스지원을 해줄 수 있는 강력한 도구인 xml bean에 대한 개념 및 사용방법을 설명한다. ( 2004/03/11 ) 43
Written by ienvyou - 최지웅
1 of 1
 

  요기서는 XMLBeans에 대하여 알아볼까 한다. XMLBeans~ 처음 들어보는 사람도 있을 것이고
 자카르타 프로젝트에 관심이 많은 사람이라면 인큐베이팅의 영역에서 한 부분을 차지하며 그리
 많은 도큐먼트를 가지고 있지 않아 사용하고자 했으나 할 수 없는 사람들 또한 있을 것이다.
 그러면 여기서 간단하게 XMLBeans가 대체 무엇을 하는 것이며 어떻게 써야하는 지에 대해 간략하게
 알아보도록 하자.

 ▶ XMLBeans

이름을 보면 그대로 전해지는 느낌이 어떠한가? XML? Beans? 
"흠~ XML과 Bean이라... XML-->Bean?" 이라고 생각하면 대충은 때려맞춘것이라고 본다.
이글을 읽는 당신은 jakarta-commons의 digester를 보았고 코딩을 해보았는가?
기본적인 digester는 실제 jakarta에서 사용되는 xml-config의 java측 object로 변환하기 위하여 처음에
strut에 포함되어 있다가 공통적인 필요성에 의하여 밖으로 뽑아져 나왔음을 먼저 알고 있다면
조금은 설명을 듣기가 수월해짐을 알 수 있을 것이다.
Digester의 기초적인 모태도 뭐 sun에서 가지고 있는 JAXB(Java API for XML Binding)의 기술이다.
즉 xml을 읽어들여 어떻게 자바측의 object로 변환시킬 수 있느냐다.

XMLBeans에서 intro로 한마디로 어떻게 적혀있느냐 하면 바로 다음과 같다.

"It is an XML-Java binding tool"

저놈은 XML-Java바인딩 툴이올시다.라고 말이다. 그럼 digester와 별반 무슨 차이가 있고, JDOM하고는
또 무슨 차이가 있냐는 것인데...차이? 어마어마하다.(나중에 설명)

우선 왜 이런 인큐베이티이 프로젝트가 나왔는가? 2003년 9월에 David Bau란 똑똑한 사람이 맹글어서
BEA의 workshop에 포함되어 사용되고 있었는데 그걸 apache에 submit하여 프로젝트로 만들어
오픈소스로 처리하기로 맘을 먹었다나 어쨌다나~
그래서 지금의 자카르타의 xml관련 인큐베이팅 프로젝트로 개발되고 있으며 현재 1.0버젼이 사용되고 있지만은
사실 dev2dev의 bea사이트에서 먼저 만나볼 수 있었던 패키지 또는 툴이라고 할 수 있다.

 ▶XMLBeans 대체 뭐하는 놈인고?

얘가 XML-java의 binding을 해주긴 하는데 위에서 간략하게 이야기한 digester와는 확연한 차이를 보이는게 있다.
Digester같은 경우는 실제 바인딩될 object에 대하여 개발자가 열나게 코딩해줘야 한다는 것이다. 
하지만 XMLBeans의 경우 모든 내용은 생략되고 xml에 대한 문서와 환경파일만 있으면 factory의 형태로
클래스의 소스를 모두 생성하여 패키징 한후 jar를 만들어 배포할 수 있도록 구성해준다는 특징을 가지고 있다.
또한 xml의 webservice형태인 wsdl까지도 다 알아서 해준다. 
parsing? query? 
걱정말라. 모든 형태가 class의 메소드로 자동생성되어 지원되고 있으며, 기본 xsd파일과 xsd에 대한 config로
소스의 패키징 위치, 배포형태등을 모두 관리하여 생성할 수 있도록 해주는 내가 보기엔 

"XML을 아주 편하고, 아주 사용하기 쉬고, 간편하게 자바와 매핑시켜주는 좋은 놈"

이다.

또한 뭐가 다른 binding패키지와 틀리냐하면 

1. 완벽한 XMLSchema지원하며
2. 완벽한 Infoset을 지키고 있다.

즉 XMLSchema가 가지고 있는 주요한 기능을 모두 자바측의 오브젝트로 변환시킬수 있는 방법을 제공한다.
또한 XML스키마 변경에 의한 개발변경이 있을 시에도 별반 다르게 해야할 일이 없다는 것이다.
또한 모든 데이터들이 stream의 형태로 사용되는 것이 아니라 모두 메모리에서 사용되는 것이며, 
모든 xml의 데이터 타입이 이쁘게 자바측으로 스며들게 되어 있다.

현재 xml apache에서 cvs를 이용한 다운로드만을 받을 수 있으며, BEA System에서 받는 것은 이미 
weblogic workshop에 포함되어 있는 패키지명이 다른 xml bean의 라이브러리를 받을 수 있다.

 ▶개발의 순서

먼저 개발을 어떻게 하며 어떤 API를 써야 하는지를 확인해보도록 해보자.

1. 먼저 사용하게 될 XML Schema와 xsd에 대한 config파일을 구성하도록 한다.

    XML파일의 구조를 DTD가 아닌 스키마를 통하여 구현을 하고 해당 xsd파일이 파싱되어 어떠한 자바측
    소스로 만들어서 변환될지를 결정할 xsdconfig파일을 구성하도록 한다.

source 1 : mappings.xsd



<xs:schema
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:mp="http://www.javapattern.info/mappings"
   targetNamespace="http://www.javapattern.info/mappings"
   elementFormDefault="qualified"
   attributeFormDefault="unqualified">   

  <xs:element name="mappings">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="url-mapping" type="mp:url-mapping" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="url-mapping">
    <xs:sequence>
      <xs:element name="class-name" type="xs:string"/>
      <xs:element name="method-name" type="xs:string"/>
      <xs:element name="form-name" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="uri" type="xs:string"/>
  </xs:complexType>

</xs:schema>

xsd에 대한 config파일을 만든다. 이 파일은 generating 되는 소스에 대한 환경설정을 담는다. package : 소스의 패키지명 prefix : Java Source Prefix suffix : Java Source Suffix source 2 : mappings.xsdconfig


<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config"
           xmlns:mp="http://www.javapattern.info/mappings">

  <xb:namespace uri="http://www.javapattern.info/mappings">
    <xb:package>com.javapattern.controller.mappings</xb:package>
  </xb:namespace>

  <xb:namespace uri="##any">
    <xb:prefix>Xml</xb:prefix>
    <xb:suffix>Bean</xb:suffix>
  </xb:namespace>

</xb:config>

2. 빌드는 시도한다. 환경설정에 잡혀있어야 하는것은 xbean.jar(XMLBeans구현체), jsr173_api.jar(Sun XML stream구현체) build.xml


<project name="Xbean" default="mappings.jar" basedir=".">

    <property name="build.compiler" value="javac1.4"/>
    <property name="product.version" value="1.0.0"/>

    <property name="repackage_arg" value=""/>
    <property name="schema_compiler" value="org.apache.xmlbeans.impl.tool.SchemaCompiler"/>
    <property name="bootstrap_schema_compiler" 
value="org.apache.xmlbeans.impl.tool.SchemaCompiler"/>

    <path id="scomp.run.path">
    <pathelement location="lib/xbean.jar"/>
    <pathelement location="lib/jsr173_api.jar"/>

    <fileset dir='lib'>
        <include name='**/*.jar'/>
        <include name='**/*.zip'/>
    </fileset>

    </path>


    <target name="mappings.check">
    <uptodate property="mappings.notRequired" targetfile="lib/mappings.jar">
      <srcfiles dir="src/com/javapattern/controller/mappings" includes="**/*"/>
      <srcfiles dir="lib" includes="xbean.jar"/>
    </uptodate>
    </target>

    <target name="mappings.jar" depends="mappings.check" unless="mappings.notRequired">
    <java classname="${schema_compiler}" classpathref="scomp.run.path" fork="true" failonerror="true">
      <jvmarg value="-ea"/>
      <arg line="-out lib/mappings.jar -src src schemas"/>
    </java>
    </target>


    <taskdef name="xmlbean" 
            classname="org.apache.xmlbeans.impl.tool.XMLBean" 
            classpath="lib/xbean.jar"/>

    <target name="generate.jar" depends="mappings.check" unless="mappings.notRequired">
        <xmlbean classgendir="build" classpath="lib/xbean.jar;lib/jsr173_api.jar"      failonerror="true">  
            <fileset file="schema" includes="mappings.xsdconfig"/>
            <fileset file="schema" includes="mappings.xsd"/>
        </xmlbean>
    </target>
</project>


위의 빌드파일을 보게되면 2가지의 명령으로 실제 schema compiler를 구사하게 되는데 taskdefine되어진 xmlbean태그는 현재 동작이 되지 않고 있으며 기본 mapping.jar target을 이용하여 만들고 있다. 내용은 소스와 컴파일된 lib의 파일명이 무엇인지를 확인하여 체크하도록 하고 있으며 정상적으로 빌드되어질 경우 src디렉토리에 해당 xml의 처리소스가 생기며, lib디렉토리에 mappings.jar파일이 src를 컴파일한 결과로 생기게 된다. 여러분들은 가장 먼저 소스를 확인하기 바란다. 3. 이제 처리프로그램을 하나 만들어 보도록 한다. MappingTest.java

import java.io.*;
import com.javapattern.controller.mappings.*;
import org.apache.xmlbeans.*;

public class MappingTest {
    public static void main(String args[]) {  
        File xmlFile = new File(args[0]);  
        try {   
            XmlMappingsDocumentBean doc = (XmlMappingsDocumentBean) 
XmlObject.Factory.parse(xmlFile);   
            System.out.println(doc.xmlText());   
            XmlUrlMappingBean[] bean = doc.getMappings().getUrlMappingArray();   //doc.getMappings().  
            for ( int i=0; i<bean.length; i++ ) {    
                System.out.println("--- " + i + " ---");    
                System.out.println(bean[i].getUri());    
                System.out.println(bean[i].getClassName());     
                System.out.println(bean[i].getFormName());    
                System.out.println(bean[i].getMethodName());   
            }     

            doc.save(new File("backup-mappings.xml"));
        } catch (XmlException e1) {   
            e1.printStackTrace();  
        } catch (IOException e1) {   
            e1.printStackTrace();  
        }   
    }
}
위의 프로그램은 간단하게 루프를 돌며 자동으로 생성된 xml파일의 내용을 보여주게 되는데 아래에 테스트 xml을 적도록 한다. source : mappings.xml


<mappings xmlns="http://www.javapattern.info/mappings">
    <url-mapping uri="guestBookList.xrq">
        <class-name>com.javapattern.wli.web.action.GuestBookAction</class-name>
        <form-name>com.javapattern.wli.web.form.GuestBookForm</form-name>
    </url-mapping>
    <url-mapping uri="guestBookList">
        <class-name>com.javapattern.wli.web.action.XmlGuestBookMapAction</class-name>
        <method-name>getGuestBookList</method-name>
        <form-name>com.javapattern.wli.web.form.GuestBookForm</form-name>
    </url-mapping>
    <url-mapping uri="guestBookList2">
        <class-name>com.javapattern.wli.web.action.XmlGuestBookAction</class-name>
        <method-name>getGuestBookList</method-name>
        <form-name>com.javapattern.wli.web.form.GuestBookForm</form-name>
    </url-mapping>
    <url-mapping uri="testWAFCall">
        <class-name>com.javapattern.wli.web.action.WAFCallActionTest</class-name>
        <method-name>test</method-name>
    </url-mapping>
    <url-mapping uri="testWAFCall2">
        <class-name>com.javapattern.wli.web.action.WAFCallActionTest</class-name>
        <method-name>test2</method-name>
        <form-name>com.javapattern.wli.web.form.GuestBookForm</form-name>
    </url-mapping>
    <url-mapping uri="getGuestBookList">
        <class-name>com.javapattern.wli.web.action.GuestBookAction</class-name>
        <method-name>getGBookList</method-name>
        <form-name>com.javapattern.wli.web.form.GuestBookForm</form-name>
    </url-mapping>
</mappings>

Test java -classpath .;lib\mappings.jar;lib\xbean.jar;lib\jsr173_api.jar MappingTest config/mapping.xml 위의 내용으로 처리하게 되면 모든 내용이 자동으로 생성된 bean의하여 메모리에서 처리되고 저장된 내용을 array의 형태로 접근하여 값을 가져오도록 한 후 파일에 back의 이름으로 저장하는 예제를 보여주고 있다. 응용에 대한 부분은 여러분들에게 맡기도록 하며 소스를 다운받을 수 있는 링크는 다음과 같다. XMLBeanTest.zip 단굘.
 
1
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD