add user agent parser and update build configuration
This commit is contained in:
240
docs/JAXB.md
Normal file
240
docs/JAXB.md
Normal file
@@ -0,0 +1,240 @@
|
||||
# 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) 개발에도 유용하다!**
|
||||
Reference in New Issue
Block a user