Categories: Camel프레임워크

[Camel in Action] 4-1. Camel에서 Bean 사용하기 – Service Activator 패턴

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의 의존성 주입과 완벽 호환
  • 단위 테스트가 쉬운 깔끔한 코드 구조

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