JAVA

[JAVA] Jackson을 활용한 XML 데이터 처리

인생아 2024. 11. 14. 20:57
반응형

Jackson은 기본적으로 JSON 데이터 처리에 많이 쓰이지만, XML 데이터 처리도 가능합니다. 특히 JSON-XML 간 상호 변환, XML 데이터 직렬화와 역직렬화, 그리고 XMLMapper 사용법은 XML 데이터를 손쉽게 다루는 데 매우 유용합니다. 이번 글에서는 Jackson을 통해 XML 데이터를 다루는 방법과 예제를 소개하고, Jackson의 XMLMapper 사용 시 주의할 사항을 안내합니다.

Jackson을 통한 JSON-XML 상호 변환

JSON과 XML은 서로 다른 데이터 포맷이지만, Jackson의 XmlMapper를 사용하면 쉽게 JSON-XML 상호 변환이 가능합니다. 이 기능은 REST API 응답 형식에 따라 JSON과 XML 포맷을 변환해야 하는 경우 매우 유용합니다.

JSON을 XML로 변환하는 예제

아래 예제에서는 ObjectMapper와 XmlMapper를 사용하여 JSON 데이터를 XML로 변환하는 방법을 보여줍니다. 예를 들어, 다음과 같은 JSON 객체가 있다고 가정합니다.

{
    "name": "김철수",
    "city": "서울",
    "age": 30
}

위 JSON을 Jackson의 XmlMapper를 사용하여 XML로 변환할 수 있습니다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class JsonToXmlExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper jsonMapper = new ObjectMapper();
        XmlMapper xmlMapper = new XmlMapper();

        String json = "{\"name\":\"김철수\", \"city\":\"서울\", \"age\":30}";

        // JSON 문자열을 Java 객체로 변환
        Person person = jsonMapper.readValue(json, Person.class);

        // Java 객체를 XML 문자열로 변환
        String xml = xmlMapper.writeValueAsString(person);
        System.out.println(xml);
    }
}

class Person {
    public String name;
    public String city;
    public int age;

    // 기본 생성자와 Getters/Setters
}

실행 결과로 다음과 같은 XML을 얻을 수 있습니다.

<Person>
  <name>김철수</name>
  <city>서울</city>
  <age>30</age>
</Person>

XML을 JSON으로 변환하는 예제

반대로, XML 데이터를 JSON 형식으로 변환할 수도 있습니다. Jackson의 XmlMapper를 사용하여 XML 데이터를 Java 객체로 읽은 후 ObjectMapper로 JSON으로 변환할 수 있습니다.

public class XmlToJsonExample {
    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        ObjectMapper jsonMapper = new ObjectMapper();

        String xml = "<Person><name>김철수</name><city>서울</city><age>30</age></Person>";

        // XML 문자열을 Java 객체로 변환
        Person person = xmlMapper.readValue(xml, Person.class);

        // Java 객체를 JSON 문자열로 변환
        String json = jsonMapper.writeValueAsString(person);
        System.out.println(json);
    }
}

출력 결과:

{
    "name": "김철수",
    "city": "서울",
    "age": 30
}
반응형

XML 데이터 직렬화/역직렬화 설정 및 사용 예제

Jackson의 XML 데이터 직렬화 및 역직렬화는 JSON과 유사하지만, XML 고유의 특성 때문에 추가적인 설정이 필요할 수 있습니다. XML에서 루트 요소네임스페이스 설정을 맞추는 것이 중요합니다.

XML 직렬화 예제

XmlMapper는 JSON을 XML로 직렬화할 때 루트 요소를 자동으로 추가합니다. 하지만 특정 루트 이름이 필요할 때는 @JacksonXmlRootElement를 사용할 수 있습니다.

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

@JacksonXmlRootElement(localName = "User")
class User {
    public String name;
    public String city;
    public int age;

    // 기본 생성자와 Getters/Setters
}

public class XmlSerializationExample {
    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        User user = new User();
        user.name = "박영희";
        user.city = "부산";
        user.age = 25;

        // 객체를 XML 문자열로 직렬화
        String xml = xmlMapper.writeValueAsString(user);
        System.out.println(xml);
    }
}

결과:

<User>
  <name>박영희</name>
  <city>부산</city>
  <age>25</age>
</User>

XML 역직렬화 예제

XML 데이터를 Java 객체로 역직렬화할 때는 JSON과 동일하게 XmlMapper의 readValue 메서드를 사용합니다.

public class XmlDeserializationExample {
    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        String xml = "<User><name>박영희</name><city>부산</city><age>25</age></User>";

        // XML 문자열을 Java 객체로 변환
        User user = xmlMapper.readValue(xml, User.class);
        System.out.printf("이름: %s, 도시: %s, 나이: %d%n", user.name, user.city, user.age);
    }
}

XMLMapper 사용법과 주의사항

XmlMapper는 Jackson의 ObjectMapper와 유사한 기능을 제공하지만, XML 처리에 특화된 몇 가지 특징이 있습니다. 사용 시 주의할 사항은 다음과 같습니다.

1. 루트 요소 설정

XML은 JSON과 달리 루트 요소가 필요합니다. @JacksonXmlRootElement 애노테이션을 사용하여 루트 요소 이름을 지정할 수 있으며, 이는 직렬화 결과의 루트 요소 이름을 명시적으로 지정할 때 유용합니다.

2. JacksonXmlProperty 애노테이션

Jackson의 @JsonProperty 대신 @JacksonXmlProperty를 사용하여 XML 필드 이름을 명시할 수 있습니다. 이 애노테이션을 사용하여 XML 구조를 더욱 세밀하게 제어할 수 있습니다.

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

class Address {
    @JacksonXmlProperty(localName = "주소")
    public String address;
    @JacksonXmlProperty(localName = "우편번호")
    public String postalCode;

    // 기본 생성자와 Getters/Setters
}

3. 네임스페이스 지원

XmlMapper는 네임스페이스를 처리할 수 있습니다. XML 문서에서 특정 네임스페이스가 필요하다면 @JacksonXmlProperty 애노테이션의 namespace 속성을 설정하면 됩니다.

@JacksonXmlRootElement(localName = "Person", namespace = "http://example.com")
class Person {
    @JacksonXmlProperty(localName = "name", namespace = "http://example.com")
    public String name;
    
    // 기본 생성자와 Getters/Setters
}

이렇게 하면 XML을 처리할 때 Jackson이 네임스페이스를 인식하고, XML 요소에 올바른 네임스페이스를 적용합니다.

참고 사이트

반응형