Categories: Camel프레임워크

[Camel in Action] 3-3. Camel 데이터 포맷 완전 정복 – CSV, JSON, Bindy

Camel 데이터 포맷(Data Format)이란?

데이터 포맷은 Java 객체와 바이트 스트림(또는 문자열) 사이를 변환하는 플러그인입니다. marshal()로 객체를 직렬화하고 unmarshal()로 역직렬화합니다. Camel은 20개 이상의 내장 데이터 포맷을 제공합니다.

JSON 데이터 포맷 – Jackson

<!-- pom.xml -->
<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-jackson-starter</artifactId>
</dependency>
// JSON 변환
from("direct:input")
    .unmarshal().json(JsonLibrary.Jackson, Order.class)  // JSON → Order
    .log("주문 ID: ${body.id}")
    .process(e -> e.getIn().getBody(Order.class).setStatus("PROCESSED"))
    .marshal().json(JsonLibrary.Jackson)  // Order → JSON
    .to("direct:output");

// List로 언마샬링
from("direct:jsonArray")
    .unmarshal().json(JsonLibrary.Jackson, List.class)
    .split(body())
        .log("항목: ${body}")
    .end();

CSV 데이터 포맷

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-csv-starter</artifactId>
</dependency>
CsvDataFormat csv = new CsvDataFormat();
csv.setDelimiter(';');
csv.setSkipHeaderRecord(true);  // 헤더 행 건너뛰기

from("file:csv-inbox?noop=true&include=.*\.csv")
    .unmarshal(csv)  // CSV → List<List<String>>
    .split(body())   // 각 행 처리
        .log("행 데이터: ${body}")
        .process(e -> {
            List<String> row = e.getIn().getBody(List.class);
            String orderId = row.get(0);
            double amount = Double.parseDouble(row.get(1));
            // 처리...
        })
    .end();

Bindy – 어노테이션 기반 포맷 매핑

Bindy는 Java 어노테이션으로 고정 길이 포맷, CSV, FIX(금융 메시지) 등을 매핑합니다.

// CSV 매핑 클래스
@CsvRecord(separator = ",", skipFirstLine = true)
public class OrderRecord {
    @DataField(pos = 1)
    private String orderId;

    @DataField(pos = 2)
    private String customerName;

    @DataField(pos = 3, pattern = "yyyy-MM-dd")
    private Date orderDate;

    @DataField(pos = 4, precision = 2)
    private BigDecimal amount;
}

// 고정 길이 포맷 매핑
@FixedLengthRecord
public class FixedOrderRecord {
    @DataField(pos = 1, length = 10)
    private String orderId;

    @DataField(pos = 11, length = 30)
    private String customerName;

    @DataField(pos = 41, length = 12, pattern = "yyyyMMddHHmm")
    private Date orderDate;
}
// Bindy 사용
BindyCsvDataFormat bindyCsv = new BindyCsvDataFormat(OrderRecord.class);

from("file:csv-inbox?noop=true")
    .unmarshal(bindyCsv)    // CSV → List<OrderRecord>
    .split(body())
        .log("주문: ${body.orderId} 금액: ${body.amount}")
    .end();

Avro – 스키마 기반 직렬화

// Kafka와 함께 Avro 사용
AvroDataFormat avro = new AvroDataFormat(Order.SCHEMA$);

from("kafka:orders?brokers=kafka:9092")
    .unmarshal(avro)
    .log("Avro 주문: ${body}");

데이터 포맷 자동 설정

# application.properties로 데이터 포맷 전역 설정
camel.dataformat.json-jackson.pretty-print=true
camel.dataformat.json-jackson.include=NON_NULL
camel.dataformat.csv.delimiter=;

zerg96

Share
Published by
zerg96

Recent Posts

[Apache Camel] 2025년 최신 트렌드 – AI 통합과 서버리스 Camel의 미래

2025년 Apache Camel의 최신 트렌드를 분석합니다. AI/LLM 통합 컴포넌트, 서버리스 배포, Camel K 진화, WebAssembly…

9시간 ago

[Camel in Action] 완결편 – Apache Camel 전체 여정 회고와 다음 단계

Camel in Action을 완독한 후 Apache Camel의 전체 그림을 다시 정리합니다. 핵심 철학, 학습 경로,…

9시간 ago

[Camel in Action] 실전편 – Camel 마이그레이션 가이드 2.x에서 4.x까지

Apache Camel 2.x에서 3.x, 4.x로 마이그레이션하는 단계별 가이드입니다. 주요 API 변경사항, 제거된 컴포넌트, 자동화 도구…

9시간 ago

[Camel in Action] 실전편 – Camel 라우트 디버깅 기법과 문제 해결 가이드

Apache Camel 라우트에서 발생하는 문제를 디버깅하고 해결하는 실전 기법을 설명합니다. 로그 분석, breakpoint 디버깅, Tracer,…

9시간 ago

[Camel in Action] 실전편 – Camel 도입 전 반드시 알아야 할 것들

Apache Camel을 프로젝트에 도입하기 전 알아야 할 핵심 사항을 정리합니다. 학습 곡선, 도입 비용, 적합한…

9시간 ago

[Camel in Action] 실전편 – Enterprise Integration Patterns 20가지 핵심 정리

엔터프라이즈 통합 패턴(EIP) 20가지를 Apache Camel 코드와 함께 한 번에 정리합니다. 메시징 채널, 메시지 라우팅,…

9시간 ago