Categories: Camel프레임워크

[Camel in Action] 3-4. Camel 타입 컨버터 메커니즘과 커스텀 컨버터 작성

타입 컨버터가 왜 필요한가?

Camel 라우트에서 메시지 본문은 다양한 타입일 수 있습니다. 어떤 컴포넌트는 String을 기대하고, 다른 컴포넌트는 InputStream을 기대합니다. 타입 컨버터(Type Converter)는 이런 타입 불일치를 자동으로 해결해줍니다.

타입 컨버터 동작 원리

Camel은 시작 시 클래스패스를 스캔해 @Converter 어노테이션이 달린 메서드들을 TypeConverterRegistry에 등록합니다. 이후 getBody(TargetType.class)가 호출되면 적합한 컨버터를 찾아 자동 변환합니다.

내장 타입 컨버터 활용

// 자동 변환 - 내장 컨버터 사용
from("direct:test")
    .process(e -> {
        // String → Integer 자동 변환
        Integer num = e.getIn().getBody(Integer.class);

        // String → InputStream 자동 변환
        InputStream is = e.getIn().getBody(InputStream.class);

        // byte[] → String 자동 변환
        String text = e.getIn().getBody(String.class);
    });

// convertBodyTo() DSL
from("direct:input")
    .convertBodyTo(String.class)  // 본문을 String으로 변환
    .convertBodyTo(String.class, "UTF-8")  // 인코딩 지정
    .log("${body}");

커스텀 타입 컨버터 작성

// 1. @Converter 클래스 정의
@Converter(generateBulkLoader = true)  // 성능 최적화
public class OrderTypeConverter {

    @Converter
    public static Order fromString(String csv) {
        String[] parts = csv.split(",");
        return new Order(parts[0], parts[1], Double.parseDouble(parts[2]));
    }

    @Converter
    public static String toString(Order order) {
        return order.getId() + "," + order.getCustomer() + "," + order.getAmount();
    }

    @Converter
    public static Order fromMap(Map<String, String> map) {
        return new Order(map.get("id"), map.get("customer"),
                        Double.parseDouble(map.get("amount")));
    }
}
// 2. TypeConverterLoader 파일 생성
// src/main/resources/META-INF/services/org/apache/camel/TypeConverterLoader
// 내용: com.example.OrderTypeConverter

@Converter 어노테이션 옵션

  • @Converter: 기본 컨버터 메서드 표시 (static 또는 instance 메서드 모두 가능)
  • @FallbackConverter: 매칭되는 컨버터가 없을 때 최후 수단으로 호출
@Converter
public class FallbackConverter {
    @FallbackConverter
    public static <T> T convertTo(Class<T> type, Exchange exchange, Object value,
                                   TypeConverterRegistry registry) {
        // 커스텀 폴백 로직
        if (type == Order.class && value instanceof Map) {
            return (T) new Order((Map) value);
        }
        return null;
    }
}

TypeConverter 성능 최적화

// 벌크 로더 방식 (시작 시 빠른 등록)
@Converter(generateBulkLoader = true)
public class FastConverter {
    @Converter
    public static Order fromJson(String json, Exchange exchange) {
        ObjectMapper mapper = exchange.getContext()
            .getRegistry().lookupByNameAndType("objectMapper", ObjectMapper.class);
        try {
            return mapper.readValue(json, Order.class);
        } catch (Exception e) {
            return null;
        }
    }
}

TypeConverterRegistry 직접 접근

@Autowired
CamelContext camelContext;

void registerConverter() {
    TypeConverterRegistry registry = camelContext.getTypeConverterRegistry();
    registry.addTypeConverter(Order.class, String.class,
        (type, exchange, value) -> Order.fromCsv((String) value));
}

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