Files
java-examples/docs/JAXB.md

6.7 KiB

JAXB (Java Architecture for XML Binding)

1. JAXB란?

JAXB(Java Architecture for XML Binding)는 Java 객체를 XML로 변환하거나, XML을 Java 객체로 변환하는 기술이다. XML 데이터를 다룰 때, DOM이나 SAX보다 훨씬 간편하다.

JAXB 주요 기능Java 객체 → XML 변환 (Marshalling)XML → Java 객체 변환 (Unmarshalling)XML Schema 기반 Java 클래스 자동 생성 가능


2. JAXB 어노테이션 정리

JAXB는 여러 어노테이션을 제공하여 XML과 Java 객체 간 매핑을 설정할 수 있다.

어노테이션 설명
@XmlRootElement XML의 루트 요소를 정의
@XmlElement 특정 필드를 XML 요소로 매핑
@XmlAttribute 특정 필드를 XML 속성으로 매핑
@XmlAccessorType 필드 접근 방식 설정 (FIELD, PROPERTY, NONE, PUBLIC_MEMBER)
@XmlTransient 특정 필드를 XML에 포함하지 않음
@XmlElementWrapper 컬렉션 요소를 감싸는 XML 요소를 추가
@XmlType XML 요소의 순서를 지정
@XmlEnum Enum을 XML 요소로 변환
@XmlValue XML 요소의 값을 직접 지정
@XmlJavaTypeAdapter 사용자 정의 변환을 적용

3. JAXB 사용 예제

✔ Java 객체 → XML 변환 (Marshalling)

import javax.xml.bind.annotation.*;
import javax.xml.bind.*;

@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
    private String name;
    private int age;

    public Person() {}  // JAXB는 기본 생성자가 필요함

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    public static void main(String[] args) throws Exception {
        Person person = new Person("홍길동", 30);

        // JAXB 객체 생성
        JAXBContext context = JAXBContext.newInstance(Person.class);
        Marshaller marshaller = context.createMarshaller();

        // XML 출력 형식 설정 (예쁘게 출력)
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // Java 객체를 XML로 변환 후 출력
        marshaller.marshal(person, System.out);
    }
}

🔹 실행 결과 (XML 출력)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <name>홍길동</name>
    <age>30</age>
</person>

@XmlRootElement를 사용하여 person을 XML 루트 요소로 지정했다. @XmlAccessorType(XmlAccessType.FIELD)을 사용하여 클래스의 필드 기준으로 XML을 자동 생성했다.


✔ XML → Java 객체 변환 (Unmarshalling)

위에서 생성한 XML을 다시 Java 객체로 변환하는 코드:

import java.io.StringReader;

public class XMLToJava {
    public static void main(String[] args) throws Exception {
        String xmlData = """
            <person>
                <name>홍길동</name>
                <age>30</age>
            </person>
        """;

        JAXBContext context = JAXBContext.newInstance(Person.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();

        // XML을 Java 객체로 변환
        Person person = (Person) unmarshaller.unmarshal(new StringReader(xmlData));

        System.out.println("이름: " + person.getName());
        System.out.println("나이: " + person.getAge());
    }
}

🔹 실행 결과

이름: 홍길동
나이: 30

Unmarshaller를 사용하여 XML 데이터를 Java 객체로 변환했다.


✔ XML 속성 처리 (@XmlAttribute)

필드를 XML 속성으로 변환할 수도 있다.

@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
    @XmlAttribute
    private int id;
    private String name;
    private int age;

    public Person() {}

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

🔹 XML 출력 결과

<person id="1">
    <name>홍길동</name>
    <age>30</age>
</person>

@XmlAttribute를 사용하면 특정 필드를 XML의 속성(attribute) 형태로 변환할 수 있다.


✔ 컬렉션 처리 (@XmlElementWrapper)

리스트(List) 같은 컬렉션을 XML로 변환할 때 @XmlElementWrapper를 사용하면 요소를 그룹으로 감쌀 수 있다.

import java.util.List;

@XmlRootElement(name = "classroom")
@XmlAccessorType(XmlAccessType.FIELD)
public class Classroom {
    @XmlElementWrapper(name = "students")
    @XmlElement(name = "student")
    private List<Person> students;

    public Classroom() {}

    public Classroom(List<Person> students) {
        this.students = students;
    }
}

🔹 XML 출력 결과

<classroom>
    <students>
        <student>
            <name>홍길동</name>
            <age>30</age>
        </student>
        <student>
            <name>이몽룡</name>
            <age>25</age>
        </student>
    </students>
</classroom>

@XmlElementWrapper(name = "students")를 사용하여 students 요소를 감쌌다.


✔ XML 요소 순서 지정 (@XmlType)

XML 요소의 순서를 지정하려면 @XmlType을 사용한다.

@XmlRootElement(name = "book")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "title", "author", "price" })  // 요소 순서 지정
public class Book {
    private String title;
    private String author;
    private double price;

    public Book() {}

    public Book(String title, String author, double price) {
        this.title = title;
        this.author = author;
        this.price = price;
    }
}

🔹 XML 출력 결과

<book>
    <title>자바 프로그래밍</title>
    <author>홍길동</author>
    <price>30000.0</price>
</book>

@XmlType(propOrder = { "title", "author", "price" })을 사용하여 요소 순서를 지정했다.


4. 정리

JAXB는 Java 객체와 XML 간 변환을 쉽게 할 수 있도록 도와주는 기술@XmlRootElement, @XmlElement, @XmlAttribute 등을 활용하여 XML 구조를 커스텀 가능 ✔ Marshaller를 사용하여 Java → XML 변환 (Marshalling) ✔ Unmarshaller를 사용하여 XML → Java 변환 (Unmarshalling) ✔ 컬렉션, 속성, 요소 순서 등도 세밀하게 제어 가능

JAXB를 활용하면 XML을 쉽게 다룰 수 있으며, 웹 서비스 (REST, SOAP) 개발에도 유용하다!