[Camel in Action] 1-3. Camel 메시지 모델: Message와 Exchange 완전 이해

Camel의 데이터 흐름 모델

Apache Camel에서 모든 데이터는 Exchange 라는 컨테이너 안에 담겨 라우트를 통해 흐릅니다. Exchange를 이해하는 것은 Camel 개발의 핵심입니다.

Message – 실제 데이터 단위

Message는 Camel에서 실제로 전달되는 데이터 단위입니다. 세 가지 요소로 구성됩니다.

  • Body (본문): 실제 페이로드. String, byte[], InputStream, Java 객체 등 어떤 타입이든 가능합니다.
  • Headers (헤더): 메타데이터를 담는 Map<String, Object>. HTTP 헤더, JMS 속성 등이 여기에 담깁니다.
  • Attachments (첨부): MIME 멀티파트 첨부 파일 (이메일 등에서 사용)
// 메시지 조작 예시
.process(exchange -> {
    Message msg = exchange.getIn();
    String body = msg.getBody(String.class);
    msg.setHeader("processed", true);
    msg.setBody("처리된 데이터: " + body);
})

Exchange – 메시지를 담는 컨테이너

Exchange는 하나의 처리 단위로, 요청(In 메시지)과 응답(Out 메시지)을 함께 담습니다.

  • In Message: 입력 메시지. 라우트 전체에서 기본으로 접근하는 메시지입니다.
  • Out Message: 출력 메시지. Request-Reply 패턴에서 응답을 담습니다.
  • Exchange ID: 각 Exchange의 고유 식별자
  • Properties: Exchange 전체에 공유되는 Map. 라우트 실행 중 상태를 저장하는 데 사용됩니다.
  • Exception: 처리 중 발생한 예외가 저장됩니다.

Exchange Pattern (MEP)

Exchange는 두 가지 패턴을 지원합니다.

  • InOnly: 단방향 메시지. 응답이 필요 없는 이벤트 기반 통신. (예: JMS 큐에 메시지 전송)
  • InOut: 요청-응답 패턴. 응답이 필요한 경우. (예: HTTP REST 호출)
// Exchange Pattern 확인
.process(exchange -> {
    ExchangePattern pattern = exchange.getPattern();
    System.out.println("MEP: " + pattern); // InOnly 또는 InOut
})

Properties vs Headers – 언제 무엇을 쓰나?

헷갈리기 쉬운 Headers와 Properties의 차이점입니다.

  • Headers: 메시지와 함께 외부로 전달될 수 있는 메타데이터. 컴포넌트가 읽고 사용합니다.
  • Properties: Exchange 내부에서만 사용하는 데이터. 라우트의 상태나 컨텍스트 정보를 담습니다.
// Properties 활용 예시
.setProperty("startTime", simple("${date:now:yyyy-MM-dd HH:mm:ss}"))
.delay(1000)
.log("시작 시각: ${exchangeProperty.startTime}")

Body 타입 변환

Camel은 자동 타입 변환을 지원합니다. getBody(String.class)처럼 원하는 타입을 지정하면 자동으로 변환해줍니다.

// 자동 타입 변환
String text = exchange.getIn().getBody(String.class);
byte[] bytes = exchange.getIn().getBody(byte[].class);
InputStream is = exchange.getIn().getBody(InputStream.class);

다음 글에서는 Camel의 전체 아키텍처를 더 넓은 시각에서 살펴봅니다.

Leave a Comment