Mono & Flux

Mono와 FluxλŠ” Spring WebFluxκ°€ 기반으둜 ν•˜λŠ” Project Reactor λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ‚¬μš©ν•˜λŠ” 핡심 Publisher νƒ€μž…μž…λ‹ˆλ‹€.

  • 이 λ‘˜μ€ λ°˜μ‘ν˜• 슀트림(Reactive Stream)μ—μ„œ λ°μ΄ν„°μ˜ 흐름을 μ •μ˜ν•˜λŠ” μ—­ν• 

  • λͺ¨λ“  비동기 μž‘μ—…μ€ 이 두 νƒ€μž…μ„ 톡해 ν‘œν˜„λ˜κ³  처리됨

Mono

MonoλŠ” 0개 λ˜λŠ” μ΅œλŒ€ 1개의 κ²°κ³Όλ§Œμ„ λ°©μΆœν•˜λŠ” Publisher이닀.

  • μ‹ ν˜Έ(Signal)

    • onNext(T): 데이터λ₯Ό 1개 전달(μ΅œλŒ€ ν•œ 번 λ°œμƒ)

    • onComplete(): λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŒμ„ μ•Œλ¦Ό(onNext 이후 λ˜λŠ” λ‹¨λ…μœΌλ‘œ λ°œμƒ)

    • onError(Throwable): μž‘μ—… 쀑 μ—λŸ¬ λ°œμƒμ„ μ•Œλ¦Ό

  • μ£Όμš” μ‚¬μš© 사둀

    • ID둜 단일 데이터 쑰회 (findById)

    • 데이터 생성, μˆ˜μ •, μ‚­μ œ ν›„ κ²°κ³Ό λ°˜ν™˜

    • 총 개수 μ„ΈκΈ° (count)

// "Hello"λΌλŠ” 단일 데이터λ₯Ό ν¬ν•¨ν•˜λŠ” Mono 생성
Mono<String> monoJust = Mono.just("Hello");

// 데이터 없이 μž‘μ—… μ™„λ£Œ(onComplete) μ‹ ν˜Έλ§Œ λ³΄λ‚΄λŠ” Mono 생성
Mono<Void> monoEmpty = Mono.empty();

// μ—λŸ¬(onError) μ‹ ν˜Έλ§Œ λ³΄λ‚΄λŠ” Mono 생성
Mono<String> monoError = Mono.error(new RuntimeException("Error occurred"));

Flux

FluxλŠ” 0κ°œλΆ€ν„° Nκ°œκΉŒμ§€, μ—¬λŸ¬ 개의 κ²°κ³Όλ₯Ό 슀트림 ν˜•νƒœλ‘œ λ°©μΆœν•˜λŠ” Publisher이닀.

  • μ‹ ν˜Έ(Signal)

    • onNext(T): 데이터λ₯Ό 1개 전달(μ—¬λŸ¬ 번 λ°œμƒ κ°€λŠ₯)

    • onComplete(): λͺ¨λ“  데이터 슀트림이 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŒμ„ μ•Œλ¦Ό

    • onError(Throwable): 슀트림 처리 쀑 μ—λŸ¬ λ°œμƒμ„ μ•Œλ¦Ό

  • μ£Όμš” μ‚¬μš© 사둀

    • μ—¬λŸ¬ 개의 데이터 λͺ©λ‘ 쑰회 (findAll)

    • λ°μ΄ν„°λ² μ΄μŠ€ μ»€μ„œλ‚˜ λ©”μ‹œμ§€ νλ‘œλΆ€ν„° 데이터 슀트리밍

    • μ‹€μ‹œκ°„ 이벀트 슀트림 (예: 주식 μ‹œμ„Έ, μ•Œλ¦Ό)

핡심 μ—°μ‚°μž

Mono와 FluxλŠ” 데이터λ₯Ό 가곡, 필터링, μ‘°ν•©ν•˜κΈ° μœ„ν•œ ν’λΆ€ν•œ μ—°μ‚°μžλ₯Ό μ œκ³΅ν•˜λ©°, 이 μ—°μ‚°μžλ“€μ€ 체인 ν˜•νƒœλ‘œ μ—°κ²°ν•˜μ—¬ 데이터 νŒŒμ΄ν”„λΌμΈμ„ ꡬ성할 수 μžˆλ‹€.

  • 생성(Creation): just(), fromIterable(), range()

  • λ³€ν™˜(Transformation)

    • map(): 동기적인 1:1 λ³€ν™˜

      • A νƒ€μž…μ˜ μš”μ†Œλ₯Ό B νƒ€μž…μœΌλ‘œ λ³€ν™˜

    • flatMap(): 비동기적인 1:N λ³€ν™˜

      • 각 μš”μ†Œλ₯Ό μƒˆλ‘œμš΄ Monoλ‚˜ Flux둜 λ³€ν™˜ ν›„, κ·Έ κ²°κ³Όλ₯Ό ν•˜λ‚˜μ˜ 슀트림으둜 평탄화(예: User 객체둜 Order λͺ©λ‘μ„ 쑰회)

  • 필터링(Filtering)

    • filter(): μ£Όμ–΄μ§„ 쑰건(Predicate)을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ§Œ ν†΅κ³Όμ‹œν‚΄

  • μ‘°ν•©(Combining)

    • zip(): μ—¬λŸ¬ 슀트림의 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© 짝지어 μƒˆλ‘œμš΄ 슀트림 생성

    • merge(): μ—¬λŸ¬ μŠ€νŠΈλ¦Όμ„ λ„μ°©ν•˜λŠ” μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ˜ 슀트림으둜 ν•©μΉ¨

ꡬ독(Subscribe)ν•˜κΈ° μ „μ—λŠ” 아무 일도 μΌμ–΄λ‚˜μ§€ μ•ŠμŒ

Monoλ‚˜ Fluxλ₯Ό μƒμ„±ν•˜κ³  μ—°μ‚°μžλ₯Ό μ²΄μ΄λ‹ν•˜λŠ” 것은 단지 μ‹€ν–‰ κ³„νšμ„ λ§Œλ“œλŠ” 것일 뿐, μ‹€μ œ λ°μ΄ν„°μ˜ 흐름은 μ‹œμž‘λ˜μ§€ μ•ŠλŠ”λ‹€.

.subscribe() λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— λΉ„λ‘œμ†Œ 데이터가 흐λ₯΄κΈ° μ‹œμž‘ν•˜λ©°, Spring WebFluxμ—μ„œλŠ” ν”„λ ˆμž„μ›Œν¬κ°€ 이 역할을 μˆ˜ν–‰ν•˜λ―€λ‘œ κ°œλ°œμžκ°€ 직접 ν˜ΈμΆœν•  일은 거의 μ—†λ‹€.

Last updated