MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

XML Java 레코드 변환기

샘플 XML에서 Java 레코드를 만들고, 키가 자바 필드 이름과 다를 때만 Jackson 어노테이션을 붙입니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

JSON 키가 Java 이름과 다를 때 필요합니다.

XML → 데이터 매핑

속성은 이 문자로 시작하는 키가 되어 id="1"은 @id가 됩니다. 비우면 속성 이름 그대로 씁니다.

속성이나 자식 요소와 함께 있는 텍스트는 이 키에 담습니다.

끄면 <item>이 하나일 땐 객체, 여러 개일 땐 배열이 됩니다. 켜면 개수와 상관없이 구조가 같습니다.

끄면 모든 값이 문자열로 남습니다. 켜면 true/false, 정수, 소수는 해당 타입이 되고 007이나 긴 ID는 문자열로 둡니다.

XML 입력

21줄491byte

결과

⌘/Ctrl + Enter로 복사
결과 · Payload.java
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

public record Payload(
    PayloadOrder order
) {}

record PayloadOrder(
    @JsonProperty("@id")
    long id,
    @JsonProperty("@status")
    String status,
    PayloadOrderCustomer customer,
    PayloadOrderItems items,
    double total,
    @JsonProperty("shipped_at")
    String shippedAt,
    String tracking
) {}

record PayloadOrderCustomer(
    @JsonProperty("@id")
    long id,
    @JsonProperty("@vip")
    boolean vip,
    String name,
    String email
) {}

record PayloadOrderItems(
    List<PayloadOrderItemsItem> item
) {}

record PayloadOrderItemsItem(
    @JsonProperty("@sku")
    String sku,
    @JsonProperty("@qty")
    long qty,
    String name,
    double price
) {}
타입5
크기769byte

이 도구는 샘플 XML을 Java record 선언으로 바꿉니다. 먼저 모든 XML 변환기가 공유하는 규칙으로 XML을 데이터로 매핑하고, 레코드는 그 데이터를 설명합니다. 루트 레코드는 public, 중첩 레코드는 package-private이며 모두 한 파일에 들어가므로 결과를 .java 파일 하나에 그대로 붙여 넣을 수 있습니다.

이름은 자바 관례를 따라 @sku는 컴포넌트 sku, xml:lang은 xmlLang이 됩니다. 키가 컴포넌트 이름과 다를 때마다 Jackson의 @JsonProperty("@sku")가 붙어 ObjectMapper가 정확한 키로 읽고 씁니다. 레코드는 XML 자체가 아니라 변환된 데이터를 위한 모델이어서 JAXB 어노테이션과는 맞지 않습니다.

XML은 정확한 행·열 오류를 알려 주는 엄격한 XML 1.0 파서가 읽으며 20 MiB까지 처리하고 브라우저를 벗어나지 않습니다.

사용 방법

  1. XML 붙여넣기

    문서를 붙여 넣거나 API 응답, 중첩 배열, 엣지 케이스 예제를 고릅니다. 입력하면 레코드가 바로 갱신됩니다.

  2. 매핑 조정

    XML 데이터 매핑 패널에서 속성 접두사, 텍스트 키, 항상 배열, 숫자 추론을 정합니다. 추론을 끄면 모든 컴포넌트가 String입니다.

  3. Java 옵션 정하기

    루트 레코드 이름(기본 Payload), 선택 사항인 패키지, Jackson @JsonProperty 어노테이션을 쓸지를 고릅니다.

  4. 레코드 읽기

    루트 레코드가 맨 위에 옵니다. List와 JsonProperty import는 코드에서 실제로 쓸 때만 나타납니다.

  5. 복사 또는 다운로드

    코드를 복사하거나 public 루트 레코드 이름의 Payload.java로 내려받습니다.

작동 원리

XML 값이 Java 타입이 되는 방식

매핑이 끝나면 모든 키에 타입이 정해집니다. 자바 레코드에는 기본값이 없으므로, 항상 있는 값은 기본형으로, 빠질 수 있는 값은 래퍼 타입으로 만듭니다.

데이터Java 타입비고
텍스트StringCDATA와 빈 요소 포함
7, 3000000000long정수는 모두 long, 선택이면 Long
19.5double선택이면 Double
trueboolean선택이면 Boolean
반복 요소List<Item>java.util.List import 추가
007, 2^53보다 큰 IDString추론 규칙상 텍스트로 유지
한 위치에 종류가 섞임List<Object>예: <v>1</v><v>a</v>

어노테이션, 이름, Jackson 스위치

컴포넌트 이름은 접두 문자를 뺀 키의 카멜 케이스이고, 자바 키워드와 겹치거나 숫자로 시작하는 이름은 안전한 이름으로 바뀝니다. @JsonProperty는 컴포넌트 이름이 키와 다를 때만 붙으므로 customer에는 없고 @id, #text에는 있습니다. Jackson 옵션을 끄면 이 어노테이션과 import가 사라져 키가 다시 매핑되지 않습니다.

반복 요소의 모든 발생은 키의 합집합을 가진 레코드 하나가 됩니다. 일부에서 빠진 키는 Long, Double, Boolean, 레코드 클래스 같은 참조 타입이 되어 Jackson이 null로 채웁니다.

record PayloadOrderItem(
    @JsonProperty("@sku")
    String sku,
    @JsonProperty("@qty")
    Long qty
) {}

자식이 하나일 때와 여럿일 때

<item>이 하나면 레코드 컴포넌트, 둘 이상이면 List입니다. 실제 데이터의 개수가 달라질 수 있으면 자식 요소는 항상 배열로 옵션을 켜세요. 그렇지 않으면 더 긴 문서에서 Jackson이 입력 불일치 예외를 던집니다.

실제 예시

반복 항목이 있는 주문
입력
<order id="1042"><item sku="A1" qty="1">Pen</item><item sku="B7">Ink</item></order>
출력
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

public record Payload(
    PayloadOrder order
) {}

record PayloadOrder(
    @JsonProperty("@id")
    long id,
    List<PayloadOrderItem> item
) {}

record PayloadOrderItem(
    @JsonProperty("@sku")
    String sku,
    @JsonProperty("@qty")
    Long qty,
    @JsonProperty("#text")
    String text
) {}

두 item이 레코드 하나를 공유합니다. 키가 이름과 다른 컴포넌트에만 @JsonProperty가 붙고, 한 item에 없는 qty는 래퍼 Long입니다.

네임스페이스와 하이픈이 있는 이름
입력
<doc xml:lang="en" data-id="5"><title>Hi</title></doc>
출력
import com.fasterxml.jackson.annotation.JsonProperty;

public record Payload(
    PayloadDoc doc
) {}

record PayloadDoc(
    @JsonProperty("@xml:lang")
    String xmlLang,
    @JsonProperty("@data-id")
    long dataId,
    String title
) {}

xml:lang은 xmlLang, data-id는 dataId가 되고 어노테이션에 실제 키가 남습니다. data-id는 기본형 long입니다.

Jackson 옵션을 끈 경우
입력
<doc xml:lang="en" data-id="5"><title>Hi</title></doc>
출력
public record Payload(
    PayloadDoc doc
) {}

record PayloadDoc(
    String xmlLang,
    long dataId,
    String title
) {}

어노테이션이 없으면 Jackson이 @xml:lang, @data-id 키를 맞출 수 없습니다. 키를 직접 바꿀 때만 이 설정을 쓰세요.

자주 하는 실수

  • 레코드는 Java 16 이상이 필요합니다

    결과는 record를 씁니다. 더 낮은 런타임이라면 컴포넌트를 final 필드와 getter로 다시 쓰고 @JsonProperty는 그대로 유지하세요.

  • 어노테이션이 없으면 @ 키를 찾지 못합니다

    id라는 컴포넌트는 키 @id와 맞지 않습니다. Jackson 옵션을 켜 두거나 매핑 패널에서 속성 접두사를 빈 문자열로 바꾸세요.

  • 기본형과 래퍼 타입

    항상 있는 컴포넌트는 기본형이라, 이후 문서에서 null이 오면 역직렬화가 실패합니다. 그런 경우가 있다면 샘플에 값이 빠진 사례를 넣어야 합니다.

  • 정수는 모두 long

    3도 long이고 19.0은 숫자 19로 읽힙니다. 도메인에 필요하면 int나 BigDecimal로 직접 바꾸세요.

자주 묻는 질문

getter가 있는 클래스가 아니라 왜 레코드인가요?

레코드는 선언 하나로 불변 데이터 객체를 만들고 Jackson 2.12 이상이 역직렬화할 수 있습니다. 더 낮은 자바를 쓴다면 직접 클래스로 바꾸세요.

@JsonProperty는 언제 붙나요?

자바 컴포넌트 이름이 데이터의 키와 다를 때만 붙습니다. @id, #text, xml:lang이 그런 경우이고 일반 요소 이름에는 붙지 않습니다.

JAXB와 함께 쓸 수 있나요?

아니요. JAXB는 @XmlAttribute, @XmlElement가 필요합니다. 이 레코드는 XML to JSON 변환기가 만드는 변환 데이터를 위한 모델입니다.

package 줄은 어떻게 써지나요?

패키지 옵션을 채우면 맨 위에 package com.acme;가 추가됩니다. 비워 두면 기본 패키지입니다.

리스트가 왜 List<Object>인가요?

같은 요소 이름에 숫자와 단어처럼 종류가 다른 값이 있어 하나의 자바 타입으로 표현할 수 없기 때문입니다.

문서가 업로드되나요?

아니요. 모든 처리가 브라우저에서 이뤄지고 XML은 서버로 가지 않습니다.

마지막 업데이트: