Spring Framework/Spring WebFlux

[WebFlux] Reactive Streams

soogoori 2024. 7. 3. 15:24

Reactive Programming

โœณ๏ธ ์ „ํ†ต์ ์ธ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ API๋‚˜ Future์™€ ๊ฐ™์€ JDK์˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ์‹์— ๋น„ํ•ด ๋” ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ 

1. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฐ„์†Œํ™” : ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ŠคํŠธ๋ฆผ์˜ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ํ†ตํ•ด ๊ฐ ๋‹จ๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

2. ์„ ์–ธ์  API ์ œ๊ณต : Reactor, RxJava์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” map, filter, reduce์™€ ๊ฐ™์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„

3. backPressure ์ง€์› : ๋ฐ์ดํ„ฐ ์†Œ๋น„์ž๊ฐ€ ๋ฐ์ดํ„ฐ ์ƒ์‚ฐ์ž์˜ ์†๋„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ 

4. ๋ณต์žก์„ฑ ๊ฐ์†Œ์™€ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ : ์—ฐ์‚ฐ์ž ์ฒด์ด๋‹์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ๋†’์ด๊ณ  ๊ฐ ๋‹จ๊ณ„์˜ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•จ

 

  • stream (์ŠคํŠธ๋ฆผ)
    • ๋ฐ์ดํ„ฐ์˜ ์—ฐ์†์ ์ธ ํ๋ฆ„
  • event-driven (์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜)
    • ์™ธ๋ถ€ ํ™˜๊ฒฝ์ด๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜์—ฌ ๋™์ž‘
    • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ์— ๋”ฐ๋ผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ 
  • Async (๋น„๋™๊ธฐ์„ฑ)
    • ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฒฐ๊ณผ๋Š” ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ด๋ฒคํŠธ๋‚˜ ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋จ

 

 

 

Reactive Streams

๋น„๋™๊ธฐ์ ์ด๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ‘œ์ค€ ์ •์˜ 
  • Publisher 
    • ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ์—ญํ•  
    • onSubscribe, onNext, onError, onComplete ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก 
      • onSubscribe : subscription ๊ฐ์ฒด ์ „๋‹ฌ
      • onNext : subscriber๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌ 
      • onComplete : ๋ชจ๋“  ์•„์ดํ…œ์ด ์ „๋‹ฌ ์™„๋ฃŒ๋˜์–ด ๋” ์ด์ƒ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ ํ˜ธ์ถœ -> publisher์™€ subscriber ์—ฐ๊ฒฐ ์ข…๋ฃŒ
      • onError : ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ ํ˜ธ์ถœ
    • subscribe ํ•จ์ˆ˜ ์ œ๊ณตํ•ด์„œ publisher์— ๋‹ค์ˆ˜์˜ subscriber ๋“ฑ๋ก ์ง€์›
    • ColdPublisher 
      • subscriber๊ฐ€ ๊ตฌ๋…ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
    • HotPublisher
      • ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด ๊ตฌ๋…์ž์—๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ , ์ŠคํŠธ๋ฆผ์ด ์ด๋ฏธ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ subscriber๊ฐ€ ์ŠคํŠธ๋ฆผ์— ์ ‘๊ทผํ•จ
      • ๋ชจ๋“  subscriber๊ฐ€ ์ŠคํŠธ๋ฆผ ๊ณต์œ ํ•˜๋ฉฐ ํ˜„์žฌ ์ƒํƒœ๋‚˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์Œ

 

  • Subscriber
    • ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• 
    • subscribeํ•˜๋Š” ์‹œ์ ์— publisher๋กœ๋ถ€ํ„ฐ subscription์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ธ์ž ์ œ๊ณต

 

  • Subscription
    • Publisher์™€ Subscriber ๊ฐ„์˜ ์—ฐ๊ฒฐ
    • ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ œ์–ด 

 


โœณ๏ธ ๊ตฌํ˜„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • Project reactor
    • Mono์™€ Flux publisher ์ œ๊ณต 
    • Flux : 0๊ฐœ ์ด์ƒ์˜ ์š”์†Œ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ๐Ÿ‘‰ ๋‹ค์ˆ˜์˜ ์š”์†Œ ์ฒ˜๋ฆฌ โ‰’ List<T>
    • Mono : ์ตœ๋Œ€ 1๊ฐœ์˜ ์š”์†Œ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ๐Ÿ‘‰ ๋‹จ์ผ ๊ฐ’์ด๋‚˜ ๋นˆ ๊ฐ’ ์ฒ˜๋ฆฌ โ‰’ Optional<T>
    • subscribeOn() : ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ŠคํŠธ๋ฆผ์ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•จ 
๐ŸšจFlux์—์„œ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๋Š”๋ฐ Mono๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ..? 

1. ๋ช…ํ™•ํ•œ ์˜๋„ ํ‘œํ˜„ = ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์ด ๋‹จ์ผ ํ•ญ๋ชฉ์ž„
2. Mono<Void>๋กœ ํŠน์ • ์‚ฌ๊ฑด์ด ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Œ 
3. onNext ์ดํ›„ ๋ฐ”๋กœ onComplete๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ๋” ๊ฐ„๋‹จ 
  • RxJava

 

 

 

Reactor

1. Reactive Streams๋ฅผ ๊ตฌํ˜„ํ•œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์ง€์›
2. Spring WebFlux์—์„œ ๋ฉ”์ธ์œผ๋กœ ์‚ฌ์šฉ
3. backpressure๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์•ˆ์ •์„ฑ ๋†’์ž„
4. ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž๋กœ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ ์ฆ๋Œ€ 
  • subscribe : subscribe๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด์ผ๋„ ์ƒ๊ธฐ์ง€ X 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ 

https://d2.naver.com/helloworld/2771091

https://techblog.woowahan.com/12903/

https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro