Java에서 XML을 JSON으로 변환

Posted by Albert 18Day 5Hour 42Min 10Sec ago [2026-02-19]

1. 의존성 설정 (Maven 기준)

pom.xml에 XML 처리를 위한 jackson-dataformat-xml 라이브러리가 필요합니다.

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

2. 변환 로직 예제

가장 직관적인 방법은 XML을 JsonNode로 읽어들인 뒤, 다시 JSON 문자열로 직렬화하는 것입니다.

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConverterController {

    @PostMapping(value = "/convert", consumes = "application/xml", produces = "application/json")
    public Object convertXmlToJson(@RequestBody String xmlInput) {
        try {
            // 1. XML을 읽기 위한 XmlMapper 객체 생성
            XmlMapper xmlMapper = new XmlMapper();
            JsonNode node = xmlMapper.readTree(xmlInput.getBytes());

            // 2. JSON으로 출력하기 위한 ObjectMapper 객체 생성
            ObjectMapper jsonMapper = new ObjectMapper();
            
            // 3. 객체 그대로 반환하면 Spring이 JSON으로 response 해줍니다.
            return node; 
            
        } catch (Exception e) {
            return "Error during conversion: " + e.getMessage();
        }
    }
}

3. 테스트 데이터 예시

Input (XML):

<User>
    <id>1</id>
    <name>Gemini</name>
    <email>hello@google.com</email>
</User>

Output (JSON):

{
    "id": "1",
    "name": "Gemini",
    "email": "hello@google.com"
}



4. 주의점

데이터베이스에서 **"부서별 팀원 목록"**을 가져온다고 가정해 보겠습니다.

Case A: 팀원이 2명 이상일 때 (정상 배열)

  • XML:
<Department>
    <TeamName>개발팀</TeamName>
    <Member>김철수</Member>
    <Member>이영희</Member>
</Department>
  • 변환된 JSON:
{
  "TeamName": "개발팀",
  "Member": ["김철수", "이영희"]  // [ ] 배열로 생성됨! (v-for 가능)
}

Case B: 팀원이 딱 1명일 때 (객체/문자열로 오해)

  • XML:
<Department>
    <TeamName>인사팀</TeamName>
    <Member>박지민</Member>
</Department>
  • 변환된 JSON (기본 설정 시):
{
  "TeamName": "인사팀",
  "Member": "박지민"  // [ ] 가 사라지고 문자열(또는 객체)이 됨! (v-for 에러 발생)
}

1) 왜 이게 문제인가요? (Vue3 관점)

Vue3 코드에서 데이터를 처리할 때 보통 다음과 같이 작성합니다.

HTML


<li v-for="name in department.Member" :key="name">
  {{ name }}
</li>
  • 개발팀: Member가 리스트이므로 이름이 두 줄로 잘 나옵니다.
  • 인사팀: Member가 문자열("박지민")이므로, v-for가 글자 하나하나를 쪼개서 '박', '지', '민'으로 출력하거나 리스트가 아니라는 에러를 던집니다.

2) 해결 방법 (서버단 vs 프론트단)

방법 1: 서버에서 DTO(Java Class) 사용 (가장 확실함)

Jackson에게 "이 필드는 무조건 리스트야!"라고 명시해주는 것입니다. JsonNode로 받는 대신 클래스를 정의합니다.

public class Department {
    public String TeamName;

    @JacksonXmlElementWrapper(useWrapping = false) // <Member>를 감싸는 별도 태그가 없을 때
    @JacksonXmlProperty(localName = "Member")
    public List<String> Member; // 무조건 List로 강제!
}

이렇게 하면 팀원이 1명이든 100명이든 JSON 응답은 항상 ["박지민"] 처럼 배열로 나갑니다.

방법 2: 프론트엔드(Vue3)에서 방어 코드 작성

서버 코드를 고치기 힘들다면, 데이터를 받자마자 배열로 변환해주는 유틸리티 함수를 씁니다.

// 컴포넌트 내부 로직
const rawData = response.data;

// Member가 배열이면 그대로 쓰고, 아니면 배열로 감싸버림
const members = Array.isArray(rawData.Member) 
                ? rawData.Member 
                : [rawData.Member];





LIST

Copyright © 2014 visionboy.me All Right Reserved.