 |
난이도 : 중급
Rajiv Bangalore, 선임 스태프 소프트웨어 엔지니어, IBM India Private Ltd.
옮긴이: 장동수 dwkorea@kr.ibm.com
2008 년 5 월 20 일
XML 직렬화는 객체 퍼시스턴스와 데이터 전송을
포함한 무수히 많은 쓰임새가 있습니다. 그러나 일부 XML 직렬화 기술은 구현하기 어렵습니다. XStream은 자바 객체를
XML로 직렬화하거나 그 반대로 역직렬화할 수 있는 가볍고 사용하기 쉬운 오픈 소스 자바(Java™) 라이브러리입니다.
XStream을 설정하고, 이를 이용해 객체를 직렬화하고 역직렬화하는 방법을 배웁니다. 또한 설정 속성들을 XML 설정 파일에서
읽어오는 방법도 알아봅니다.
XStream 을 사용하면, 대부분의 자바 객체를 아무런 매핑없이 직렬화할 수 있다. 객체 이름은 요소 이름이 되고,
클래스 내의 문자열들이 XML 요소의 내용을 구성한다. XStream으로 직렬화할 클래스는 Serializable 인퍼페이스를
구현할 필요도 없다. XStream은 직렬화 도구일 뿐, 데이터 바인딩 도구가 아니므로 XML이나 XML 스키마 정의(XML
Schema Definition: XSD)로부터 클래스를 생성하지 않는다.
XStream은 다른 직렬화 도구와 구별되는 세 가지 특징이 있다.
- XStream은 클래스에서 직렬화/역직렬화될 필드들의 가시성을 고려하지 않는다.
- 클래스에서 직렬화/역직렬화될 필드들을 위한 getter나 setter 메서드가 필요없다.
- 직렬화/역직렬화될 클래스는 기본 생성자가 필요없다.
어떤 서드파티 클래스라도 아무런 변경없이 XStream을 사용해 직렬화하고 역직렬화할 수 있다.
개발 환경 설정하기
다음에 나오는 절차에 따라 XStream를 다운로드하고 설치하자(참고자료).
- 이클립스 웹 사이트에서 이클립스를 다운로드해 원하는 폴더에 설치하자. 해당 디렉터리를 이 기사에서는 eclipse_home으로 표기하겠다. 이 기사는 이클립스 3.3 버전을 기준으로 설명한다.
- XStream 웹 사이트에서 XStream의 최신 안정 버전을 다운로드해 원하는 폴더에 설치하자. 해당 디렉터리를 이 기사에서는 xstream_home으로 표기하겠다. 이 기사는 XStream 1.2.2 버전을 기준으로 설명한다.
- 3 썬 웹 사이트에서 자바 플랫폼 스탠다드 에디션(Java Platform, Standard Edition: J2SE)
소프트웨어 개발 킷(software development kit: SDK)을 다운로드해 원하는 폴더에 설치하자. 해당 디렉터리를
이 기사에서는 java_home으로 표기하겠다. 이 기사는 1.5.0_05 버전을 기준으로 설명한다.
자바 프로젝트 만들기
File > New > Project를 선택하고, 다음 절차에 따라 자바 프로젝트를 생성하자.
- Java > Java Project > Next를 선택한다(그림 1).
그림 1. 새 자바 프로젝트 시작하기
- 프로젝트 이름을 입력하고 Next를 클릭한다(그림 2).
그림 2. 프로젝트 이름 채우기
- Finish를 클릭하여 작업을 마무리한다(그림 3).
그림 3. 설정 마무리하기
그림 4는 이렇게 해서 만들어진 자바 프로젝트를 보여준다. 그림 4. 새로 만들어진 자바 프로젝트
XStream 지원 추가하기
아래 절차에 따라 방금 만든 프로젝트에 XStream 라이브러리를 추가하자.
- 이클립스의 Project Explorer에서 해당 프로젝트를 선택한 다음, Project 메뉴에서 Properties를 선택한다(그림 5).
그림 5. XStream 라이브러리 추가하기
- Add External JARs를 클릭하고, xstream_home/lib 폴더에서 xstream-1.2.2.jar를 선택한다.
- OK를 클릭해 작업을 마무리한다(그림 6).
그림 6. XStream 지원 마무리하기
그림 7은 XStream 지원이 추가된 프로젝트를 보여준다. 그림 7. 추가된 라이브러리들
객체 직렬화하기
다음의 간단한 예제는 Writer와 Reader 클래스를 통해 XStream을 사용해 객체를 직렬화하고/역직렬화하는 방법을 보여준다. Writer 클래스는 Employee 타입의 객체를 XML로 직렬화해 파일로 저장하기 위해 XStream API를 사용한다(Listing 1). Listing 1. Writer.java
package com.samples;
import java.io.FileNotFoundException; import java.io.FileOutputStream; import com.thoughtworks.xstream.*;
public class Writer {
public static void main(String[] args) { Employee e = new Employee();
//setter 메서드를 사용해 속성을 설정한다. //주의: 이 작업은 생성자에서도 할 수 있지만 //XStream이 생성자 없이도 직렬화를 수행할 수 있음을 보여주기 위해 //일부러 이렇게 했다. e.setName("Jack"); e.setDesignation("Manager"); e.setDepartment("Finance");
//객체를 직렬화한다. XStream xs = new XStream();
//파일을 파일시스템에 기록한다. try { FileOutputStream fs = new FileOutputStream("c:/temp/employeedata.txt"); xs.toXML(e, fs); } catch (FileNotFoundException e1) { e1.printStackTrace(); } } }
|
Reader 클래스는 이 파일을 읽어 XML을 역직렬화하고, 데이터로부터 자바 객체를 만들어 낸다(Listing 2).
Listing 2. Reader.java
package com.samples; import java.io.FileInputStream; import java.io.FileNotFoundException; import com.thoughtworks.xstream.*; import com.thoughtworks.xstream.io.xml.DomDriver;
public class Reader {
public static void main(String[] args) { XStream xs = new XStream(new DomDriver()); Employee e = new Employee();
try { FileInputStream fis = new FileInputStream("c:/temp/employeedata.txt"); xs.fromXML(fis, e);
//방금 읽어들인 객체의 데이터를 출력한다 System.out.println(e.toString());
} catch (FileNotFoundException ex) { ex.printStackTrace(); }
} }
|
Listing 3은 Employee 객체의 구조를 보여준다. Listing 3. Employee.java
package com.samples;
public class Employee { private String name; private String designation; private String department;
public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesignation() { return designation; } public void setDesignation(String designation) { this.designation = designation; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } @Override public String toString() { return "Name : "+this.name+ "\nDesignation : "+this.designation+ "\nDepartment : "+this.department; } }
|
설정 파일 읽기
 |
복잡한 XML 파일 읽기 이 설정 예제는 단순한 XML 파일을 읽는 예를 보여준다. 복잡한 XML 파일을 읽으려면 커스텀 변환기(converter)가 필요할 것이다. 변환기 작성 튜토리얼을 XStream "변환기 튜토리얼" 사이트에서 볼 수 있다(참고자료). | |
대 부분의 응용 프로그램은 다수의 설정 값(properties)에 의존한다. 이 설정 값은 연결할 데이터 소스의 이름일
수도 있고, 로그 파일의 위치일 수도 있다. 설정 파일은 응용 프로그램을 다시 컴파일하지 않고도 설정 값을 변경할 수 있도록
해주고, 유지보수도 쉬워지므로 이러한 데이터를 저장하기에 가장 적합한 곳이다. 이 예제 시나리오는 XStream을 사용하여 응용
프로그램에서 XML 설정 파일로부터 설정 값을 읽는 방법을 보여준다.
전형적인 XML 데이터 바인딩은 XML 파일로부터 자바 객체를 생성(generate)해야 하지만, XStream을 사용하면
객체 생성 단계가 필요없다. 자바 클래스를 만들고 클래스의 필드를 읽고 싶은 XML의 요소에 매핑하면 된다. 이 예제는 Listing 4와 같은 설정 파일이 있다고 가정한다. Listing 4. Config.xml
<?xml version="1.0" encoding="UTF-8"?> <config> <datasource-name>IRIS</datasource-name> <ipaddress>9.124.74.85</ipaddress> <logfilename>DailyLogApplication.log</logfilename> <appender>console</appender> </config>
|
Listing 5는 설정 파일을 읽어 설정 값을 자바 객체로 불러오는 ConfigReader 클래스의 소스를 보여준다. Listing 5. ConfigReader.java
package com.samples;
import java.io.FileInputStream; import java.io.FileNotFoundException; import com.thoughtworks.xstream.*; import com.thoughtworks.xstream.io.xml.DomDriver;
public class ConfigReader {
String datasourcename = null; String ipaddress = null; String logfilename = null; String appender = null;
@Override public String toString() { //이 메서드는 멤버 변수의 값을 출력한다. return "Datasource Name : "+datasourcename+ " \nIP Address : "+ipaddress+ " \nLogfilename : "+logfilename+ " \nAppender : "+appender; }
/** * @param args * @throws FileNotFoundException */ public static void main(String[] args) throws FileNotFoundException { XStream xs = new XStream(new DomDriver());
FileInputStream fis = new FileInputStream("c:/temp/Config.xml"); xs.aliasField("datasource-name", ConfigReader.class, "datasourcename"); xs.alias("config", ConfigReader.class); ConfigReader r = (ConfigReader)xs.fromXML(fis);
System.out.println(r.toString()); } }
|
요약
몇 가지 간단한 절차만 거치면 XStream을 설치하고 응용 프로그램을 개발할 수 있다. 이 기사를 통해 XStream을
사용하여 자바 객체를 직렬화하고, 역직렬화하고, 설정 파일을 읽는 방법을 배웠으니 XStream 사이트에서
앨리어스(alias), 어노테이션(annotation), 변환기(converter)에 대해 더 자세히 배울 수 있다(참고자료). 앨리어스와 변환기를 사용하면 생성되는 XML을 완전히 제어할 수 있다.
다운로드 하십시오
| 설명 |
이름 |
크기 |
다운로드 방식 |
| 이 기사의 자바 소스 코드 |
x-xstreamcode.zip |
3KB |
HTTP |
참고자료 교육
- 2분 튜토리얼: XStream에 대한 매우 신속한 소개로 시작할 수 있는 좋은 곳이다. 대충 훑어보는 것만으로도 객체와 자바간의 변환이 얼마나 간단한지 알게 될 것이다.
- XStream의 출력 결과 미세 조정하기 페이지: XStream의 출력 결과를 미세 조정하는 데 필요한 추가 정보를 찾을 수 있다.
- 변환기 튜토리얼: 고급 사용자라면, 읽거나 생성되는 XML에 대해 완전히 제어할 수 있다.
- Practical data binding: Get your feet wet in the real world(Brett McLaughlin, developerWorks, 2004년 5월): 데이터 바인딩에 대해 더 자세히 알아보자.
- XML and Java technologies: Data binding, Part 1: Code generation approaches -- JAXB and more(Dennis Sosnoski, developerWorks, 2003년 1월): XML 데이터 바인딩에 대한 몇 가지 추가적인 접근 방법도 알아보자.
- XML 입문 페이지: XML을 위한 최신 참고 자료를 XML 존에서 볼 수 있다.
- IBM XML 인증: XML과 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾을 수 있다.
- XML 기술 문서: developerWorks XML 존에서 팁, 튜토리얼, 표준, IBM Redbook을 포함한 다양한 기술 문서를 볼 수 있다.
- XML 기술 문서: developerWorks XML 존에서 팁, 튜토리얼, 표준, IBM Redbook을 포함한 다양한 기술 문서를 볼 수 있다.
- 기술 서점: 이 주제 또는 다른 기술적인 주제에 대한 책들을 찾아보자.
- 포드캐스트: 방송을 들으면서 IBM 기술 전문가들을 따라잡아 보자.
제품 및 기술 얻기
- 이클립스: 이클립스 웹 사이트에서 이클립스트를 다운로드하고 설치해 보자.
- XStream 다운로드: XStream 웹 사이트에서 라이브러리를 다운로드해 객체와 XML간에 직렬화하는 데 사용해 보자.
- IBM 시험판 소프트웨어: 한국 developerWorks를 통해 직접 다운로드할 수 있는 시험판 소프트웨어로 차세대 개발 프로젝트를 구축해보자.
토론
필자소개
 |
|

|
 |
Rajiv Bangalore는 IBM 인도의 선임 스태프 소프트웨어 엔지니어다. 7년 여에 걸쳐 다양한 자바 플랫폼 엔터프라이즈 에디션(Java EE) 개발 프로젝트에 참여하고 있다(rajiv.bangalore@in.ibm.com). | |