Home [Spring WebFlux] Project Reactor
Post
Cancel

[Spring WebFlux] Project Reactor

Reactor

  • ๐Ÿ”—Reactor
    • ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ ํ‘œ์ค€ ์‚ฌ์–‘์„ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜
    • Spring 5 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ์Šคํƒ์— ํฌํ•จ
      • ๋ฆฌ์•กํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘์— ์žˆ์–ด ํ•ต์‹ฌ์  ์—ญํ• ์„ ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Reactor ํŠน์ง•
  1. Reactor๋Š” Reactive Streams๋ฅผ ๊ตฌํ˜„ํ•œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ </br>
  2. Non-Blocking์€ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์  ํŠน์ง•
    • Reactor๋„ ์™„์ „ํ•œ Non-Blocking ํ†ต์‹  ์ง€์›
    • Non-Blocking : ์š”์ฒญ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ๋˜์ง€ ์•Š์Œ </br>
  3. Reactor๋Š” Publicher ํƒ€์ž…
    • Reactor ์ œ๊ณต Publisher
    • Mono[01] : 0๊ฑด ๋˜๋Š” 1๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ emit ๊ฐ€๋Šฅ
    • Flux[N] : ์—ฌ๋Ÿฌ ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ emit ๊ฐ€๋Šฅ </br>
  4. Non-Blocking ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” Reactor๋Š” MSA ๊ตฌ์กฐ์— ์ ํ•ฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • MSA(Microservice Architecture) ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์€ Blocking ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ
      • ์„œ๋น„์Šค๋“ค๊ฐ„์˜ ํ†ต์‹ ์ด ์žฆ์œผ๋ฏ€๋กœ ์š”์ฒญ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ๋˜๋ฉด ์•ˆ๋จ </br>
  5. Reactor๋Š” Backpressure ์ „๋žต์„ ์ž˜ ์ง€์›ํ•ด์คŒ
    • Subscriber์˜ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ Publihser์˜ emit ์†๋„๋ฅผ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•  ๋•Œ ์ ์ ˆํ•˜๊ฒŒ ์ œ์–ดํ•˜๋Š” ์ „๋žต

      • ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋Š์ž„์—†์ด ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผํ•จ
      • Publisher์—์„œ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ emit์— ๋น„ํ•ด Subscriber์˜ ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋Š๋ฆฌ๋ฉด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋Œ€๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์Œ“์ด๊ฒŒ๋จ
      • ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋Œ€๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๋Š” ๊ฒƒ์„ ๋ฐฉ์น˜ํ•˜๊ฒŒ๋˜๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ
        • ์‹œ์Šคํ…œ ๋‹ค์šด ๊ฐ€๋Šฅ์„ฑ๋„ ์กด์žฌ

Marble Diagram

  • Marble Diagram

    • ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ํ‘œํ˜„ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ
    • ๊ตฌ์Šฌ๋ชจ์–‘์˜ ์•Œ๋ก๋‹ฌ๋กํ•œ ๋™๊ทธ๋ผ๋ฏธ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธ
    • Reactor ์ œ๊ณต Operator์˜ ๋‚ด๋ถ€๋™์ž‘์„ ์ดํ•ดํ•˜๋Š”๋ฐ์— ๋„์›€
    • Operator๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์— ๋„์›€
    • ๐Ÿ”—Marble Diagram

Scheduler

  • ๐Ÿ”—Scheduler
    • Thread๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ด€๋ฆฌ์ž ์—ญํ• 
    • Reactor์˜ Scheduler๋Š” ๋ณต์žกํ•œ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•ด์คŒ
      • Reactor Sequence ์ƒ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์ž‘๋“ค์˜ ํ•˜๋‚˜ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜๋„๋ก ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ œ๊ณตํ•ด์คŒ
      • Non-Blocking ํ†ต์‹ ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์†์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Reactor์—์„œ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•จ
  • Scheduler ์ „์šฉ Operator

    • subscribeON()
      • ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ emitํ•˜๋Š” ์›๋ณธ Publisher์˜ ์‹คํ–‰ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” ์—ญํ• 
      • ๊ตฌ๋… ์ง ํ›„ ์‹คํ–‰๋˜๋Š” Operator ์ฒด์ธ์˜ ์‹คํ–‰ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์ •ํ•œ ์“ฐ๋ ˆ๋“œ๋กœ ๋ณ€๊ฒฝ
      • ex) subscribeOn(Schedulers.boundedElastic())
      • ์‹ค์ œ๋กœ Schedulers.boundedElastic()๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•จ
      • ์—ฌ๋Ÿฌ๋ฒˆ ์ถ”๊ฐ€ํ•ด๋„ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑ
    • doOnSubscribe()
      • ๊ตฌ๋… ๋ฐœ์ƒ ์ง ํ›„์— ํŠธ๋ฆฌ๊ฑฐ ๋˜๋Š” Operator
      • ๊ตฌ๋… ์ง ํ›„ ์ˆ˜ํ–‰ํ•˜๊ณ ์‹ถ์€ ๋™์ž‘ ์ž‘์„ฑ
    • publichOn()
      • ์ „๋‹ฌ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณต ์ฒ˜๋ฆฌํ•˜๋Š” Operator ์•ž์— ์ถ”๊ฐ€ํ•ด์„œ ์‹คํ–‰ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์—ญํ• 
      • ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค ์ถ”๊ฐ€ํ•œ publishOn()์„ ๊ธฐ์ค€์œผ๋กœ Downstream์ชฝ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง€์ •ํ•œ ์“ฐ๋ ˆ๋“œ๋กœ ๋ณ€๊ฒฝ
      • ex) publishOn(Schedulers.parallel())
    • doOnNext()
      • ๋ฐ”๋กœ ์•ž์— ์œ„์น˜ํ•œ Operator๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ ๋˜๋Š” Operator
  • ๊ตฌ๋… ์ง ํ›„์˜ ์‹คํ–‰ ์“ฐ๋ ˆ๋“œ์™€ Operator ์ฒด์ธ๋งˆ๋‹ค ์‹คํ–‰ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•œ ์ด์œ 
    • Spring WebFlux ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ์€ ์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ๋กœ ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ Non-Blocking ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ
    • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง์ ‘ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ์—๋Š” ์‘๋‹ต ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋Šฆ์–ด์ง
      • ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„ ์—”์ง„์—์„œ ์ƒ์„ฑํ•˜๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‘๋‹ต ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•„์š”
    • Scheduler๋ฅผ ํ†ตํ•ด ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰์‹œ์ผœ์„œ ์‘๋‹ต ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•จ
  • ๐Ÿ”—Scheduler ์ง€์› ์“ฐ๋ ˆ๋“œ ์œ ํ˜•

์ข…๋ฅ˜๋ณ„ Operators

This post is licensed under CC BY 4.0 by the author.

[Spring WebFlux] Reactive Programming

[BaekJoon] 1032 ๋ช…๋ นํ”„๋กฌํ”„ํŠธ JAVA