Kevin์˜ ์•Œ๊ธฐ ์‰ฌ์šด Spring Reactive Web Applications: Reactor 2๋ถ€

Spring WebFlux ๊ธฐ๋ฐ˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์ธ Reactor, ๊ทธ ์ค‘์—์„œ Reactor์˜ ๋ชจ๋“  ๊ฒƒ์ด๋ผ๊ณ ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹๋งŒํผ ์ค‘์š”ํ•œ Reactor Operator๋ฅผ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด `Kevin์˜ ์•Œ๊ธฐ ์‰ฌ์šด Spring Reactive WebApplications: Reactor 2๋ถ€` ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜์„ธ์š”.

(4.8) ์ˆ˜๊ฐ•ํ‰ 13๊ฐœ

์ˆ˜๊ฐ•์ƒ 358๋ช…

๋‚œ์ด๋„ ์ดˆ๊ธ‰

์ˆ˜๊ฐ•๊ธฐํ•œ ๋ฌด์ œํ•œ

์Šคํ”„๋ง
์Šคํ”„๋ง
์›น๊ฐœ๋ฐœ
์›น๊ฐœ๋ฐœ
์‹œ๋ฆฌ์ฆˆ
์‹œ๋ฆฌ์ฆˆ
webflux
webflux
์Šคํ”„๋ง
์Šคํ”„๋ง
์›น๊ฐœ๋ฐœ
์›น๊ฐœ๋ฐœ
์‹œ๋ฆฌ์ฆˆ
์‹œ๋ฆฌ์ฆˆ
webflux
webflux
๋คผ์ด๋“œ
ํ•˜์ดํผ์ปค๋„ฅํŠธ
kb๋ฐ์ดํƒ€์‹œ์Šคํ…œ
๋ฉ”์‰ฌ์ฝ”๋ฆฌ์•„
์ž‰์นด์ธํ„ฐ๋„ท

์ž‰์นด์ธํ„ฐ๋„ท

์ž„์ง์›๋“ค๋„ ์ด ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์žˆ์–ด์š”!

๋คผ์ด๋“œ
ํ•˜์ดํผ์ปค๋„ฅํŠธ
kb๋ฐ์ดํƒ€์‹œ์Šคํ…œ
๋ฉ”์‰ฌ์ฝ”๋ฆฌ์•„
์ž‰์นด์ธํ„ฐ๋„ท

์ž‰์นด์ธํ„ฐ๋„ท

์ž„์ง์›๋“ค๋„ ์ด ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์žˆ์–ด์š”!

๋จผ์ € ๊ฒฝํ—˜ํ•œ ์ˆ˜๊ฐ•์ƒ๋“ค์˜ ํ›„๊ธฐ

4.8

5.0

๋ณดํ‚ค

100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

7์›” 20์ผ๋ถ€ํ„ฐ WebFlux 1๋ถ€ ๊ฐ•์˜ ๋“ฃ๊ธฐ ์‹œ์ž‘ํ•ด์„œ 9์›”5์ผ์— 2๋ถ€๊นŒ์ง€ ์™„๊ฐ•ํ–ˆ๋„ค์š”! ๊ฐœ์ธ์ ์œผ๋กœ Java๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Kotlin์œผ๋กœ 2๋ฒŒ๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋„ ํ–ˆ๊ณ  ๋‹ค๋ฅธ ๊ฐ•์˜๋“ค๋„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ๋“ฃ๋А๋ผ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋„ค์š”ใ…Žใ…Ž ๊ฐ•์˜ ์ •๋ง ์ž˜ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค! ๋‹ค์Œ์œผ๋กœ Spring + WebFlux๋ฅผ ํ™œ์šฉํ•œ 3๋ถ€ ๊ฐ•์˜๋ฅผ ๊ธฐ๋Œ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

5.0

Matthew

72% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. :)

5.0

๊น€์„ธ์ง„

100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

์›นํ”Œ๋Ÿญ์Šค ๊ฐ•์˜๊ฐ€ ๋งŽ์ด ์—†๋Š”๋ฐ ๊ดœ์ฐฎ๋„ค์š” !

์ˆ˜๊ฐ• ํ›„ ์ด๋Ÿฐ๊ฑธ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”

  • Reactor Sequence๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Operator ํ™œ์šฉ ๋ฐฉ๋ฒ•

  • Reactor Sequence์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•œ Operator์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•

  • Reactor Sequence์—์„œ emit๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” Operator์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•

  • Reactor Sequence์˜ ๋‚ด๋ถ€ ๋™์ž‘ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ Operator์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•

  • ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ๋œ Operator์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•

  • Reactor Sequence์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Operator์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•

  • Reactor Sequence์—์„œ emit๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๊ธฐ ์œ„ํ•œ Operator์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•

'์Šคํ”„๋ง์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ' ์ €์ž ์ง๊ฐ•!

Kevin์˜ ์•Œ๊ธฐ ์‰ฌ์šด RxJava ๊ฐ•์˜๋ฅผ ์˜คํ”ˆํ–ˆ๋˜ Kevin์ด 3๋…„ ๋งŒ์— ๋“ค๊ณ  ์˜จ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์ธํ”„๋Ÿฐ ๊ฐ•์˜์™€ ๋„์„œ๋กœ ๋งŒ๋‚˜๋ณด์„ธ์š”!


Spring WebFlux ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜๋Š” ๋ถ„๋“ค์ด ๊ฐ€์žฅ ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ์ค‘์— ํ•ต์‹ฌ์ธ Operator์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ๋œ ํ•™์Šต์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ณง๋ฐ”๋กœ Spring WebFlux๋ฅผ ํ•™์Šตํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Spring WebFlux ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นจ๋ฆฌ ๊ตฌํ˜„ํ•ด ๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ์€ ๋„ˆ๋ฌด๋‚˜ ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ๋ถ„๋“ค์ด Reactor์˜ Operator์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ธฐ๊ฐ€ ์ œ๋Œ€๋กœ ๊ฐ–์ถ”์–ด์ ธ ์žˆ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ Spring WebFlux ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€์ง€๋งŒ ๊ฒฐ๊ตญ Operator๋ผ๋Š” ๋ฒฝ์— ๋ถ€๋”ช์ณ Operator๋ฅผ ๋‹ค์‹œ ํ•™์Šตํ•˜๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์‹œํ–‰ ์ฐฉ์˜ค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์–ด ๋“œ๋ฆฌ๊ณ  ์‹ถ์–ด์„œ 2๋ถ€ ๊ฐ•์˜์—์„œ๋Š” โญ Reactor์˜ ํ•ต์‹ฌ ์ค‘์— ํ•ต์‹ฌ์ธ
Operator์— ๋Œ€ํ•œ ํ™œ์šฉ๋ฒ•์„ ์ง‘์ค‘์ ์œผ๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก Operator์— ๋Œ€ํ•ด์„œ๋งŒ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


์ด ๊ฐ•์˜๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด Reactor, ๊ทธ ์ค‘์—์„œ Reactor์˜ ๊ฝƒ์ด๋ผ ๋ถˆ๋ฆฌ์šฐ๋Š” Operator๋ผ๋Š” ๋ฌธ์„ ์—ด ์ˆ˜ ์žˆ๋Š” ์—ด์‡ ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ž์‹ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒฑ 2๋ถ€ ๊ฐ•์˜์˜ ํŠน์ง•

  • 2๋ถ€ ๊ฐ•์˜๋Š” Reactor์˜ Operator์— ๋Œ€ํ•ด์„œ๋งŒ ์ง‘์ค‘์ ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • Operator์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก Operator์— ํ•ด๋‹นํ•˜๋Š” ๋งˆ๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํŠน์ • Operator์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋กœ Operator์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•œ ํ›„, ํŠน์ • Operator๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ํ™œ์šฉ ์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด 60 ์—ฌ ๊ฐœ์˜ Operator์— ๋Œ€ํ•ด 97๊ฐœ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ Operator๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


์ด๋Ÿฐ ๋‚ด์šฉ์„ ๋ฐฐ์›Œ์š”

์„น์…˜ 1: Creating a new sequence

์„น์…˜ 1์—์„œ๋Š” Reactor Sequence๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” Operator์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • justOrEmpty: justOrEmpty Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Reactor Sequence์— ํ•˜๋‚˜์˜ ๊ฐ’ ๋˜๋Š” ๋น„์–ด ์žˆ๋Š”(Empty) Sequence๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

  • fromIterable: Java์˜ Collection์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ Sequence๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • fromStream: fromStream Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java Stream์—์„œ Sequence๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • range: range Operator๋ฅผ ์ด์šฉํ•ด ์ •ํ•ด์ง„ ๋ฒ”์œ„ ๋‚ด์˜ ์ •์ˆ˜ Sequence๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • defer: defer Operator๋ฅผ ํ†ตํ•ด์„œ Subscriber๊ฐ€ ๊ตฌ๋…ํ•˜๋Š” ์‹œ์ ๊นŒ์ง€ ๋ฐ์ดํ„ฐ emit์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ์ดํ•ดํ•ด ๋ด…๋‹ˆ๋‹ค.

  • using: using Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํš๋“ํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๊ณผ์ • ํฌํ•จํ•˜๋Š” Sequence๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

  • generate, create: generate, create Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 2: Filtering a sequence

์„น์…˜ 2์—์„œ๋Š” Reactor Sequence์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” Operator ๋“ค์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • filter: filter Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Reactor Sequence์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

  • skip: skip Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œํ€€์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • skip ํ™•์žฅ Operator: skipLast, skipUntil, skipUntilOther,
    skipWhile์„ ์‚ฌ์šฉํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • take: take Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Sequence์—์„œ emit๋œ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • take ํ™•์žฅ Operator: takeLast, takeUntil, takeUntilOther,
    takeWhile์„ ์‚ฌ์šฉํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ emit๋œ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • next: emit๋œ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋งŒ ์–ป๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.


์„น์…˜ 3: Transforming an existing sequence

์„น์…˜ 3์—์„œ๋Š” Reactor Sequence์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” Operator์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • map: map Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Sequence์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • flatMap: flatMap Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ emit๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ‰ํƒ„ํ™”์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • flatMap ํ™•์žฅ Operator: FlatMapIterable, FlatMapMany, FlatMapSequential์„ ์‚ฌ์šฉํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ํ‰ํƒ„ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • concat: concat Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Sequence๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • merge: merge Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Sequence๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ด ๋ด…๋‹ˆ๋‹ค.

  • zip: zip Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Sequence์˜ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • and, when: and, when Operator๋ฅผ ํ†ตํ•ด ์กฐ๊ฑด์— ๋”ฐ๋ผ Reactor Sequence์˜ ์ข…๋ฃŒ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • then: ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ then Operator๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • collectList, collectMap: emit๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ List ๋˜๋Š” Map์— ๋‹ด์•„์„œ ํ•œ ๋ฒˆ์— Downstream์œผ๋กœ emitํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.


์„น์…˜ 4: Peeking into a sequence

์„น์…˜ 4์—์„œ๋Š” Reactor Sequence์˜ ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณผ ์ˆ˜ ์žˆ๋Š” Operator์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • doOnXXXX: doOnSubscribe, doOnRequest, doOnNext, doOnComplete ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Sequence์˜ ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณด๋ฉด์„œ Sequence์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์ดํ•ดํ•ด ๋ด…๋‹ˆ๋‹ค.

์„น์…˜ 5: Working with time

์„น์…˜ 5์—์„œ๋Š” Reactor Sequence์—์„œ ์ œ๊ณตํ•˜๋Š” Operator ์ค‘์—์„œ ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ๋œ Operator๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • delayElements: ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ emitํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” delayElements์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • delaySubscription vs delaySequence: delaySubscription๊ณผ delaySequence์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ๊ฐ๊ฐ์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•ด ๋ด…๋‹ˆ๋‹ค.

  • timeout: ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ emit๋˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” timeout Operator์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 6: Handling errors

์„น์…˜ 6์—์„œ๋Š” Reactor Sequence์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋ง ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” Operator๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • error: error Operator๋ฅผ ์ด์šฉํ•ด Reactor Sequence ์ƒ์—์„œ ์—๋Ÿฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ throwํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

  • onErrorReturn, onErrorResume: onErrorReturn๊ณผ onErrorResume Operator๋ฅผ ์ด์šฉํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋Œ€์ฒด ๊ฐ’์„ emit ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋Œ€์ฒด Sequence ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • onErrorContinue: onErrorContinue Operator๋ฅผ ์‚ฌ์šฉํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ Sequence๊ฐ€ ๊ณ„์† ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • onErrorMap: onErrorMap Operator๋ฅผ ์ด์šฉํ•ด Sequence ์ƒ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ์ƒˆ๋กœ์šด ์˜ˆ์™ธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • retry: retry Operator๋ฅผ ์‚ฌ์šฉํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ Sequence๊ฐ€ ๋‹ค์‹œ ๋™์ž‘ํ•˜๋„๋ก ์žฌ์‹œ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.


์„น์…˜ 7: Splitting a Flux

์„น์…˜ 7์—์„œ๋Š” Reactor Sequence์—์„œ emit๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” Operator ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • window: window Operator๋ฅผ ์ด์šฉํ•ด emit๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ • ๊ฐœ์ˆ˜์˜ window๋กœ ๋‚˜๋ˆ„์–ด emitํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • buffer, bufferTimeout: buffer ๋ฐ bufferTimeout Operator๋ฅผ ์ด์šฉํ•ด emit๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ์— ๋‹ด์•„์„œ emitํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • groupBy: groupBy Operator๋ฅผ ์ด์šฉํ•ด emit ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๊ธฐ์ค€์— ๋งž๊ฒŒ ๊ทธ๋ฃนํ•‘์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.


์„น์…˜ 8: Multicasting a Flux to several Subscribers

์„น์…˜ 8์—์„œ๋Š” ํ•˜๋‚˜์˜ Flux๋กœ ๋‹ค์ˆ˜์˜ Subscriber์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ€ํ‹ฐ์บ์ŠคํŒ… ํ•˜๋Š” Operator๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • publish: publish Operator๋ฅผ ์‚ฌ์šฉํ•ด Sequence ์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ€ํ‹ฐ์บ์ŠคํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • autoConnect: autoConnect Operator๋ฅผ ์ด์šฉํ•ด ๊ตฌ๋…์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ Upstream ์†Œ์Šค์— ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • refCount: refCount Operator๋ฅผ ์ด์šฉํ•ด ๊ตฌ๋…์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, Upstream ์†Œ์Šค์— ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ , ๊ตฌ๋…์ด ์ทจ์†Œ ๋˜์—ˆ์„ ๋•Œ Upstream ์†Œ์Šค์—์„œ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ์ด ํ•ด์ œ๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • replay: replay Operator๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ๊ตฌ๋…์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ Sequence ์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ emitํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ.


์ˆ˜๊ฐ• ์ „ ์ฐธ๊ณ  ์‚ฌํ•ญ

Kevin์˜ ์•Œ๊ธฐ ์‰ฌ์šด Spring Reactive Web Applications ์ „์ฒด ๊ฐ•์˜ ๊ตฌ์„ฑ

  • 1๋ถ€๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐœ๋…๊ณผ Spring Reactive Web Application์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ํ•˜๋Š” Project Reactor์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • 2๋ถ€๋Š” 1๋ถ€์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์•˜๋˜ Project Reactor์˜ Operator์— ๋Œ€ํ•ด์„œ๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. Operator๋Š” Reactor์˜ ์—ฌ๋Ÿฌ ํŒŒํŠธ ์ค‘์—์„œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์–ด๋А ์ •๋„ ์ต์ˆ™ํ•œ ๋ถ„๋“ค์ด Operator ๋ถ€๋ถ„๋งŒ ๋ณ„๋„๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ„๋„์˜ ๊ฐ•์˜๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • 3๋ถ€๋Š” Spring WebFlux์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•œ ํ›„์— ๋ฆฌ์•กํ‹ฐ๋ธŒํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๋Š” ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ ์œ„์ฃผ๋กœ ๊ตฌ์„ฑ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. (2024๋…„๋„ ์ค‘์— ์˜คํ”ˆ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.) 

ํ•™์Šต ์ž๋ฃŒ

  • ๋งค ์ˆ˜์—…๋งˆ๋‹ค ๊ฐ•์˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” PPT ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PPT ๊ฐ•์˜ ์ž๋ฃŒ๋Š” ์ˆ˜์—… ์ฒญ์ทจ ์ค‘์— ์ˆ˜์—…๋ณ„๋กœ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์œผ๋‚˜ ์ˆ˜์—…๋ณ„๋กœ ์ชผ๊ฐœ์–ด์ ธ์žˆ์–ด ๋ณด๊ธฐ ๋ถˆํŽธํ•˜์‹  ๋ถ„๋“ค์€ ์•„๋ž˜ Github Repository์—์„œ ์„น์…˜ ๋ณ„๋กœ ํ†ตํ•ฉ๋˜์–ด ์žˆ๋Š” ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ํ™œ์šฉํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • ์ˆ˜์—…์—์„œ ์„ค๋ช…ํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ github์— ์˜ฌ๋ผ๊ฐ€ ์žˆ์œผ๋ฉฐ ์•„๋ž˜ ์ฃผ์†Œ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์ˆ˜์—…์€ 5๋ถ„ ~ 20๋ถ„ ์‚ฌ์ด์˜ ์˜์ƒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • 1๋ถ€ ๊ฐ•์˜ ์ œ์ž‘ ๋‹จ๊ณ„์— ๋ ˆ์ฝ”๋”ฉ ๋œ ์˜์ƒ์ด ์ผ์ • ๋ถ€๋ถ„ ํฌํ•จ๋˜์–ด ์žˆ์–ด ๋ช‡๋ช‡ ์ˆ˜์—… ์˜์ƒ์—์„œ๋Š” ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๊ฐ€ ์›๋ณธ ์˜ˆ์ œ ์†Œ์Šค ์ฝ”๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ ์ˆ˜ ์ง€์‹ ๋ฐ ์œ ์˜์‚ฌํ•ญ

  • Java ์„ ์ˆ˜ ์ง€์‹์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

  • Reactor์— ๋Œ€ํ•œ ํ•™์Šต ๊ฒฝํ—˜์ด ์žˆ์œผ์‹  ๋ถ„๋“ค์€ 1๋ถ€ ๊ฐ•์˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ˆ˜๊ฐ•ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • Reactor์— ๋Œ€ํ•œ ํ•™์Šต ๊ฒฝํ—˜์ด ์—†๊ฑฐ๋‚˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ฒ˜์Œ ์ ‘ํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ 1๋ถ€ ๊ฐ•์˜๋ฅผ ํ•™์Šตํ•˜์‹œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ธ”๋กœ๊ทธ ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜์‹ค ๊ฒฝ์šฐ์—๋Š” ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ฒจ์ฃผ์‹œ๊ธธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

  • ๊ฐ•์˜์—์„œ ์‚ฌ์šฉ๋œ ๋งˆ๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ ์ด๋ฏธ์ง€(Reactor ๊ณต์‹ ์‚ฌ์ดํŠธ ์ด๋ฏธ์ง€ ์ œ์™ธ)๋Š” ์ €์ž‘๊ถŒ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ธ”๋กœ๊ทธ ๋“ฑ ํƒ€ ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ๊ณ ์ž ํ•˜๋Š” ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž

  • Project Reactor์˜ ๊ธฐ๋ณธ์„ ์ตํžˆ๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

  • Project Reactor์˜ Opertaor๋ฅผ ์–ด๋–ป๊ฒŒ ํ•™์Šตํ•ด์•ผ ํ• ์ง€ ๋ฐฉํ–ฅ์„ ์žก๊ธฐ ํž˜๋“  ๋ถ„

  • Project Reactor์˜ Operator ํ™œ์šฉ์„ ์œ„ํ•œ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป๊ณ ์ž ํ•˜๋Š” ๋ถ„

  • Spring ๋ฒ ์ด์Šค์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • Java

  • Project Reactor์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์‹

์•ˆ๋…•ํ•˜์„ธ์š”
Kevin์ž…๋‹ˆ๋‹ค.

์ปค๋ฆฌ์–ด์ธ์ฆ

6,870

๋ช…

์ˆ˜๊ฐ•์ƒ

309

๊ฐœ

์ˆ˜๊ฐ•ํ‰

133

๊ฐœ

๋‹ต๋ณ€

4.8

์ 

๊ฐ•์˜ ํ‰์ 

11

๊ฐœ

๊ฐ•์˜

  • ์ฃผ๋ ฅ ์–ธ์–ด ๋˜๋Š” ๊ธฐ์ˆ  : Java, Spring Framework, RxJava, Reactor, Spring WebFlux

  • (์ฃผ) ํŽœํƒ€์‹œํ๋ฆฌํ‹ฐ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ํ™œ๋™(From 2015.07 To 2022.01)

  • (์ฃผ)์ฝ”๋“œ์Šคํ…Œ์ด์ธ (https://www.codestates.com)์—์„œ Senior Educational Software Engineer(Backend)๋กœ ํ™œ๋™
    (From 2022.03 To 2024.01.31)

- ํ”„๋ฆฌ๋žœ์„œ ๊ฐœ๋ฐœ์ž ๋ฐ ๊ฐ•์‚ฌ๋กœ ํ™œ๋™(Since 2024.02)

- ์ €์„œ

์•ˆ๋…•ํ•˜์„ธ์š”? Kevin์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ^^

์ธํ”„๋Ÿฐ์—์„œ ์ด๋ ‡๊ฒŒ ๊ฐ•์‚ฌ๋กœ์„œ ์—ฌ๋Ÿฌ๋ถ„๋“ค์„ ๋งŒ๋‚˜๊ฒŒ ๋˜์–ด์„œ ๋„ˆ๋ฌด ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ๋ถ„์•ผ๋“  ๋งˆ์ฐฌ๊ฐ€์ง€๊ฒ ์ง€๋งŒ ํŠนํžˆ๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๋Š” ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ํŠธ๋ Œ๋“œ์— ๋’ค์ฒ˜์ง€์ง€ ์•Š๋„๋ก ํ•ญ์ƒ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐˆ๊ณ  ๋‹ฆ๋Š”๊ฒƒ์ด ๊ฐœ๋ฐœ์ž๋กœ์จ ์‚ด์•„๋‚จ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ํ•ญ์ƒ ๋ฐฐ์šฐ๋Š” ์ž์„ธ๋กœ ์ฆ๊ฒ๊ฒŒ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋ฐœ์ž ์ค‘ ํ•œ ๋ช…์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ง€์‹๊ณผ ๊ฒฝํ—˜์ด ๋‹ค๋ฅธ ๋ถ„๋“ค์—๊ฒŒ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉด์„œ ์ธํ”„๋Ÿฐ์—์„œ ๊ฐ•์ขŒ๋ฅผ ์‹œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ์ˆ˜๊ฐ•์ƒ๋ถ„๋“ค์—๊ฒŒ ํ˜„์‹ค์ ์œผ๋กœ ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ๊ฐ•์ขŒ๋กœ ๊พธ์ค€ํžˆ ์ฐพ์•„๋ต™๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์งˆ๋ฌธ์ด๋‚˜ ์˜๊ฒฌ์€ ์–ธ์ œ๋“ ์ง€ ํ™˜์˜ํ•˜๋‹ˆ, ์ด๋ฉ”์ผ(it.village.host@gmail.com)๋กœ ํŽธํ•˜๊ฒŒ ์–˜๊ธฐํ•ด์ฃผ์„ธ์š”.

 

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

36๊ฐœ โˆ™ (6์‹œ๊ฐ„ 10๋ถ„)

ํ•ด๋‹น ๊ฐ•์˜์—์„œ ์ œ๊ณต:

์ˆ˜์—…์ž๋ฃŒ
๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

13๊ฐœ

4.8

13๊ฐœ์˜ ์ˆ˜๊ฐ•ํ‰

  • ๊น€์„ธ์ง„๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ๊น€์„ธ์ง„

    ์ˆ˜๊ฐ•ํ‰ 1

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ์›นํ”Œ๋Ÿญ์Šค ๊ฐ•์˜๊ฐ€ ๋งŽ์ด ์—†๋Š”๋ฐ ๊ดœ์ฐฎ๋„ค์š” !

    • ๋ณดํ‚ค๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
      ๋ณดํ‚ค

      ์ˆ˜๊ฐ•ํ‰ 60

      โˆ™

      ํ‰๊ท  ํ‰์  5.0

      5

      100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

      7์›” 20์ผ๋ถ€ํ„ฐ WebFlux 1๋ถ€ ๊ฐ•์˜ ๋“ฃ๊ธฐ ์‹œ์ž‘ํ•ด์„œ 9์›”5์ผ์— 2๋ถ€๊นŒ์ง€ ์™„๊ฐ•ํ–ˆ๋„ค์š”! ๊ฐœ์ธ์ ์œผ๋กœ Java๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Kotlin์œผ๋กœ 2๋ฒŒ๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋„ ํ–ˆ๊ณ  ๋‹ค๋ฅธ ๊ฐ•์˜๋“ค๋„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ๋“ฃ๋А๋ผ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋„ค์š”ใ…Žใ…Ž ๊ฐ•์˜ ์ •๋ง ์ž˜ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค! ๋‹ค์Œ์œผ๋กœ Spring + WebFlux๋ฅผ ํ™œ์šฉํ•œ 3๋ถ€ ๊ฐ•์˜๋ฅผ ๊ธฐ๋Œ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

      • Kevin
        ์ง€์‹๊ณต์œ ์ž

        ์—ด์‹ฌํžˆ ํ•™์Šตํ•˜์‹œ๋А๋ผ ์ •๋ง ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค. ๋ณดํ‚ค๋‹˜, ์‹ค๋ ฅ์ด ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜์…จ๊ธธ ๋ฐ”๋ž˜์š”. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

    • EUN๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
      EUN

      ์ˆ˜๊ฐ•ํ‰ 7

      โˆ™

      ํ‰๊ท  ํ‰์  4.3

      5

      31% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

      ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ์˜ˆ์ œ๊ฐ€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค

      • Matthew๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
        Matthew

        ์ˆ˜๊ฐ•ํ‰ 10

        โˆ™

        ํ‰๊ท  ํ‰์  4.5

        5

        72% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

        ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. :)

        • Jenny Kim๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
          Jenny Kim

          ์ˆ˜๊ฐ•ํ‰ 3

          โˆ™

          ํ‰๊ท  ํ‰์  5.0

          5

          100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

          Kevin๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜

          ์ง€์‹๊ณต์œ ์ž๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

          ๋น„์Šทํ•œ ๊ฐ•์˜

          ๊ฐ™์€ ๋ถ„์•ผ์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!