Categories: Camel프레임워크

[Camel in Action] 3-2. XML 변환 – XSLT와 JAXB 마샬링/언마샬링

XML 변환 in Camel

많은 엔터프라이즈 시스템이 XML 형식으로 데이터를 교환합니다. Camel은 XML 처리를 위한 강력한 도구들을 내장하고 있습니다.

XSLT 변환

XSLT(Extensible Stylesheet Language Transformations)로 XML 구조를 다른 XML이나 텍스트로 변환합니다.

<!-- src/main/resources/order-transform.xsl -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <order>
            <id><xsl:value-of select="//orderId"/></id>
            <amount><xsl:value-of select="//totalAmount"/></amount>
        </order>
    </xsl:template>
</xsl:stylesheet>
// 라우트에서 XSLT 적용
from("direct:xmlInput")
    .to("xslt:order-transform.xsl")  // 클래스패스에서 XSLT 로드
    .log("변환 완료: ${body}");

JAXB – XML ↔ Java 객체 변환

JAXB 어노테이션이 달린 Java 클래스와 XML 사이를 자동 변환합니다.

// JAXB 어노테이션으로 XML 구조 정의
@XmlRootElement(name = "order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order {
    @XmlAttribute
    private String id;

    @XmlElement(name = "customer-name")
    private String customerName;

    @XmlElement
    private double amount;
    // getter, setter...
}
// Camel에서 JAXB 마샬링/언마샬링
JaxbDataFormat jaxb = new JaxbDataFormat(Order.class.getPackage().getName());

from("file:xml-orders?noop=true")
    .unmarshal(jaxb)              // XML → Order 객체
    .log("주문 ID: ${body.id}")
    .process(e -> {
        Order o = e.getIn().getBody(Order.class);
        o.setAmount(o.getAmount() * 1.1);  // 10% 추가
    })
    .marshal(jaxb)                // Order 객체 → XML
    .to("file:processed-orders");

XPath로 XML 쿼리

from("direct:xmlOrder")
    // XPath로 값 추출
    .setHeader("orderId", xpath("//order/@id"))
    .setHeader("amount", xpath("//order/amount/text()", Double.class))
    // XPath로 조건 분기
    .choice()
        .when(xpath("//order/priority = 'HIGH'"))
            .to("direct:highPriority")
        .otherwise()
            .to("direct:normal")
    .end();

Jackson으로 XML ↔ JSON 변환

// camel-jackson-xml 의존성 필요
JacksonXMLDataFormat xmlFormat = new JacksonXMLDataFormat(Order.class);
JsonDataFormat jsonFormat = new JsonDataFormat(JsonLibrary.Jackson);
jsonFormat.setUnmarshalType(Order.class);

from("direct:xmlToJson")
    .unmarshal(xmlFormat)    // XML → Java 객체
    .marshal(jsonFormat)     // Java 객체 → JSON
    .to("direct:jsonOutput");

Namespace 처리

// XPath에서 네임스페이스 처리
Namespaces ns = new Namespaces("o", "http://example.com/order");

from("direct:namespacedXml")
    .setHeader("orderId", xpath("//o:order/@id", ns))
    .to("direct:process");

DOM vs SAX – 성능 고려

  • DOM: 전체 문서를 메모리에 로드. 작은 XML에 적합.
  • SAX/StAX: 스트리밍 방식. 대용량 XML 처리에 적합.
  • Camel의 Splitter와 StAX를 결합하면 수 GB짜리 XML도 효율적으로 처리 가능

zerg96

Share
Published by
zerg96

Recent Posts

정보처리기사 필기·실기 일정 읽는 법 — 2026년 3회차 실기까지의 흐름

정보처리기사는 필기와 실기가 따로 접수되기 때문에 일정표가 복잡해 보입니다. 2026년 일정표를 바탕으로 필기에서 실기까지의 흐름을…

9시간 ago

회계·세무 자격증 로드맵 — 전산회계에서 재경관리사, 공인회계사까지 2026 일정

회계와 세무 분야 자격증은 입문용부터 국가전문자격까지 단계가 넓습니다. 일정표 자료로 확인된 시험을 중심으로, 어떤 시험이…

9시간 ago

금융투자협회 자격증 한눈에 — 투자권유 자문·대행인과 투자자산운용사 2026 일정

금융투자협회가 시행하는 자격시험은 투자권유자문인력, 투자권유대행인, 투자자산운용사처럼 이름이 비슷한 종목이 많아 처음 보면 헷갈립니다. 일정표 자료를…

9시간 ago

자격증 접수 기간·시험·발표 간격 비교 — 접수 마감을 놓치지 않는 일정 읽기

자격증마다 접수 기간이 며칠인지, 접수가 끝나고 시험까지 얼마나 걸리는지, 시험 후 발표까지 얼마나 기다려야 하는지는…

9시간 ago

ITQ·GTQ·DIAT 차이 한눈에 — 사무·그래픽 자격증 선택법과 2026 일정

ITQ, GTQ, DIAT는 모두 PC 활용 능력을 보여 주는 민간 자격이지만 시행기관과 평가 방식이 다릅니다.…

9시간 ago

컴퓨터활용능력 1급 2급 차이 — 시험 과목, 합격 기준, 상시시험 접수 요령

컴퓨터활용능력은 사무직 취업과 학점 인정 목적으로 가장 많이 응시하는 국가기술자격 중 하나입니다. 1급과 2급은 시험…

9시간 ago