리액티브 프로그래밍에서 데이터 스트림을 처리하는 방식은 애플리케이션의 성능과 효율성에 큰 영향을 미칩니다. 리액터(Reactor)와 같은 리액티브 라이브러리는 퍼블리셔(Publisher)와 서브스크라이버(Subscriber)의 개념을 통해 데이터 흐름을 관리하며, 이 중 콜드 퍼블리셔는 온디맨드 방식의 데이터 생성 및 전달을 가능하게 하는 중요한 역할을 합니다.
콜드 퍼블리셔는 구독자가 구독하기 전까지는 데이터를 생성하지 않는 데이터 소스입니다. 마치 주문을 받고 나서야 요리를 시작하는 셰프와 같다고 생각할 수 있습니다. 각 구독자는 퍼블리셔에 구독할 때마다 독립적인 데이터 스트림을 받게 되며, 이는 다른 구독자의 데이터 스트림에 영향을 받지 않습니다. 넷플릭스를 예로 들면, 각 사용자는 동일한 영화를 시청하더라도 서로 독립적인 스트림을 통해 시청하며, 한 사용자가 영화를 일시 정지하거나 되감더라도 다른 사용자의 시청 경험에는 영향을 미치지 않습니다.
Java의 Reactor 라이브러리에 Flux.create
메서드는 콜드 퍼블리셔를 생성하는 대표적인 방법 중 하나입니다. 이 메서드를 사용하면 퍼블리셔의 동작을 직접 정의할 수 있으며, 각 구독자에게 독립적인 데이터 스트림을 제공할 수 있습니다.
예시 코드 분석:
var flux = Flux.create(fluxSink -> {
log.info("invoked");
for (int i = 0; i < 3; i++) {
fluxSink.next(i);
}
fluxSink.complete();
});
flux.subscribe(Util.subscriber("sub1"));
flux.subscribe(Util.subscriber("sub2"));
위 코드에서 Flux.create
는 콜드 퍼블리셔를 생성합니다. 각 구독자가 구독할 때마다 FluxSink가 새로 생성되며, 이로 인해 두 구독자(sub1, sub2)는 동일한 데이터(1, 2, 3)를 독립적으로 받게 됩니다. 따라서 각 구독자는 독립적인 데이터 스트림을 통해 데이터를 받게 된다는 점을 알수 있습니다.
결론:
콜드 퍼블리셔는 리액티브 프로그래밍에서 온디맨드 데이터 처리를 위한 강력한 도구입니다. 각 구독자에게 독립적인 데이터 스트림을 제공함으로써 리소스를 효율적으로 사용하고 유연한 데이터 처리를 가능하게 합니다. Flux.create
와 같은 메서드를 사용하여 콜드 퍼블리셔를 생성하고, 이를 통해 리액티브 애플리케이션의 성능과 효율성을 향상시킬 수 있습니다.
핫 퍼블리셔는 구독자의 존재 여부와 관계없이 데이터를 생성하고 방출하는 데이터 소스입니다. 라디오 방송국을 생각해 보면, 방송국은 청취자가 있든 없든 계속해서 방송을 송출합니다. 핫 퍼블리셔에 새로운 구독자가 추가되면, 해당 구독자는 현재 방출되고 있는 데이터부터 수신하게 됩니다. 따라서 핫 퍼블리셔는 실시간 데이터 스트림을 처리하는 데 적합합니다.
publish().autoConnect(0)
메서드는 콜드 퍼블리셔를 핫 퍼블리셔로 변환 시킬수 있습니다. 이 메서드를 사용하면 구독자 수와 관계없이 데이터 스트림을 시작하고 유지할 수 있습니다.
예시 코드 분석:
var movieFlux = movieStream().publish().autoConnect(0);
Util.sleepSeconds(2);
movieFlux
.take(4)
.subscribe(Util.subscriber("sam"));
Util.sleepSeconds(3);
movieFlux
.take(3)
.subscribe(Util.subscriber("mike"));
Util.sleepSeconds(15);
private static Flux<String> movieStream() {
return Flux.generate(
() -> {
log.info("received the request");
return 1;
},
(state, sink) -> {
var scene = "movie scene " + state;
log.info("playing {}", scene);
sink.next(scene);
return ++state;
}
)
.take(10)
.delayElements(Duration.ofSeconds(1))
.cast(String.class);
}
위 코드에서 movieStream().publish().autoConnect(0)
는 핫 퍼블리셔를 생성합니다. sam
이 2초 후 구독하고, mike
는 5초 후 구독합니다. sam
은 처음부터 4개의 영화 장면을 보고, mike
는 sam
이 이미 본 장면부터 이어서 3개의 장면을 보게 됩니다.
결론:
핫 퍼블리셔는 실시간 데이터 처리 및 리소스 공유가 중요한 경우에 유용합니다. publish().autoConnect(0)
와 같은 메서드를 사용하여 콜드 퍼블리셔를 핫 퍼블리셔로 변환하고, 실시간 데이터 스트림을 효율적으로 처리할 수 있습니다.
어떤 유형의 퍼블리셔를 선택할지는 애플리케이션의 요구 사항에 따라 달라집니다.
콜드 퍼블리셔와 핫 퍼블리셔는 리액티브 프로그래밍에서 데이터 스트림을 처리하는 두 가지 중요한 방식입니다. 각 유형의 특징과 차이점을 이해하고 적절하게 활용함으로써 효율적이고 강력한 리액티브 애플리케이션을 구축할 수 있습니다. 😊