[번역] XStream 배우기 : 2분만에 배우는 XStream

XStream은 자바 객체를 XML로 직렬화 시키는 데 사용하는 도구입니다. 다르게 말하면 XML과 객체를 쌍방향 맵핑시켜주는 도구입니다. 자바 객체를 XML로 만들어서 파일이나 DB에 저장하거나 네트워크를 통해서 전송할 수 있게 해줍니다. 거꾸로 이렇게 만들어진 XML을 객체로 복원하기도 하고요. 비슷한 다른 유명 프로젝트로  Castor 와 자바 표준 JAXB 그리고 Quick 등이 있습니다.

XStream 튜토리얼이 한글로 번역된 것이 없어서 시간 될 때마다 하나씩 번역해 올려보겠습니다.
튜토리얼 구성은 이렇습니다.
  1. 2분만에 배우기 (원글)
  2. 별칭(Alias) 배우기 (원글)
  3. 애노테이션(Annotations) 배우기 (원글)
  4. 변환기(Converter) 배우기 (원글)
  5. 객체 스트림(Object Streams) 배우기 (원글)
  6. 영속화 API(Persistence API) 배우기 (원글)
  7. JSON 배우기 (원글)
오늘은 간단한 XStream을 사용법을 전체적으로 볼 수 있는 2분만에 배우기입니다.

2분만에 배우기

이 글은 XStream에 대해 아주 간단히 소개합니다. 대충 읽으시면 객체를 XML로 변환하고 그것을 거꾸로 복원하는 것이 얼마나 단순한지 아실 수 있습니다. 물론 앞으로 궁금한 부분이 생기실 것입니다.

직렬화될 객체 만들기

여기 간단한 클래스 두개가 있습니다. XStream은 이 객체들의 인스턴스를 XML로 변환하고 다시 복원할 수 있습니다.

public class Person {
private String firstname;
private String lastname;
private PhoneNumber phone;
private PhoneNumber fax;
// ... constructors and methods
}

public class PhoneNumber {
private int code;
private String number;
// ... constructors and methods
}

Note: 필드들이 private인 것을 주목하십시오. XStream은 필드의 접근 제한을 무시합니다. getter와 setter 또한 필요하지 않습니다. XStream은 기본 생성자를 꼭 만들어야 하는 제한도 없습니다.


XStream 초기화


XStream을 쓰려면 단순히 XSTream 객체를 생성하십시오.

XStream xstream = new XStream();

클래스 패스에 xstream-[version].jar와 xpp3-[version].jar가 있어야 합니다. XPP3 는 아주 빠른 XML pull parser 구현체입니다. 이 것에 종속되기 원하지 않는다면 대신 표준 JAXP DOM 파서를 사용할 수 있습니다.

XStream xstream = new XStream(new DomDriver()); // XPP3 라이브러리를 요구하지 않음
Note: 이 클래스는 일반적인 동작들을 위해 설계된 간단한 퍼세이드입니다. 보다 큰 융통성을 위해서, 다른 동작을 하는 자신만의 퍼세이드를 만드는 길을 택할 수도 있습니다.

이제 XStream으로 보다 간편히 XML 출력을 만들기위해, 위의 클래스의 이름을 XML 요소명으로 대응하는 별칭을 만들 수 있습니다.

xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);

Note: 이 단계는 선택사항입니다. 이 작업 없이도 XStream은 잘 작동하지만 XML 요소 이름이 객체의 패키지를 포함한 전체 이름을 갖게 되기 때문에 조금은 크기가 커집니다. 다음에 진행될 "별칭 배우기" 참고하시면 자세한 내용을 아실 수 있습니다.


객체를 XML로 직렬화하기

Person 객체를 생성하고 필드에 값을 넣도록 하겠습니다.
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));

이제 XML로 변환하기 위해 해야 하는 것이라고는 단순히 XStream을 호출하는 것뿐 입니다.

String xml = xstream.toXML(joe);

결과는 다음과 같습니다.

<person>
<firstname>Joe</firstname>
<lastname>Walnes</lastname>
<phone>
<code>123</code>
<number>1234-456</number>
</phone>
<fax>
<code>123</code>
<number>9999-999</number>
</fax>
</person>

이렇게 간단합니다. XML이 얼마나 깔끔한지 보십시오.


직렬화된 XML에서 객채를 복원하기


다시 객체를 재조립하려면 이렇게 하십시오.

Person newJoe = (Person)xstream.fromXML(xml);

XStream은 이렇게 단순합니다.


정리

다시 정리해봅니다.

  • xstream.alias(String elementName, Class cls)를 사용해서 자작한 클래스를 요소이름에 대응시킬 클래스 이름의 별칭을 만듭니다. 
  • xstrean.toXML(Object obj)를 사용해서 객체를 XML로 변환합니다.
  • xstream.fromXML(String xml)을 사용해서 XML를 객체로 되돌립니다.

참고 자료

XStream vs Castor for XML serialization  : XStream과 Castor 작업한 경험을 쓴 글입니다.
XML and Java technologies: Data binding, Part 2: Performance : XML과 객체를 바인딩하는 솔루션들의 성능을 비교했습니다. XStream은 빠져있습니다.
Comparing Java Data Binding Tools : Java 객체와 XML의 바인딩 도구들을 비교했습니다. 이 또한 XStream이 나오기 전에 만들어진 문서라서 XStream은 빠져있습니다.
Thoughts on Web Services, part 5: To serialize or not to serialize : XML로 직렬화하는 것에 대한 이슈를 적었습니다.

by 박성철 | 2008/01/15 14:11 | 프로그래밍 이야기 | 트랙백 | 핑백(1) | 덧글(5)

트랙백 주소 : http://gyumee.egloos.com/tb/1291803
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at impro : xstream at 2012/03/29 18:45

... http://gyumee.egloos.com/1291803 ... more

Commented at 2008/04/01 17:54
비공개 덧글입니다.
Commented by 박성철 at 2008/04/02 18:07
문제 생길 것이 뭐 있겠어요. 오픈소스인데... ㅎㅎ
즐거운 개발 되세요.
Commented by 최재웅 at 2008/07/25 22:58
xmlbeans가 대세였던 때가 있었는데, 지금은 아닌가 모르겠네요.. 최근 java와는 살짝 멀어져있는 사람입니다. :)
Commented by 가던이 at 2014/06/02 14:20
알고싶은 부분을 잘 알려주는 글 인거같습니다. 출처 밝히고 퍼가겠습니다.
Commented by 제로미 at 2014/06/11 16:23
이걸 왜 지금에서 보았는지 참 안타깝습니다...
추천 한방 드리고 갑니다.

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶