Spring Integration
스프링 인테그레이션은 Enterprise Integration Patterns를 지원하기 위한 스프링 프로그래밍 모델 혹은 컴포넌트 이다.
리모팅, 메세징, 스케쥴링등의 고수준 추상화를 제공한다.
Message
Message는 스프링이 핸들링 하기 위한 메타데이터와 함께 자바 오브젝트를 갖는 래퍼 클래스이다.
헤더와 페이로드로 구성되어 있고, 페이로드는 어느 자바 오브젝트든 받을 수 있다.
헤더는 공통으로 사용하는 정보이다 예를들면 ID, 타임스탬프 등..
예를들어 수신한 파일을 메세지로 만들 때, 파일이름은 헤더에 저장된다.
개발자는 임의의 key-value쌍을 헤더에 저장할 수 있다.
Message Channel
프로듀서는 메세지를 채널로 보내고, 컨슈머는 채널로부터 메세지를 받는다.
point-to-point 혹은 publish-subscribe 모델링중 하나를 채택한다.
point-to-point일 경우, 하나의 메세지를 하나의 컨슈머만 받을 수 있다.
publish-subscribe 모델의 경우 각 메세지를 모든 subscriber에게 브로드캐스팅 한다.
MessageEndpoint
개발자는 프로듀서나 컨슈머를 직접 구현하지 않는다. 뿐만 아니라 메세지 생성, 메세지 채널에 전송 수신등의 구현 및 호출등을 할 필요도 없다.
선언적 설정을 통해 비즈니스 로직 및 모델을 메세징 인프라에 결합시킬 수 있다.
이러한 비즈니스 로직과 메세징 인프라에 결합시키는 역할을 하는 컴포넌트가 MessageEndpoint이다.
인바운드 리퀘스트를 서비스(비즈니스)레이어 호출로 전달하고, 서비스레이어의 리턴값을 아웃바운드 응답으로 전달한다.
Controller가 http Request를 다루듯이, message endpoint는 메세지를 다룬다.
controller가 url 패턴에 매핑되듯, message endpoint는 메세지 채널에 매핑된다.
Message Filter
메세지필터는 메세지가 아웃풋 채널로 전달될지를 결정한다.
체크 메소드를 통해 페이로드의 타입, 프로퍼티 value등등을 체크한다.
메세지가 받아들여진다면 아웃풋 채널로 메세지가 보내진다.
MessageRouter
메세지 라우터는 어떤 채널이 다음에 메세지를 받아야 하는지 결정한다.
일반적으로 메세지의 콘텐츠 혹은 헤더의 메타데이터를 통해 결정한다.
Splitter
스플리터는 message endpoint의 다른 타입으로, 인풋 채널 로부터 메세지를 받아서
여러개의 메세지로 찢어 각기 아웃풋 채널로 보낸다.
Aggregator
스플리터의 반대 기능을 하는 컴포넌트로, 여러 엔드포인트로부터 메세지를 받아서, 결합시켜서 하나의 메세지로 만든다.
aggregator는 여러 엔드포인트로부터 메세지를 받아야 하므로 메세지 아웃풋이 가능한지에 대한 상태를 관리해야 한다.
또한 타임아웃 발생 시 메세지를 버릴것인지, 일부만 보낼것인지, 분리된 채널로 보낼것ㅇ인지등을 고려해야 한다.
ServiceActivator
서비스 인스턴스를 메세징 시스템에 결합시키는 제네릭 엔드포인트 이다.
input channel은 반드시 설정되어야 하고, 메소드가 리턴값이 있다면 output channel또한 제공되어야 할 것이다(optional).
메세지의 헤더에 Return Address를 포함하는 경우 outputChannel이 필요없을 수도 있기 때문.
@ServiceActivator가 달리면 inputChannel로 설정된 메세지 발행시 해당 메소드가 호출되고, 메세지의 페이로드가 컨버팅 되어 파라미터로 들어간다.
또한 해당 메소드의 리턴타입은 응답 메세지로 컨버팅 되어 아웃풋 채널로 보내진다. output channel이 설정되어 있지 않다면, 메세지의 return address 헤더로 설정된
주소로 보내진다.
Channel Adapter
메세지 채널을 다른 시스템에 결합하는 어댑터 이다.
메세지와 타 시스템의 데이터를 매핑한다.
Endpoint Bean Names
엔드포인트를 컨슈밍 하는데는 두가지 빈이 필요하다. 컨슈머와 메세지 핸들러 이다.
컨슈머는 메세지핸들러를 참조하고, 호출한다.
컨슈머 이름이 someService라면, 핸들러 빈의 이름은 someService.handler다.
@Component
public class SomeComponent {
@ServiceActivator(inputChannel = ...)
public String someMethod(...) {
...
}
}
이러한 구성일 경우
컨슈머: someComponent.someMethod.serviceActivator
@EndpointId 어노테이션으로 빈 이름을 변경할 수 있다.
@Bean
@ServiceActivator(inputchannel = ...)
public MessageHandler someHandler() {
...
}
위와 같은 경우는 메세지핸들러 이름이 someHandler로 지정된다(Bean 생성)
빈 네임 또한 @EndpointId로 변경 가능하다.
@EnableIntegration
해당 어노테이션을 추가 시 여러가지 빈, 포스트 프로세서, 태스크 스케줄러 등등이 등록된다.
@EnablePublisher
해당 어노테이션을 추가하면 PublisherAnnotationBeanPostProcessor 가 등록되고, default-publisher-channel을 등록하여
@Publisher어노테이션이 있지만, channel어트리뷰트가 없는 퍼블리셔에게 디폴트 채널을 부여한다.
@GlobalChannelInterceptor
해당 어노테이션으로 글로벌하게 채널을 인터셉트하는 빈을 설정한다. @Component나 @Bean과 함께 적용한다.
ChannelInterceptor 를 구현해야 한다.
'SPRING' 카테고리의 다른 글
JPA 사용 시 Mysql 1356 Error 발생 해결 과정 (0) | 2023.12.08 |
---|---|
SpringBoot JpaRepository 를 Dependency Scan 에서 찾지 못할때 (0) | 2022.11.10 |
Spring Retry (0) | 2022.05.18 |
Spring Batch FaultTolerance (장애 허용) (0) | 2021.12.13 |
Spring Envers 로 자동 이력 관리 (0) | 2021.06.20 |