Object/XML Mapping, 줄여서 O/X mapping은 Object를 XML문서로 변환하는데 이를 XML Mashalling 또는 Marshalling 이다. 반대로 XML문서를 Object로 변환하는 것은 Unmarshalling 이다.
Client <------ XML ------> Server
WS는 Server와 Client 두 대상간의 데이터를 주고 받는 기술중에 하나이다. 정보를 요청하는쪽이 Client이다.(Client는 Server가 될수도 있고 일반 사용자가 될수도있다.) 요청한 정보를 받아서 알맞게 처리후 결과값을 리턴하는 쪽이 Server이다.
Client(OXM) <------ XML(WSDL) ------> (OXM)Server
WS는 XML(WSDL)형식으로 데이터를 주고 받는다.따라서 이 XML를 객체화 하거나 객체를 XML화 해야 한다. 그것이 Marshalling,Unmarshalling이다. OXM Utill은 JAXB,Castor,XMLBeans,JiBX,XStream..등 여러 가지가 있다.
Spring의 모든 marshalling 추상 클래스들은 org.springframework.oxm.Marshaller interface를 implemention 한다.
public interface Marshaller { /** * Marshals the object graph with the given root into the provided Result. */ void marshal(Object graph, Result result) throws XmlMappingException, IOException; }
PARAMETER | 설 명 |
---|---|
Object | XML문서구조와 같은 Java 객체 |
javax.xml.transform.Result | XML 출력과 관련된 객체들이 반드시 구현해야 할 Interface |
◎ java.xml.transform.Result는 XML 출력과 관련된 객체들이 반드시 구현해야 할 Interface다. 구현 객체와 XML표현은 다음과같이 매칭된다.
javax.xml.transform.Result | XML표현 |
---|---|
javax.xml.transform.dom.DOMResult | org.w3c.dom.Node |
javax.xml.transform.sax.SAXResult | org.xml.sax.ContentHandler |
javax.xml.transform.stream.StreamResult | java.io.OutputStream java.io.File 또는 java.io.Writer |
Spring의 모든 Unmarshalling 추상 클래스들은 org.springframework.oxm.Unmarshaller interface를 implemention 한다.
public interface Unmarshaller { /** * Unmarshals the given provided Source into an object graph. */ Object unmarshal(Source source) throws XmlMappingException, IOException; }
PARAMETER | 설 명 |
---|---|
javax.xml.transform.Source | XML source or transformation instructions 등을 매개변수로 받는 StreamSource 객체 |
◎ java.xml.transform.Source는 XML 입력과 관련된 객체들이 반드시 구현해야 할 Interface다. 구현 객체와 XML표현은 다음과같이 매칭된다.
javax.xml.transform.Source | XML표현 |
---|---|
javax.xml.transform.dom.DOMSource | org.w3c.dom.Node |
javax.xml.transform.sax.SAXSource | org.xml.sax.InputSource org.xml.sax.XMLReader |
javax.xml.transform.stream.StreamSource | java.io.File java.io.InputStream 또는 java.io.Reader |
Spring's OXM은 다양한 Java-XML Binding 오픈소스를 지원한다. 여기서는 오픈소스 Castor와 XMLBeans를 사용하여 구현한 가이드프로그램을 제시한다.
Castor XML mapping은 XML Binding 오픈소스 프레임워크이다. Castor는 java object에서 XML문서, XML문서에서 java object로 변환을 지원한다. mapping file을 사용하여 좀더 수월하게 Castor를 사용할 수 있지만 그외 추가적인 구성은 할 필요가 없다. 좀 더 많은 OpenSource Castor 정보를 원한다면 Castor web site와 org.springframework.oxm.castor package를 참조하면 된다.
Create binding classes
* XML Schemas를 작성한다.(text.xsd) * 다음을 실행하면 스키마에 따라 -package에 지정된 패키지로 클래스들이 생성된다. * java org.exolab.castor.builder.SourceGenerator -i text.xsd -package gen.xyz
ARGS | 설 명 |
---|---|
text.xsd | 참조할 xml 스키마 |
gen.xyz | xml 스키마를 사용하여 Generation한 Java class package |
Configuration
<bean id="divertcastor" class="egovframework.rte.fdl.divert.DivertCastor"> <property name="marshaller" ref="castorMarshaller" /> <property name="unmarshaller" ref="castorMarshaller" /> </bean> <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"/>
PROPERTIES | 설 명 |
---|---|
marshaller | org.springframework.oxm.castor.CastorMarshaller |
unmarshaller | org.springframework.oxm.castor.CastorMarshaller |
Sample Source
◎ Java Object의 데이타를 XML문서로 DataBinding Sample Source
@Resource(name = "castorMarshaller") private Marshaller marshaller; public void testMarshalling() { try { FileOutputStream os = null; List<Writer> book2Writers = new ArrayList<Writer>(); book2Writers.add(new Writer("J,J.R 툴킨")); book2Writers.add(new Writer("J.J.T 툴킨")); BookMg bookMg2 = new BookMg("9780446618502", "반지의 제왕", book2Writers); os = new FileOutputStream("CasterBook.xml"); marshaller.marshal(bookMg2, new StreamResult(os)); } catch (Exception e) { logger.debug(e.getMessage()); e.printStackTrace(System.err); fail("testMarshalling failed!"); } }
◎ XML문서를 JavaObject로 DataBinding Sample Source
@Resource(name = "castorMarshaller") private Unmarshaller unmarshaller; @Test public void testUnmarshalling() { FileInputStream is = null; try { is = new FileInputStream("CasterBook.xml"); bookMg = (BookMg) unmarshaller.unmarshal(new StreamSource(is)); writers = bookMg.getWriters(); for (Iterator i = writers.iterator(); i.hasNext(); ) { Writer writer = (Writer)i.next(); } }catch(FileNotFoundException fnde) { fnde.getStackTrace(); } catch(IOException ioe) { ioe.getStackTrace(); } finally { if (is != null) { try { is.close(); }catch(IOException ioe) { ioe.getStackTrace(); } } } }
XMLBeans는 스키마 기반으로 XML 인포셋 전체에 커서 기반으로 접근할 수 있도록 하는 XML-Java binding tool이다. BEA Systems에 의해 개발 되었으며 2003년에 아파치 프로젝트에 기증 되었다. 좀 더 많은 정보는 XMLBeans web site 와 org.springframework.oxm.xmlbeans package를 참조 하면 된다.
Create binding jar
* XML Schemas를 작성한다.(text.xsd) * 다음을 실행하면 스키마에 따라 jar 파일이 생성된다. * scomp -out text.jar text.xsd
ARGS | 설 명 |
---|---|
text.jar | binding classes jar |
text.xsd | 참조할 xml 스키마 |
Configuration
<bean id="divertxmlbeans" class="egovframework.rte.fdl.divert.DivertXMLBeans"> <property name="marshaller" ref="xmlBeansMarshaller" /> <property name="unmarshaller" ref="xmlBeansMarshaller" /> </bean> <bean id="xmlBeansMarshaller" class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller" />
PROPERTIES | 설 명 |
---|---|
marshaller | org.springframework.oxm.xmlbeans.XmlBeansMarshaller |
unmarshaller | org.springframework.oxm.xmlbeans.XmlBeansMarshaller |
Sample Source
◎ Java Object의 데이타를 XML문서로 DataBinding Sample Source
@Resource(name = "xmlBeansMarshaller") private Marshaller marshaller; @Test public void testMarshalling() { FileOutputStream os = null; userDoc = UserinfoDocument.Factory.newInstance(); userElement = userDoc.addNewUserinfo(); userElement.setName("홍길동"); userElement.setAge(31); userElement.setPhone(022770918); xmlOptions = new XmlOptions(); xmlOptions.setSavePrettyPrint(); xmlOptions.setSavePrettyPrintIndent(4); xmlOptions.setCharacterEncoding("euc-kr"); try { os = new FileOutputStream("XMLBeanGen.xml"); marshaller.marshal(userDoc, new StreamResult(os)); }catch(Exception ee) { ee.getStackTrace(); fail("testMarshalling failed!"); } finally { if (os != null) { try { os.close(); }catch(IOException e3) { e3.getStackTrace(); fail("testMarshalling failed!"); } } } }
◎ XML문서를 JavaObject로 DataBinding Sample Source
@Resource(name = "xmlBeansMarshaller") private Unmarshaller unmarshaller; @Test public void testUnmarshalling() { FileInputStream is = null; try { is = new FileInputStream("XMLBeanGen.xml"); userDoc = (UserinfoDocument) unmarshaller.unmarshal(new StreamSource(is)); userElement = userDoc.getUserinfo(); }catch(FileNotFoundException fnde) { fnde.getStackTrace(); fail("testUnmarshalling failed!"); } catch(IOException ioe) { ioe.getStackTrace(); } finally { if (is != null) { try { is.close(); }catch(IOException ioe) { ioe.getStackTrace(); fail("testUnmarshalling failed!"); } } } }