Categories: Camel프레임워크

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

EIP란 무엇인가?

“Enterprise Integration Patterns”(Hohpe, Woolf, 2003)은 분산 시스템 통합의 바이블입니다. 65가지 패턴을 정의했고, Apache Camel은 이 패턴들을 코드 레벨에서 직접 구현할 수 있게 해줍니다. 가장 자주 사용하는 20가지를 Camel 코드와 함께 정리합니다.

메시지 라우팅 패턴 (Routing Patterns)

// 1. Content-Based Router (CBR) - 내용 기반 라우팅
from("direct:order")
  .choice()
    .when(simple("${body.type} == 'VIP'")).to("direct:vipOrder")
    .when(simple("${body.amount} > 10000")).to("direct:largeOrder")
    .otherwise().to("direct:standardOrder")
  .end();

// 2. Message Filter - 조건 필터링
from("direct:allEvents")
  .filter(simple("${body.priority} == 'HIGH'"))
  .to("direct:urgentEvents");

// 3. Splitter - 메시지 분할
from("direct:orderBatch")
  .split(body()).to("direct:singleOrder");

// 4. Aggregator - 메시지 집계
from("direct:parts")
  .aggregate(header("correlationId"), new BodyConcatAggregationStrategy())
    .completionSize(5)
  .to("direct:assembled");

// 5. Resequencer - 순서 재정렬
from("direct:outOfOrder")
  .resequence(header("seqNo")).stream()
  .to("direct:inOrder");

메시지 변환 패턴 (Transformation Patterns)

// 6. Message Translator - 메시지 형식 변환
from("direct:xmlOrder")
  .unmarshal().jacksonXml(OrderXml.class)
  .process(exchange -> {
    OrderXml xml = exchange.getIn().getBody(OrderXml.class);
    exchange.getIn().setBody(OrderJson.from(xml));
  })
  .marshal().json();

// 7. Content Enricher - 데이터 보강
from("direct:basicOrder")
  .enrich("direct:getCustomerDetails",
    (original, enriched) -> {
      original.getIn().getBody(Order.class)
        .setCustomer(enriched.getIn().getBody(Customer.class));
      return original;
    });

// 8. Content Filter - 불필요한 데이터 제거
from("direct:fullMessage")
  .process(exchange -> {
    FullMessage msg = exchange.getIn().getBody(FullMessage.class);
    exchange.getIn().setBody(new SlimMessage(msg.getId(), msg.getEssential()));
  });

// 9. Normalizer - 여러 형식을 통일
from("direct:xmlInput").unmarshal().jacksonXml(Order.class).to("direct:normalized");
from("direct:jsonInput").unmarshal().json(Order.class).to("direct:normalized");
from("direct:csvInput").unmarshal().bindy(BindyType.Csv, OrderCsv.class)
  .process(e -> e.getIn().setBody(OrderCsv.toOrder(e.getIn().getBody(OrderCsv.class))))
  .to("direct:normalized");

메시지 엔드포인트 패턴 (Endpoint Patterns)

// 10. Polling Consumer - 주기적 폴링
from("file:inbox?delay=5000").to("direct:process");

// 11. Event-Driven Consumer - 이벤트 기반 소비
from("activemq:queue:orders").to("bean:orderService");

// 12. Idempotent Consumer - 중복 처리 방지
from("activemq:queue:payments")
  .idempotentConsumer(header("paymentId"),
    MemoryIdempotentRepository.memoryIdempotentRepository(1000))
  .to("bean:paymentService");

// 13. Selective Consumer - 선택적 소비 (JMS Message Selector)
from("activemq:queue:orders?selector=priority='HIGH'")
  .to("bean:priorityOrderService");

// 14. Dead Letter Channel - 실패 메시지 격리
errorHandler(deadLetterChannel("activemq:queue:DLQ")
  .maximumRedeliveries(3).redeliveryDelay(1000));

메시징 채널 패턴 (Channel Patterns)

// 15. Point-to-Point Channel - 일대일 전송 (큐)
template.sendBody("activemq:queue:singleReceiver", message);

// 16. Publish-Subscribe Channel - 일대다 전송 (토픽)
template.sendBody("activemq:topic:broadcast", message);

// 17. Datatype Channel - 타입별 채널
from("direct:raw").choice()
  .when(body().isInstanceOf(Order.class)).to("activemq:queue:orders")
  .when(body().isInstanceOf(Invoice.class)).to("activemq:queue:invoices");

// 18. Wire Tap - 감청/복제
from("direct:main").wireTap("direct:audit").to("direct:process");

// 19. Message Bus - 공통 메시지 버스
from("activemq:topic:enterprise-bus").to("bean:routingService");

// 20. Correlation Identifier - 연관 메시지 추적
from("direct:request")
  .setHeader("correlationId", simple("${id}"))
  .to("activemq:queue:async-process");

zerg96

Recent Posts

AI 해킹 시대, 4대 은행이 해외 법인 보안망부터 다시 짜는 이유

국내 금융권에서 AI를 이용한 해킹과 대규모 정보유출이 잇따르자, 은행들이 이제 해외 법인과 지점의 보안까지 다시…

1시간 ago

서울 집값은 11% 올랐는데 거래는 17% 줄었다, 토허제 1년의 역설

서울 전역이 토지거래허가구역으로 묶인 지 1년이 됐습니다. 집을 못 팔게 막으면 값이 내려갈 거라는 기대도…

1시간 ago

코스피 5연속 급락 뒤 2% 반등, 외국인·기관이 받쳤고 코스닥은 제자리

어제 5거래일 연속으로 밀렸던 코스피가 오늘 아침 확 반등했습니다. 오전 9시 12분 기준 코스피는 6,165.02로…

1시간 ago

네이버 vs 카카오, 한국 AI 전쟁의 진짜 승자는 누구인가?

네이버 하이퍼클로바X vs 카카오 AI — 한국 양대 IT 기업의 AI 전쟁, 기술 역량과 플랫폼…

2시간 ago

GPU를 사지 않고 빌린다? 네이버·아마존·구글이 같은 주에 꺼낸 AI 인프라 카드

AI 이야기는 이제 "어떤 모델이 더 똑똑한가"에서 "누가 계산 자원을 더 싸고 안정적으로 쥐고 있나"로…

2시간 ago

코스피 5.46% 급락 다음 날, 오늘 밤 9시 30분 미국 CPI가 진짜 변수인 이유

어제 코스피가 하루에 348.89포인트, 5.46% 빠지면서 6,035.35로 마감했습니다. 장중에는 5,911선까지 밀렸다가 겨우 6,000선 위로 올라왔는데요,…

3시간 ago