[Camel in Action] 2-1. Camel Java DSL로 라우트 작성하기 – RouteBuilder 완전 정복

Java DSL – Camel의 가장 강력한 인터페이스

Apache Camel의 Java DSL은 메서드 체이닝(Fluent API) 방식으로 라우팅 규칙을 정의합니다. IDE의 자동 완성 지원을 받을 수 있고, 컴파일 시점에 오류를 잡을 수 있어 실무에서 가장 많이 사용됩니다.

RouteBuilder의 기본 구조

import org.apache.camel.builder.RouteBuilder;

@Component
public class ShopRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        // 오류 처리 전역 설정
        errorHandler(deadLetterChannel("jms:queue:dead-letter")
            .maximumRedeliveries(3)
            .redeliveryDelay(1000));

        // 라우트 정의
        from("direct:newOrder")
            .routeId("order-route")
            .description("신규 주문 처리 라우트")
            .log("신규 주문: ${body}")
            .choice()
                .when(simple("${body.amount} > 100000"))
                    .to("direct:vipOrder")
                .otherwise()
                    .to("direct:normalOrder")
            .end();
    }
}

자주 사용하는 DSL 메서드들

  • from(uri): 라우트 시작점 정의
  • to(uri): 메시지 전송 (동기)
  • toD(uri): 동적 URI로 전송
  • log(message): 로깅
  • process(processor): 커스텀 처리
  • transform(expression): 메시지 본문 변환
  • setBody(expression): 본문 설정
  • setHeader(name, expression): 헤더 설정
  • filter(predicate): 조건부 필터링
  • choice() / when() / otherwise(): 조건 분기

direct: 컴포넌트로 라우트 연결

direct: 컴포넌트는 동일한 CamelContext 내에서 라우트 간 직접 호출에 사용됩니다. 메서드 호출처럼 동기적으로 동작합니다.

from("direct:orderInput")
    .to("direct:validateOrder")
    .to("direct:saveOrder")
    .to("direct:notifyUser");

from("direct:validateOrder")
    .log("주문 유효성 검사 중...")
    .bean(OrderValidator.class);

표현식(Expression)과 술어(Predicate)

DSL에서 조건이나 값을 지정할 때 다양한 표현식 언어를 사용할 수 있습니다.

// Simple 언어 (가장 많이 사용)
.when(simple("${header.orderType} == 'URGENT'"))
.setBody(simple("주문번호: ${header.orderId}, 금액: ${body.amount}"))

// Constant
.setHeader("source", constant("web-shop"))

// Bean 표현식
.setBody(method(MyBean.class, "processOrder"))

// SpEL (Spring Expression Language)
.when(spel("#{request.headers['user-agent'].contains('Mobile')}")))

라우트 ID와 관리

모든 라우트에는 고유 ID를 부여하는 것이 좋습니다. 모니터링, 동적 관리, 로그 추적에 필수적입니다.

from("timer:heartbeat?period=60000")
    .routeId("system-heartbeat")
    .routeGroup("monitoring")
    .autoStartup(true)
    .log("시스템 정상 동작 중");

람다로 간결하게 Processor 정의

from("direct:process")
    .process(e -> {
        String input = e.getIn().getBody(String.class);
        e.getIn().setBody(input.trim().toUpperCase());
    })
    .log("처리 완료: ${body}");

Leave a Comment