Java

[Java]객체(Object)를 XML로 변환

DevStory 2022. 4. 11.

객체를 XML로 변환

JAXB(Java Archiecture for XML Binding)는 Java의 객체(Object)를 XML과 매핑하는데 사용되는 라이브러리입니다. 반대로 XML을 객체와 매핑하는 경우에도 사용됩니다.


JAXB는 Java 1.6부터 도입된 라이브러리입니다. 따라서 JAXB를 사용하기 위해 Maven 또는 Gradle 프로젝트에 라이브러리를 추가할 필요가 없습니다.


마샬링(Marshalling)

JAXB에서 Java의 객체를 XML로 변환하는 작업을 마샬링(Marshalling)이라고 합니다. JAXB는 객체를 XML로 변환하는 작업을 수행하기 위해 Marshall 클래스를 제공합니다.


클래스 생성

마샬링 작업을 수행하기 전에 Author 및 Book이라는 두 개의 간단한 클래스를 생성합니다. 각 책에는 한 명의 저자가 존재한다는 시나리오를 기반으로 클래스를 모델링합니다.

 

다음은 저자를 표현하는 Author 클래스입니다. Author 클래스는 ID와 이름을 가집니다.

public class Author {
  private Long id;
  private String name;

  public Author() {
  }

  public Author(Long id, String name) {
    this.id = id;
    this.name = name;
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  public String toString() {
    return "Author{" +
            "_id=" + id +
            ", _name='" + name + '\'' +
            '}';
  }
}

 

다음은 Book 클래스입니다. 각 필드에 JAXB 어노테이션을 추가하여 마샬링 과정을 제어할 수 있습니다.

@XmlRootElement(name = "book")
public class Book {
  private Long id;
  private String title;
  private Author author;

  public Book() {
  }

  public Book(Long id, String title, Author author) {
    this.id = id;
    this.title = title;
    this.author = author;
  }

  public Long getId() {
    return id;
  }

  @XmlAttribute(name = "id")
  public void setId(Long id) {
    this.id = id;
  }

  public String getTitle() {
    return title;
  }

  @XmlElement(name = "title")
  public void setTitle(String title) {
    this.title = title;
  }

  public Author getAuthor() {
    return author;
  }

  @XmlElement(name = "author")
  public void setAuthor(Author author) {
    this.author = author;
  }

  @Override
  public String toString() {
    return "Book{" +
            "id=" + id +
            ", title='" + title + '\'' +
            ", author=" + author +
            '}';
  }
}

다음은 Book 클래스에서 사용된 JAXB 어노테이션에 대한 설명입니다.

@XmlRootElement
@XmlRootElement 어노테이션은 최상위 클래스에서 XML 문서의 루트 Element를 지정하기 위해 사용됩니다. name은 선택 사항으로 생략하면 클래스 이름이 루트 Element 이름으로 설정됩니다.

@XmlAttribute
@XmlAttribute 어노테이션은 XML 문서의 루트 Element의 Attribute를 나타내는데 사용됩니다.

@XmlElement
@XmlElement 어노테이션은 루트 Element의 하위 Element가 되는 클래스의 필드에 사용됩니다.

Java 객체를 XML로 변환

Java의 객체를 XML 문자열로 변환하기 전에 JAXBContext의 객체를 생성합니다. JAXBContext 클래스는 마샬링, 언마샬링 및 유효성을 검증하는 여러 메서드를 제공합니다.

 

JAXBContext에서 Marshall 인스턴스를 가져온 다음 marshal() 메서드를 사용하여 Java 객체를 XML로 마샬링 합니다.

try {
  // JAXBContext 인스턴스 생성
  JAXBContext context = JAXBContext.newInstance(Book.class);

  // Marshaller 인스턴스 생성
  Marshaller marshaller = context.createMarshaller();

  // 개행 문자 및 띄어쓰기를 정렬화
  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

  StringWriter sw = new StringWriter();

  Book book = new Book(17L, "Head First Java",
        new Author(5L, "Bert"));

  // Book 객체를 마샬링
  marshaller.marshal(book, sw);

  // 마샬링 결과를 콘솔에 출력
  System.out.println(sw.toString());
} catch (JAXBException ex) {
  ex.printStackTrace();
}

실행 결과

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book id="17">
    <author>
        <id>5</id>
        <name>Bert</name>
    </author>
    <title>Head First Java</title>
</book>
반응형

Java 객체를 XML 파일로 변환

Java의 객체를 XML 파일로 변환하는 방법은 위 예제에서 StringWriter의 인스턴스를 File로 변경하면 됩니다.

try {
  JAXBContext context = JAXBContext.newInstance(Book.class);

  Marshaller marshaller = context.createMarshaller();

  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

  File file = new File("book.xml");

  Book book = new Book(17L, "Head First Java",
          new Author(5L, "Bert"));

  marshaller.marshal(book, file);
  
} catch (JAXBException ex) {
  ex.printStackTrace();
}

언마샬링(Unmarshalling)

언마샬링(Unmarshalling)은 XML을 Java 객체로 변환하는 작업을 말합니다.

 

언마샬링 작업을 수행하기 위해 JAXBContext에서 Unmarshall 인스턴스를 가져온 다음 marshal() 메서드를 사용하여 XML 파일을 인스턴스로 변환합니다.

try {
  JAXBContext context = JAXBContext.newInstance(Book.class);

  Unmarshaller unmarshaller = context.createUnmarshaller();

  File file = new File("book.xml");

  Book book = (Book) unmarshaller.unmarshal(file);

  System.out.println(book);
} catch (JAXBException ex) {
  ex.printStackTrace();
}

실행 결과

Book{id=17, title='Head First Java', author=Author{id=5, name='Bert'}}

Java 컬렉션을 XML로 마샬링

List, Map 또는 Set과 같은 컬렉션 객체를 XML로 마샬링하거나 XML을 Java 컬렉션 객체로 언마샬링하는 경우가 존재합니다.

 

컬렉션 객체를 XML로 마샬링하기 위해 Books라는 클래스를 생성합니다. Books 클래스는 Book 클래스의 인스턴스를 List로 관리합니다.

@XmlRootElement(name = "books")
public class Books {

  private List<Book> books;

  public List<Book> getBooks() {
    return books;
  }

  @XmlElement(name = "book")
  public void setBooks(List<Book> books) {
    this.books = books;
  }

  public void add(Book book) {
    if (this.books == null) {
      this.books = new ArrayList<>();
    }
    this.books.add(book);
  }
}

Books 클래스의 add() 메서드는 Book 객체를 전달받아 List에 추가합니다.

 

다음은 Java의 컬렉션 객체를 XML로 변환합니다.

try {
  JAXBContext context = JAXBContext.newInstance(Books.class);

  Marshaller marshaller = context.createMarshaller();

  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

  StringWriter sw = new StringWriter();

  Books books = new Books();

  books.add(new Book(1L, "Head First Java",
          new Author(1L, "Bert")));
  books.add(new Book(2L, "Thinking in Java",
          new Author(2L, "Bruce")));

  marshaller.marshal(books, sw);

  marshaller.marshal(books, sw);

  System.out.println(sw);
} catch (JAXBException ex) {
  ex.printStackTrace();
}

실행 결과

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books>
    <book id="1">
        <author>
            <id>1</id>
            <name>Bert</name>
        </author>
        <title>Head First Java</title>
    </book>
    <book id="2">
        <author>
            <id>2</id>
            <name>Bruce</name>
        </author>
        <title>Thinking in Java</title>
    </book>
</books>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books>
    <book id="1">
        <author>
            <id>1</id>
            <name>Bert</name>
        </author>
        <title>Head First Java</title>
    </book>
    <book id="2">
        <author>
            <id>2</id>
            <name>Bruce</name>
        </author>
        <title>Thinking in Java</title>
    </book>
</books>
반응형

'Java' 카테고리의 다른 글

[Java]반복자(Iterator)  (0) 2022.05.02
[Spring]Transactional 어노테이션 사용 및 롤백 처리  (0) 2022.04.14
[Java]main 함수(메서드)  (0) 2022.04.10
[Java]현재 날짜 및 시간 가져오기  (0) 2022.04.09
[Java]날짜 비교 방법  (0) 2022.04.05

댓글