Spring in Action (5판)
- 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
- Walls, Craig 지음
- 제어펍 출판사
- 2020.05.14
스프링 인 액션 개인 스터디 내용을 정리하자.
스프링 통합
Spring Integration, 스프링 통합은 스프링 프로그래밍 모델의 확장을 제공하여 잘 알려진 Enterprise Integratoin Pattern을 지원한다.
즉, 통합 인터페이스를 위한 짜임 틀 역할이다.
주요 목표는 유지 보수 가능하고 테스트 가능한 코드를 생성하는데 필수적인 우려를 분리하면서 엔터프라이즈 통합 솔루션을 구축하기 위해 간단한 모델을 제공하는 것이다.
XML, 자바, DSL 3가지 방식으로 구성된다.
컴포넌트
메시지 채널
통합 파이프라인을 통해서 메시지가 이동하는 수단이다. 즉, 메시지 채널은 통합 플로우의 서로 다른 컴포넌트 간에 데이터를 전달하는 통로이다.
메시지는 페이로드와 헤더로 구성된다.
- 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
'Study > Spring in Action' 카테고리의 다른 글
[Spring in Action] 비동기 메시지, 메시지 시스템, AMQP (0) | 2021.01.24 |
---|---|
[Spring in Action] Stateless vs Stateful (0) | 2021.01.24 |
[Spring in Action] Spring RestTemplate (0) | 2021.01.24 |
[Spring in Action] Spring REST Sample 예제 (0) | 2021.01.24 |
[Spring in Action] Spring REST (0) | 2021.01.24 |