토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 인티그레이션 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.


Kotlin DSL은 Java DSL을 감싸 확장한 것으로, 기존 자바 API와 코틀린 특유의 구조를 함께 사용해서, 코틀린을 활용한 Spring Integration 개발을 가능한 한 쉽고 부드럽게 만드는 것을 목표로 한다.

Kotlin DSL을 위해 오버로드한 글로벌 함수 org.springframework.integration.dsl.integrationFlow를 임포트하기만 코틀린 DSL을 시작할 수 있다.

코틀린에서 람다로 IntegrationFlow를 정의할 땐 일반적으로 별다른 것이 필요하지 않으며 다음과 같이 빈을 선언해주는 게 전부다:

@Bean
fun oddFlow() =
IntegrationFlow { flow ->
    flow.handle<Any> { _, _ -> "odd" }
}

이 경우 코틀린은 람다를 IntegrationFlow 익명 인스턴스로 변환해야 함을 이해할 수 있으며, 타겟 Java DSL 프로세서는 이 설정을 적절히 자바 객체로 파싱해준다.

위 구조 대신 사용할 수 있는 방법이 하나 더 있는데, 아래 나오는 여러 가지 예제에서도 사용하는 방법이기도 하다. 이 방법은 빌더 패턴 스타일로 통합 플로우를 선언하는 것으로, 여기에선 코틀린 전용 DSL을 사용해야 한다:

@Bean
fun flowLambda() =
    integrationFlow {
        filter<String> { it === "test" }
        wireTap {
                    handle { println(it.payload) }
                }
        transform<String, String> { it.toUpperCase() }
    }

이 글로벌 integrationFlow() 함수는 KotlinIntegrationFlowDefinition(IntegrationFlowDefinition의 코틀린 래퍼wrapper)에 대한 람다를 빌더 스타일로 넘겨줄 것을 기대하며, 일반적인 IntegrationFlow 람다 구현체를 생성한다. 아래에서 더 많은 오버로딩 메소드 integrationFlow()를 확인해볼 수 있다.

상황에 따라서는 데이터 소스에서 IntegrationFlow를 시작해야 하는 경우가 많이 있다 (ex. JdbcPollingChannelAdapter, JmsInboundGateway 또는 기존 MessageChannel). 이를 위해 Spring Integration Java DSL에선 IntegrationFlows 팩토리의 수 많은 오버로딩 메소드 from()을 활용한다. 이 팩토리는 코틀린에서도 사용할 수 있다:

@Bean
fun flowFromSupplier() =
         IntegrationFlows.fromSupplier({ "bar" }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
                 .channel { c -> c.queue("fromSupplierQueue") }
                 .get()

하지만 안타깝게도 모든 from() 메소드가 코틀린 구조와 호환되는 것은 아니다. 이러한 틈을 메꾸기 위해 spring integration은 IntegrationFlows 팩토리를 중심으로 Kotlin DSL을 제공한다. Kotlin DSL은 integrationFlow() 함수를 여러 가지 버전으로 오버로딩하고 있다. KotlinIntegrationFlowDefinition에 대한 컨슈머를 이용해, 남은 플로우를 IntegrationFlow 람다로 선언해주면 위와 동일한 설정을 만들 수 있다. 하지만 이번에는 마지막에 get()을 호출하지 않아도 된다. 예를 들어:

@Bean
fun functionFlow() =
        integrationFlow<Function<String, String>>({ beanName("functionGateway") }) {
            transform<String, String> { it.toUpperCase() }
        }

@Bean
fun messageSourceFlow() =
        integrationFlow(MessageProcessorMessageSource { "testSource" },
                { poller { it.fixedDelay(10).maxMessagesPerPoll(1) } }) {
            channel { queue("fromSupplierQueue") }
        }

또한 코틀린에서 사용하려면 약간의 개선이 필요한 Java DSL API는 코틀린 익스텐션을 제공한다. 예를 들어 IntegrationFlowDefinition<*>Class<P> 인자를 받는 여러 가지 메소드를 실체화reify해야 할 필요가 있다:

@Bean
fun convertFlow() =
    integrationFlow("convertFlowInput") {
        convert<TestPojo>()
    }

연산자의 람다에서도 헤더에 접근해야 하는 경우 reified 타입은 전체 Message<*>가 될 수 있다.


Next :
System Management
메트릭 수집, 히스토리 기록, 메타데이터 보관, 컨트롤 버스 등 통합 애플리케이션의 운영과 관리에 필요한 기능들

전체 목차는 여기에 있습니다.

<< >>

TOP