# 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 홍길동 30 ``` ✅ `@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 = """ 홍길동 30 """; 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 홍길동 30 ``` ✅ `@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 students; public Classroom() {} public Classroom(List students) { this.students = students; } } ``` **🔹 XML 출력 결과** ```xml 홍길동 30 이몽룡 25 ``` ✅ `@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 자바 프로그래밍 홍길동 30000.0 ``` ✅ `@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) 개발에도 유용하다!**