Bean Integration – Camel의 핵심 강점
Apache Camel은 기존 Java Bean(POJO)을 라우트에 쉽게 통합할 수 있습니다. 특별한 인터페이스를 구현하거나 Camel에 의존하는 코드를 작성하지 않아도 됩니다. 이것이 Service Activator 패턴의 핵심입니다.
Service Activator 패턴이란?
Service Activator 패턴은 메시지 기반 시스템에서 일반 서비스(Bean)를 메시지로 활성화하는 패턴입니다. Camel은 이 패턴을 통해 비즈니스 로직(Bean)을 메시지 라우팅 인프라로부터 완전히 분리합니다.
Bean을 라우트에 통합하는 방법
방법 1: .bean() 메서드
@Component
public class OrderService {
public Order processOrder(String json) {
// Camel을 모르는 순수한 비즈니스 로직
Order order = parseJson(json);
order.setStatus("PROCESSED");
return order;
}
public boolean isValid(Order order) {
return order.getAmount() > 0 && order.getCustomerId() != null;
}
}
// 라우트에서 사용
from("direct:newOrder")
.bean(OrderService.class, "processOrder") // 클래스 직접 지정
.log("처리 완료: ${body}");
방법 2: Bean 이름으로 참조 (Spring)
// Spring Bean이 자동 등록된 경우
from("direct:newOrder")
.bean("orderService", "processOrder") // Bean 이름으로 참조
.to("direct:validate");
방법 3: 메서드 지정 없이 (자동 선택)
// Camel이 적합한 메서드를 자동으로 찾음
from("direct:order")
.bean(OrderService.class); // 메서드 자동 선택
Exchange 접근이 필요한 Bean
@Component
public class AdvancedOrderService {
// Exchange를 직접 받아야 할 때
public void processWithContext(Exchange exchange) {
Message in = exchange.getIn();
String orderId = in.getHeader("orderId", String.class);
Order order = in.getBody(Order.class);
// 처리...
in.setBody(order);
in.setHeader("processed", true);
}
// Message를 직접 받는 방법
public Order process(Message message) {
return doProcess(message.getBody(Order.class));
}
}
Predicate로 Bean 활용
@Component
public class OrderValidator {
// Predicate로 활용: boolean 반환
public boolean isHighValue(Order order) {
return order.getAmount() > 500000;
}
// 헤더 검사
public boolean hasRequiredHeaders(@Header("customerId") String customerId,
@Header("orderDate") String date) {
return customerId != null && date != null;
}
}
// filter에서 Bean 사용
from("direct:orders")
.filter().method(OrderValidator.class, "isHighValue")
.to("direct:vipProcessing");
// choice에서 Bean 사용
from("direct:orders")
.choice()
.when().method(OrderValidator.class, "isHighValue")
.to("direct:vip")
.otherwise()
.to("direct:normal");
Expression으로 Bean 활용
@Component
public class OrderCalculator {
// Expression으로 활용: 값 반환
public String generateOrderId(Order order) {
return "ORD-" + System.currentTimeMillis() + "-" + order.getCustomerId();
}
}
from("direct:newOrder")
.setHeader("orderId", method(OrderCalculator.class, "generateOrderId"))
.log("주문 ID: ${header.orderId}");
Bean 통합의 장점
- 비즈니스 로직이 Camel에 종속되지 않음 → 단독 테스트 가능
- 기존 서비스 코드를 수정 없이 Camel에 통합 가능
- Spring의 의존성 주입과 완벽 호환
- 단위 테스트가 쉬운 깔끔한 코드 구조