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];