[Spring in Action] Spring Integration 스프링 통합하

728x90
반응형
SMALL

Spring in Action (5판)

  • 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
  • Walls, Craig 지음
  • 제어펍 출판사
  • 2020.05.14

 

스프링 인 액션 개인 스터디 내용을 정리하자.

 

 

 

 


스프링 통합

Spring Integration, 스프링 통합은 스프링 프로그래밍 모델의 확장을 제공하여 잘 알려진 Enterprise Integratoin Pattern을 지원한다.

 

즉, 통합 인터페이스를 위한 짜임 틀 역할이다.

 

주요 목표는 유지 보수 가능하고 테스트 가능한 코드를 생성하는데 필수적인 우려를 분리하면서 엔터프라이즈 통합 솔루션을 구축하기 위해 간단한 모델을 제공하는 것이다.

 

XML, 자바, DSL 3가지 방식으로 구성된다.

출처 : https://codingideas.blog/spring-integration-notes-in-progress

 

컴포넌트

메시지 채널

통합 파이프라인을 통해서 메시지가 이동하는 수단이다. 즉, 메시지 채널은 통합 플로우의 서로 다른 컴포넌트 간에 데이터를 전달하는 통로이다.

메시지는 페이로드와 헤더로 구성된다.

  • PublishSubscribeChannel : 하나 이상의 컨슈머로 전달된다.
@Bean
public MessageChannel samplePSChannel() {
    return new PublishSubscribeChannel();   // PublishSubscribeChannel 사용
}
@ServiceActivator(inputChannel="samplePSChannle")

 

  • QueueChannel : FIFIO 방식으로 컨슈머가 가져갈 때까지 큐에 저장된다.
@Bean
public MessageChannel sampleQChannel() {
    return new QueueChannel();  // QueueChannel 사용
}
@ServiceActivator(inputChannel="sampleQChannle", poller=@Poller(fixedRate="1000"))

 

  • PriorityChannel : 메시지의 priority 헤더를 기반으로 컨슈머가 메시지를 가져간다.
  • DirectChannel (Default) : 컨슈머가 메시지를 수신할 때까지 메시지 전송자가 채널을 차단한다. (전송자와 컨슈머 동기화)
  • ExecutorChannel : TaskExecutor를 통해서 메시지가 전송된다. 
  • FluxMessageChannel : Project Reactor의 Flux를 기반으로 하는 Reactive Streams Publisher 채널이다.

필터

통합 파이프라인 중간에 위치하며, 조건을 기반으로 플로우의 전 단계로부터 다음 단계로의 메시지 전달을 허용/불허 한다.

@Filter(inputChannel="numberChannel", outputChannel="evenNumberChannel")
public boolean evenNumberFilter(Integet number) {
    return number % 2 == 0; // 숫자를 받아 짝수만 전달
}

 

변환기

통합 플로우를 거쳐가는 메시지의 값이나 타입을 변환하는 일을 수행한다.

@Bean
@Transformer(inputChannel="numberChannel", outputChannel="romanNumberChannel")
public GernericTransformer<Integer, String> romanNumTransformer() {
    return RomanNumbers::toRoman; // 숫자를 받아 로마 숫자를 포함하는 문자열로 변환하여 전달
}

 

라우터

메시지에 적용된 조건을 기반으로 서로 다른 채널로 메시지를 분기한다.

@Bean
@Router(inputChannel="numberChannel")
public AbstractMessageRouter evenOddRouter() {
    return new AbstractMessageRouter() {
        @Overrid
        protected determineTargetChannel() {
            // 홀수, 짝수 판단하여 분기 로직
        }
    }
}
 
@Bean
public MessageChannel evenChannel() {   // 짝수인 경우 이 채널로
    return new DirectChannel();
}
 
@Bean
public MessageChannel oddChannel() {    // 홀수인 경우 이 채널로
    return new DirectChannel();
}

 

분배기

통합 플로우에서 하나의 메시지를 여러 개로 분할하여 하위 플로우에서 독립적으로 처리할 수 있게 한다.

public class SampleSplitter {
    // 로직
}
 
@Bean
@Splitter(inputChannel="ichannel", outputChannel="ochannel")
public SampleSplitter sampleSplitter() {
    return new SampleSplitter(); // 정의한 splitter 생성
}

 

서비스 액티베이터

입력 채널로부터 메시지를 수신하고 이 메시지를 MessageHandler 인터페이스를 통해 구현한 클래스에 전달(서비스 호출)한다.

@Bean
@ServiceActivator(inputChannel="ichannel")
public MessageHandler sysoutHandler() {
    return message -> {
        System.out.println("Message Payload : " + message.getPayload()); // 다른 서비스 호출도 가능
    };
}

 

게이트웨이

애플리케이션이 통합 플로우로 데이터를 제출하고 선택적으로 플로우의 처리 결과인 응답을 받을 수 있는 수단이다.

즉, 애플리케이션이 통합 플로우로 메시지를 전송할 수 있는 인터페이스다.

@Component
@MessagingGateway(defaultRequestChannel="ichannel", defaultReplyChannel="ochannel")
public interface UpperCaseGateway {
    String uppercase(String in);
}

 

채널 어댑터

통합 플로우의 입구와 출구 역할을 한다. 데이터는 인바운드 채널 어댑터를 통해 통합 플로우로 들어오고, 아웃바운드 채널 어댑터를 통해 통합 플로우에서 나간다.

@Bean
@InboundChannelAdapter(poller=@Poller(fixedRate="1000"), channel="numberChannel")
public MessageSource<Integer> numberSource(AtomicInteger source) {
    return () -> {
        return newGenericMessage<>(source.getAndIncrement());
    };
}

 

엔드포인트 모듈

스프링 통합은 다양한 채널 어댑터를 생성할 수 있게 해준다.

https://docs.spring.io/spring-integration/reference/html/endpoint-summary.html

 

Integration Endpoints

This section covers the various channel adapters and messaging gateways provided by Spring Integration to support message-based communication with external systems. Each system, from AMQP to Zookeeper, has its own integration requirements, and this section

docs.spring.io

 

728x90
반응형
LIST