240 lines
6.7 KiB
Markdown
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) 개발에도 유용하다!** |