Dev Note/JAX-WS (SOA)2008. 3. 5. 21:19


JAXB (1) 에서 JAXB란 무엇인가에 대해 간략하게 알아보았다.
여기서는 JAXB에 포함되어 있는 xjc (Binding Compiler)를 이용하여 XML Schema를 가지고 정의 된 데이터 모델을 표현할 수 있는 Java Interfaces & Classes를 생성하는 것에 대해 다룬다.

먼저 JAXB Interfaces & Classes를 생성하기 위한 간단한 XML Schema를 만들어 보자.
정의 하고자 하는 XML Schema는 간단하게 회사를 정의 했는데, 회사와 팀을 정의하고, 회사에는 하나 이상의 팀이 속한다는 구조이다.

   <?xml version="1.0"?>
   <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="compony">
         <xsd:complexType>
            <xsd:sequence minOccurs="1" maxOccurs="unbounded">
               <xsd:element name="team">
                  <xsd:complexType>
                     <xsd:attribute name="name"/>
                  </xsd:complexType>
               </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="name"/>
            <xsd:attribute name="address"/>
         </xsd:complexType>
      </xsd:element>
   </xsd:schema>

도식적으로 표현하면 아래와 같이 나타난다. (XmlSpy Enterprise 2008을 이용했음)

사용자 삽입 이미지

[ jaxb_sample.xsd 도식화 된 그림 ]

그럼 데이타 구조를 정의 한 XML Schema를 생성했으니, Binding Compiler (xjc)를 이용하여 Java Interfaces 또는 Classes를 생성해 보자. 생성에 앞서 먼저 Binding Compiler가 무엇인지 간단하게 설명을 하면

-- Binding Compiler (xjc)
XML Schema를 가지고, Schema에 의해 정의 된 데이터 모델을 표현할 수 있는 Java Interfaces 또는 Classes을 생성해 주는 Compiler를 말한다.
xjc는 JAXB를 다운받아 설치를 하면 bin 밑의 xjc.bat, xjc.sh를 이용하면 된다.

   Usage: xjc [-options ...] <schema file/URL/dir> ... [-b <bindinfo>] ...

* xjc 옵션 설명 (자주 사용되는 것) *
-d <dir> : 저장 된 Directory를 지정
-p <package> : Compile 되어 나오는 Interfases & Classes의 Package를 지정
-classpath <arg> : 실행에서 사용 할 classpath

 다음의 코멘드 라인 구문을 사용하여 Binding Compile을 해보자.

   xjc -p com.junducki.blog.jaxb -d D:\goorm\project\blog\src jaxb_sample.xsd

결과는 아래와 같이 나오며, D:\goorm\project\blog\src 아래에 com.junducki.blog.jaxb package로 Interfaces & Classes 들이 생성되어 있는 것이 확인이 될 것이다.

사용자 삽입 이미지

[ xjc를 실행 한 cmd 화면 ]

사용자 삽입 이미지

[ xjc 실행 결과 생성 된 Java Interfases & Classes ]


이제 JAXB를 이용하여 XML을 Java Object로 Java Object에서 XML로 변환하기 위한 준비가 완료 되었다. 다음에는 marshal과 unmarshal을 이용하여 XML과 Java Object의 변환 과정을 다루기로 한다.

Posted by as.wind.914
Dev Note/JAX-WS (SOA)2008. 3. 5. 20:29
-- JAXB 란 ?
XML은 이제 데이터를 표현하는 표준이며, Java Object를 XML로 나열할 때 사용하는 다양한 XML 기술들이 개발되어 왔다. 그 중에서 Java 개발자들에게 익숙한 두가지 기본 기술은 Simple API for XML (SAX)과 Document Object Model (DOM) API's 였다. 그러나 종종 프로그래머들은 즉각적인 테스트에 좀 더 특징적으로 적용할만한 기술을 필요로 하며, 이 경우 Object Data를 나열하는데 좀 더 간단한 XML 기불을 원하게 되어 JAXB가 나오게 되었다.
"Java Architecture for XML Binding"의 약자로 Java Web Services Development Pack의 표준이 되었다. XML Schema로부터 Java Class로 바인딩, XML로부터 Object를 직렬화(Serialization)하는 Unmarchalling 또는 이와 반대의 Marshalling을 수행 할 수 있도록 지원해주는 API를 말한다.
사용자 삽입 이미지

[ JAXB를 간략하게 설명 한 그림 ]

JAXB를 그림으로 나타내면 위와 같이 표현이 된다.

- Binding Compiler (xjc) : XML Schema를 가지고, Schema에 의해 정의 된 데이터 모델을 표현할 수 있는 Java Interfaces 또는 Classes을 생성해 주는 Compiler
- Schema-Derived Classes & Interfaces : XML Schema에 의해 정의 된 데이터 모델을 표현할 수 있는 Java Interface & Classes
- marshal : Java Object를 XML Docuement로 변환
- unmarshal : XML Document를 Java Object로 변환

JAXB에 대해 좀더 자세히 알고싶거나, 다운을 원한다면 https://jaxb.dev.java.net/jaxb20-fcs/으로 가능하다.
Posted by as.wind.914
Dev Note/JavaScript2008. 3. 5. 20:08
웹에서 많이 사용하는 팝업창의 스크롤이 발생하지 않게 사이즈를 자동으로 조절해 주는 스크립트

   function popupResize() {
      var innerBody = document.body;
      var v_width = innerBody.scrollWidth + 10;
      // 29는 window의 테이틀만 있을 때, 50은 window의 테이틀과 상태바 만 있을 때
      var v_height = innerBody.scrollHeight + 29;

      resizeTo(v_width, v_height);
   }

위에서 width에 10을 더한 것과 height에 29를 더한것은 Window 창의 사이즈를 더한 것이라, 맞지 않을 때에는 조절하면 된다.
height의 29는 window의 타이틀 외에 팝업에 아무것도 없을 때이며, 50은 window의 타이틀과 상태바가 있을 때 이다.

위 스크립트를 body 태그의 onload에 걸어두면 된다.
   <body onload="popupResize()">

위 popupResize() 함수는 익스플로워7에서는 문제가 조금 있다.
익스플로워7에서는 팝업이 뜰때 상태바와 주소가 사용자가 익스플로워의 설정을 변경하지 않으면 무조건 나타나게 되어있다. 익스플로워6에서는 위의 popupResize()를 사용해도 무방하나 익스플로워7을 감안한다면 아래의 팝업창 리사이즈를 하는 함수를 사용하는 것이 좋을 것 같다.

function newPopupResize() {
   var dWidth = parseInt(document.body.scrollWidth);
   var dHeight = parseInt(document.body.scrollHeight);
 
   var divEl = document.createElement('div');
   divEl.style.left = '0px';
   divEl.style.top = '0px';
   divEl.style.width = '100%';
   divEl.style.height = '100%';
 
   document.body.appendChild(divEl);
 
   window.resizeBy(dWidth - divEl.offsetWidth, dHeight - divEl.offsetHeight);
   document.body.removeChild(divEl);  
}

개인적으로 newPopupResize() 함수를 사용하는 것이 좋을 듯 하다.
Posted by as.wind.914