OXM은 JAXB르 비롯한 다양한 Object-XML 매핑(또는 바인딩) 기술에 대한 추상화 서비스를 제공하는 모듈이다. 그 필요성이 점점 보편화되면서 SWS에서 코어로  3.0에서 편입되었다.

OXM의 Marshaller와 Unmarshaller라는 두가지 API를 이용해서 JAXB2, JiBX, XmlBeans, Castor, XStream등의 다양한 기술에 대한 투명한 접근방법을 만들어 준다. OXM엔진 자체는 설정을 통해서 언제든지 변경할 수 있도록 하고, 일관된 API를 통해서 OXM기능에 접근하도록 해주는 장점이 있다.

하지만 이 일관성을 유지하기 위해서는 각 기술의 특징을 잘 이해하고 사용할 필요가 있다.

JAXB의 경우는 unmarshal을 하는 경우 root element의 바인딩 오브젝트가 아니라 그에 대한 정보르 담은 JAXBElement<?>타입을 돌려주기도 하기 때문이다. JAXB의 Tutorial등에서도 이 방법이 자연스러운 것처럼 설명하는 곳이 많이 있다. 물론 JAXBElement에서 getValue()하면 루트 오브젝트를 가져올 수 있긴하다.

문제는 JAXB의 JAXBElement를 사용하게 되면 기껏 스프링이 제공하는 OXM추상화서비스라는 것이 무의미해진다는 점이다. OXM엔진을 JiBX에서 JAXB로 바꿨는데 그 때문에 unmarshal을 처리하는 코드에서 JAXBElement타입으로 받아서 getValue() 하도록 함께 수정해야 한다면 그게 무슨 서비스 추상화라고 할 수 있겠는가.

스프링의 OXM을 사용한다면 적어도 OXM기술에서 독립된 방식으로 일관된 코드를 유지할 수 있도록 만들어줘야 한다.

그러기 위해서 JAXB가 어떤 때는 unmarshal을 할 때 JAXBElement를 리턴하고 어떤 때는 바로 루트 바인딩 오브젝트를 돌려주는지를 알아야 한다.

JAXB가 루트 엘러먼트에 대한 정보를 가지고 있다면 그때는 unmarshal시 바로 루트 오브젝트를 리턴해준다. 바인딩용 루트 엘러먼트에 대한 클래스에 @XmlRootElement가 존재해야 한다.

스키마를 이용해서 바인딩 클래스를 만드는 경우라면 루트 엘러먼트를 정의할 때 그 타입을 분리해서 정의하면 안된다. 다음과 같이 anonymous type으로 정의해줘야 한다.

<element name="flights">
    <complexType>
        <sequence>
            <element name="flight" type="tns:flightType"
                     maxOccurs="unbounded">
            </element>
        </sequence>
    </complexType>
</element>

 

만약 타입을 따로 분리하는 경우는 JAXB컴파일러는 이를 가장 비관적으로 해석해서 다른 XML의 부분이라고 생각할 수도 있다는 것이다. 그때는 @XmlRootElement가 지정되지 않으며 unmarshal시에는 JAXBElement타입의 오브젝트를 리턴할 것이다. 

이를 막기 위해서 스키마에 컴파일러가 참조할 수 있는 애노테이션을 주는 방법도 있다. 스키마를 정의할 때 항상 모든 타입을 명시적으로 정의하는 스타일이라면 이 방법을 선택하는 것도 좋을 것이다.

 

아무튼 중요한 것은 서비스 추상화를 이용하려면 항상 일관된 코드를 유지할 수 있도록 만들라는 것. 현실적으로 OXM엔진을 바꿀 필요가 없을 것 같더라도 말이다.

Related posts:

  1. Spring 2.0의 XML확장기능 (2)
  2. Spring 3.0 (46) Spring 3.0 M4 릴리스
  3. Spring 3.0 (53) Spring Dependency Matrix 업데이트
  4. Spring 3.0 (42) Spring Dependency Matrix 업데이트
  5. Spring 3.0 (35) Spring 3.0 Reference Document 공개
  6. Spring 3.0 (26) Spring Expression Language와 @Value
  7. Spring 3.0 (7) Spring 3.0 Dependency Matrix
  8. 유쾌한 이슈처리 재촉 메일
  9. Spring 3.0 (38) Spring Reference 업데이트
  10. Spring 3.0 (44) Spring 3.0과 JEE6
  11. Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기
  12. Spring 3.0 (23) Web.Portlet 모듈 선택라이브러리 분석
  13. Spring 3.0 (18) Oxm 모듈의 선택 라이브러리 분석
  14. Spring 3.0 (12) Expression 모듈의 선택 라이브러리 분석
  15. Spring 3.0.2 모듈/라이브러리 의존관계

Facebook comments:

to “Spring 3.0 (48) OXM모듈의 JAXB2 사용시 주의할 점”

  1. 스프링 포트폴리오에서 가져온 기능들이 많네요. OXM(Spring Web Service), Java Configuration(Spring JavaConfig), ConvesionService(Spring Web Flow), SpEL(Spring Web Flow).. 결국 이 녀석들이 3.0 주요 기능이 되려나~

  2. JAXB쓸때는 항상 @XmlRootElement를 사용하긴 하는데…
    이넘에 까다로운 성격때문에 JAXB의 혜택을 받지도 못하고
    직접 만들어 쓰는게 안타까울뿐입니다. :(

    그나저나, 저 링크걸린 자바 블로그에 나온
    코-스케 카와구치는 Hudson 개발하는 사람아닌가요?

  3. Kevin/ Hudson은 안써서 잘 모르겠어요. Bamboo팬이라.. :)

  4. 저는 지금 OpenSource 프로젝트를 진행중인것도 없고 그래서
    Bamboo 쓰기는 좀 그렇구요…
    CI tool중에 OpenSource 제품을 찾아보니 (자바쪽으로요)
    Hudson과 Apache Continuum 정도 나오더라구요.

    Hudson보니까 ant, maven도 지원되고, 빌드에 문제생기면
    email도 보내주고, 스케쥴 빌드나 SCM에 commit 하면
    알아서 빌드해 주는 기능등등 일단 제가 필요한건 다 있고,
    UI도 깔끔하길래 Hudson 쓰고 있습니다. :)
    개발이 활발하게 진행되서 새버전도 자주 나오고, 만족하고 있습니다. :)

  5. This is a comment to the admin. Your website is missing out on at least 300 visitors per day. I discovered this page via Google but it was hard to find as you were not on the first page of search results. I have found a website which offers to dramatically increase your traffic to your website: http://voxseo.com/traffic/. I managed to get over 10,000 visitors per month using their services, you could also get lot more targeted traffic than you have now. Hope this helps :) Take care.

  6. cheap shoes online Spring 3.0 (48) OXM모듈의 JAXB2 사용시 주의할 점 » Toby’s Epril

  7. mbt cheap Spring 3.0 (48) OXM모듈의 JAXB2 사용시 주의할 점 » Toby’s Epril

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha