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

Was this helpful?