๊ฐœ๋ฐœ์ž HOON
๐Ÿ› HOON DEVLog
๊ฐœ๋ฐœ์ž HOON
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (137)
    • ๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„ (7)
    • ๐Ÿฆ” ์ทจ์—…์ค€๋น„ ๊ธฐ๋ก (7)
    • โ˜• ์ž๋ฐ” : JAVA (5)
    • ๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS (80)
    • ๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend (13)
    • ๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS (11)
    • ๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB (1)
    • ๐Ÿƒ‍โ™‚๏ธ DEVLOG (8)
    • โš™๏ธ Trouble Shooting (5)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • GitHub
  • Resume

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๊ฐœ๋ฐœ์ž HOON

๐Ÿ› HOON DEVLog

[Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(1) : ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ดํ•ด
๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend

[Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(1) : ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ดํ•ด

2023. 1. 6. 14:46

 

 

๐Ÿ 0. ์ด์ „ ๊ธ€ (0. ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์†Œ๊ฐœ)

 

 

[Spring WebFlux] 0. ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์†Œ๊ฐœ

๐Ÿค” 1. ๋ฆฌ์•กํ„ฐ(Reactor)๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? ๊ฐ„๋‹จ ์šฉ์–ด ์ •๋ฆฌ - Reactive Stream : JVM ์œ„์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ‘œ์ค€ํ™”์‹œํ‚จ ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ˜•ํƒœ๋กœ

hoons-dev.tistory.com

 

 

 

๐Ÿค” 1. Mono์™€ Flux๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

1-1. Flux

 

Flux<T>๋Š” Reactive Stream์˜ Publisher์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

ํผ๋ธ”๋ฆฌ์…”๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด, ์ง€๋‚œ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

 

๊ณต์‹ ๋ ˆํผ๋Ÿฐ์Šค์˜ Flux์ž…๋‹ˆ๋‹ค. "All Implemented Interfaces"๋ฅผ ํ™•์ธํ•˜๋ฉด, ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์—์„œ ์ •์˜ํ•œ Publisher<T>๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด Flux๊ฐ€ Item๋“ค์„ Produce(Emit)ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , Subscriber๊ฐ€ subscribeํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•„๋ฌด๋Ÿฐ ๋ฐ˜์‘์ด ์—†๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Flux๋Š” 0๊ฐœ๋ถ€ํ„ฐ N๊ฐœ๊นŒ์ง€์˜ Tํƒ€์ž…์˜ ์›์†Œ๋ฅผ ๋ฐฉ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. onNext ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋•Œ๋ถ€ํ„ฐ ๋ฐฉ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  onComplete ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์™„๋ฃŒํ•˜๊ณ , onError ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋‘ ์ด๋ฒคํŠธ๋Š” ํ„ฐ๋ฏธ๋„ ์ด๋ฒคํŠธ๋กœ ํ๋ฆ„์„ ์ข…๋ฃŒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ„ฐ๋ฏธ๋„ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ(ํŠธ๋ฆฌ๊ฑฐ)ํ•˜์ง€ ์•Š์œผ๋ฉด, Flux๋Š” ๋ฌดํ•œํžˆ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

 

 

Flux๋Š” Operator๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. Flux ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” Generate Operator, Flux๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” Transform Operator, ์‹œํ€€์Šค๋ฅผ ์กฐ์ ˆ/์กฐ์ž‘ํ•˜๋Š” Orchestrate Operator๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ณต์‹ ๋ ˆํผ๋Ÿฐ์Šค์˜, "Static Method" ํŒŒํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ Flux ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ™•์ธํ•ด๋ณด๋ฉด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๋ชจ๋‘ ๋‹ค ์ˆ™์ง€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ณ , ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํ•„์š”์‹œ ์„œ์นญํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

 

์˜†์˜ Instance Methods๋Š” Operator๋กœ, ๋น„๋™๊ธฐ ํ”„๋กœ์„ธ์‹ฑ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๊ณ  ๋น„๋™๊ธฐ ์‹œํ€€์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, instance method ํŒŒํŠธ์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ณง ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Flux์˜ subscribe๋‚˜, ๋ฉ€ํ‹ฐ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ธ Flux์˜ publish, publishNext๋Š” ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ „์šฉ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์ฒดํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๋ฅผ ์•ˆ์— ๋„ฃ๋Š” ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ฒˆ์—ญ์— ์˜ํ•œ ์„ค๋ช…์ด ๊ต‰์žฅํžˆ ์™€๋‹ฟ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์–˜๋“ค์„ ์จ์•ผ Flux์— ๋‹ด๊ธด Item๋“ค์ด ํ˜๋Ÿฌ๋“ค์–ด๊ฐ€๊ณ , lazily captured(ex. supplier์— ์˜ํ•ด ๊ฐ’์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ)์˜ ๊ฒฝ์šฐ์—” ์–˜๋“ค์ด ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

 

 

์œ„ ๊ทธ๋ฆผ์€ Flux๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ์˜ ๊ฐ ๋™๊ทธ๋ผ๋ฏธ๋Š” Flux๋กœ๋ถ€ํ„ฐ ๋น ์ ธ๋‚˜์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ƒ๋‹จ๊ณผ ํ•˜๋‹จ์˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ–ฅํ•˜๋Š” ํ™”์‚ดํ‘œ๋Š” Flux์˜ ํƒ€์ž„๋ผ์ธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ–ฅํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์˜ ํ๋ฆ„์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ๋ฅด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ฐ„์˜ ์ ์„ ๊ณผ operator ๋ฐ•์Šค๋Š”, Flux์— ์ ์šฉ๋˜๋Š” ๋ณ€ํ™˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ƒ๋‹จ ํ™”์‚ดํ‘œ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์˜ ์ˆ˜์ง์„ ์€ Flux์˜ ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•˜๊ณ , ํ•˜๋‹จ์˜ X๋Š” ์–ด๋– ํ•œ ์ด์œ ์— ์˜ํ•ด ๋น„์ •์ƒ์ ์ธ Flux ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

 

 

1-2. Mono

 

  Mono ์—ญ์‹œ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

Mono ์—ญ์‹œ Flux์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Reactive Stream์˜ Publisher๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Mono๋„ ์•„์ดํ…œ์„ produceํ•  ์ˆ˜ ์žˆ๊ณ , subscriber๊ฐ€ subscribeํ•˜๋ฉด Emit์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

 

Mono์™€ Flux์˜ ์ฐจ์ด๋Š”, ๋‚ด๋ถ€์˜ ์•„์ดํ…œ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

Flux๋Š” 0๊ฐœ~N๊ฐœ์˜ ์•„์ดํ…œ์„ ๋ฐฉ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜€๋‹ค๋ฉด, Mono๋Š” 0๊ฐœ~1๊ฐœ์˜ ์•„์ดํ…œ์„ ๋ฐฉ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

 

Mono ์—ญ์‹œ ๋™์ผํ•˜๊ฒŒ ๋‹ค์–‘ํ•œ Operator๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Flux์™€ ๋™์ผํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” static method๋“ค์ด ์žˆ๊ณ , ๋น„๋™๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹œํ€€์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” instance method๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Mono๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค. Flux์™€ ํฌ๊ฒŒ ๋‹ค๋ฅธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ Optional Item์ด Mono๋กœ๋ถ€ํ„ฐ ๋ฐฉ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ๋งŒ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

onNext ์‹ ํ˜ธ๋ฅผ ํ†ตํ•ด ์ตœ๋Œ€ ํ•˜๋‚˜์˜ ์•„์ดํ…œ์„ ๋ฐฉ์ถœํ•˜๊ณ , onComplete ์‹ ํ˜ธ๋ฅผ ํ†ตํ•ด Mono๊ฐ€ ์˜จ์ „ํžˆ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๊ณ , onError๋ฅผ ํ†ตํ•ด Mono์˜ ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿค” 2. Mono์™€ Flux์˜ ์‚ฌ์šฉ๋ฒ•

Mono์™€ Flux์˜ Operator๋Š” ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ๊ณต์‹ ๋ ˆํผ๋Ÿฐ์Šค์—์„œ๋„ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ™์ง€ํ•˜์ง€ ์•Š๊ณ , Which operator do I need? ์ฑ•ํ„ฐ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณด๊ณ  ๋ฒˆ์—ญ ๋ฐ ํ•™์Šตํ•œ ํฌ์ŠคํŠธ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๋กœ๋“œ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2023.01.06 - [๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend] - [Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(2) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” operator (method)

 

 

[๋งํฌ] https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html (Flux reactor reference)
[๋งํฌ] https://www.youtube.com/watch?v=v0BnqWLxYjQ&list=LL&index=7&t=77s (๋ฐฑ๊ธฐ์„ ๋‹˜ ์œ ํŠœ๋ธŒ)
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] @ControllerAdvice์™€ @ExceptionHandler  (0) 2023.03.18
[Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(2) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” operator (method)  (0) 2023.01.06
[Spring WebFlux] 0. ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์†Œ๊ฐœ  (1) 2023.01.01
[Spring JPA] @Enumerated์™€ AttributeConverter  (0) 2022.12.27
[Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)  (0) 2022.10.10
    '๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Spring] @ControllerAdvice์™€ @ExceptionHandler
    • [Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(2) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” operator (method)
    • [Spring WebFlux] 0. ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์†Œ๊ฐœ
    • [Spring JPA] @Enumerated์™€ AttributeConverter
    ๊ฐœ๋ฐœ์ž HOON
    ๊ฐœ๋ฐœ์ž HOON
    ์ข‹์€ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. # ์ฃผ๋‹ˆ์–ด # ๋ฐฑ์—”๋“œ # ๊ฐœ๋ฐœ์ž

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”