[Project Reactor] 14. Sequence 분할/그룹화를 위한 오퍼레이터 (7)

y001·2025년 5월 2일

Reactive Programming

목록 보기
21/30
post-thumbnail

1. buffer(n) – 데이터를 n개씩 모아서 List로 emit

buffer(n)은 스트림에서 emit되는 데이터를 n개 단위로 묶어 List 형태로 전달하는 오퍼레이터이다. 마지막 남은 데이터도 모아서 emit한다.

예제

Flux.range(1, 95)
    .buffer(10)
    .subscribe(System.out::println);

출력

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[11, 12, ..., 20]
...
[91, 92, 93, 94, 95]

2. bufferTimeout(n, duration) – 개수 또는 시간 기준으로 List emit

bufferTimeout(n, d)는 다음 조건 중 하나라도 충족되면 데이터를 List로 emit한다:

  • n개의 데이터가 모였을 때
  • 마지막 emit 이후 d 시간이 지났을 때

예제

Flux.range(1, 20)
    .map(num -> {
        Thread.sleep(100); // 일부러 지연
        return num;
    })
    .bufferTimeout(3, Duration.ofMillis(400))
    .subscribe(System.out::println);

출력

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
...
[19, 20]

3. window(n) – 데이터를 n개씩 분할하여 작은 Flux로 emit

window(n)buffer(n)과 유사하지만, 데이터를 List로 묶는 대신 작은 단위의 Flux로 나눈다.
→ 결과 타입은 Flux<Flux<T>>.
보통 flatMap() 또는 concatMap()을 이용해 내부 Flux를 처리한다.

예제

Flux.range(1, 11)
    .window(3)
    .flatMap(flux -> {
        System.out.println("New Window");
        return flux.collectList()
            .doOnNext(list -> System.out.println("Window Contents: " + list))
            .flatMapMany(list -> MathFlux.sumInt(Flux.fromIterable(list)));
    })
    .subscribe(sum -> System.out.println("Window Sum: " + sum));

출력

New Window
Window Contents: [1, 2, 3]
Window Sum: 6
New Window
Window Contents: [4, 5, 6]
Window Sum: 15
New Window
Window Contents: [7, 8, 9]
Window Sum: 24
New Window
Window Contents: [10, 11]
Window Sum: 21

4. groupBy(keyMapper) – 데이터를 key에 따라 그룹화

groupBy(keyFn)은 데이터를 특정 키 기준으로 GroupedFlux로 나눠 emit한다.
Flux<GroupedFlux<K, V>> 형태가 되며, 각 그룹은 key()를 가지고 있다.

예제

Flux.range(1, 95)
    .groupBy(num -> num % 10)
    .flatMap(groupedFlux ->
        groupedFlux.collectList()
            .map(list -> List.of(groupedFlux.key(), list))
    )
    .subscribe(data -> System.out.println("data: " + data));

출력 (일부)

data: [0, [10, 20, 30, ..., 90]]
data: [1, [1, 11, 21, ..., 91]]
data: [2, [2, 12, 22, ..., 92]]
...

오퍼레이터동작 방식반환 타입특징 요약
buffer(n)n개씩 묶어서 List로 emitFlux<List<T>>가장 단순한 분할 방식
bufferTimeout(n,d)n개 모이거나 d시간 지나면 emitFlux<List<T>>시간 기반 버퍼링 지원
window(n)n개씩 묶인 작은 Flux를 emitFlux<Flux<T>>내부 Flux 처리 필요
groupBy(keyFn)key 값 기준으로 GroupedFlux 생성Flux<GroupedFlux<K,T>>동적 그룹핑에 유리

0개의 댓글