Files
java-examples/docs/JAXB.md

240 lines
6.7 KiB
Markdown

# 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)**
```java
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
<?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 객체로 변환하는 코드:
```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 속성으로 변환할 수도 있다.
```java
@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 출력 결과**
```xml
<person id="1">
<name>홍길동</name>
<age>30</age>
</person>
```
`@XmlAttribute`를 사용하면 특정 필드를 **XML의 속성(attribute) 형태**로 변환할 수 있다.
---
### **✔ 컬렉션 처리 (`@XmlElementWrapper`)**
리스트(List) 같은 컬렉션을 XML로 변환할 때 `@XmlElementWrapper`를 사용하면 요소를 그룹으로 감쌀 수 있다.
```java
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 출력 결과**
```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`을 사용한다.
```java
@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 출력 결과**
```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) 개발에도 유용하다!**