20,000+ RPS ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋„ค์ด๋ฒ„ ๋ฉด์ ‘๊ด€์ด ์•Œ๋ ค์ฃผ๋Š” Reactive ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ์‘๋‹ต์ด ๋А๋ ค์ง€๊ณ , ์Šค๋ ˆ๋“œ ํ’€์ด ๋น ๋ฅด๊ฒŒ ๊ณ ๊ฐˆ๋˜๋ฉฐ, ์™ธ๋ถ€ API ํ˜ธ์ถœ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ณ‘๋ชฉ์ด ์‹ฌํ•ด์ง€๋Š” ํ™˜๊ฒฝ์—์„œ ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์„œ๋ฒ„๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ, ๊ตฌ์กฐ ์ž์ฒด๋ฅผ ๋ฐ”๊พธ๋Š” ๊ด€์ ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ๋จผ์ € ์ „ํ†ต์ ์ธ Spring MVC์˜ Thread per Request ๋ชจ๋ธ์ด ์–ด๋–ค ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ์ดํ•ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์™œ CPU๋Š” ๋‚จ์•„ ์žˆ๋Š”๋ฐ๋„ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š”์ง€, ๋ธ”๋กœํ‚น I/O๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ ์ž์›์„ ์ ์œ ํ•˜๋Š”์ง€๋ฅผ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์œผ๋กœ Reactive Streams์˜ ๊ฐœ๋…๊ณผ ํ‘œ์ค€ ์ŠคํŽ™์„ ๋ฐฐ์šฐ๊ณ , Reactor์˜ Mono์™€ Flux๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ์ตํž™๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ์‚ฌ์šฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์–ด๋–ป๊ฒŒ ์‹œ์ž‘๋˜๊ณ , ์–ด๋–ป๊ฒŒ ์†Œ๋น„๋˜๋ฉฐ, ์ฒ˜๋ฆฌ๋Ÿ‰์€ ์–ด๋–ป๊ฒŒ ์กฐ์ ˆ๋˜๋Š”์ง€๊นŒ์ง€ ์‹ค์Šต์„ ํ†ตํ•ด ์ฒด๋“ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Back Pressure๋ฅผ ํ™œ์šฉํ•ด OOM์ด๋‚˜ ๊ณผ๋ถ€ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ์‹๋„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ด…๋‹ˆ๋‹ค. ๋˜ํ•œ Spring WebFlux์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , Non-Blocking I/O๊ฐ€ ์‹ค์ œ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋น„๊ต ์‹ค์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. MVC์™€ WebFlux๋ฅผ ๋‚˜๋ž€ํžˆ ๋‘๊ณ  ๊ตฌ์กฐ์  ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๋ฉฐ, ์–ธ์ œ Reactive๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํŒ๋‹จ ๊ธฐ์ค€๋„ ํ•จ๊ป˜ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ โ€œ๋น„๋™๊ธฐ๋ฅผ ๋ฐฐ์šด๋‹คโ€๋Š” ์ˆ˜์ค€์—์„œ ๋๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์€ ์Šค๋ ˆ๋“œ๋กœ ๋” ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•, ์™ธ๋ถ€ API ์˜์กด์„ฑ์ด ๋†’์€ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ •์ ์ธ ํ๋ฆ„์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ๊ณ ๋™์‹œ์„ฑ ํ™˜๊ฒฝ์—์„œ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ™•๋ณดํ•˜๋Š” ์„ค๊ณ„ ๊ฐ๊ฐ์„ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(5.0) ์ˆ˜๊ฐ•ํ‰ 2๊ฐœ

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

๋‚œ์ด๋„ ์ž…๋ฌธ

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

์‹ค์Šต ์ค‘์‹ฌ
์‹ค์Šต ์ค‘์‹ฌ
๋ฐฑ์—”๋“œ์ดํ•ดํ•˜๊ธฐ
๋ฐฑ์—”๋“œ์ดํ•ดํ•˜๊ธฐ
์Šคํ”„๋ง
์Šคํ”„๋ง
Reactive Programming
Reactive Programming
์‹ค์Šต ์ค‘์‹ฌ
์‹ค์Šต ์ค‘์‹ฌ
๋ฐฑ์—”๋“œ์ดํ•ดํ•˜๊ธฐ
๋ฐฑ์—”๋“œ์ดํ•ดํ•˜๊ธฐ
์Šคํ”„๋ง
์Šคํ”„๋ง
Reactive Programming
Reactive Programming

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

  • Spring WebFlux ๊ธฐ๋ฐ˜์˜ Non-Blocking ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Mono์™€ Flux๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์„ค๊ณ„ํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋Šฅ๋ ฅ

  • Back Pressure๋ฅผ ์ ์šฉํ•ด ๊ณผ๋ถ€ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ ์„ค๊ณ„ ์—ญ๋Ÿ‰

  • MVC์™€ WebFlux์˜ ๊ตฌ์กฐ์  ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์„ ํƒ ๊ธฐ์ค€์„ ์ œ์‹œํ•˜๋Š” ๋Šฅ๋ ฅ

  • ์ ์€ ์Šค๋ ˆ๋“œ๋กœ ๋†’์€ ๋™์‹œ์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•

  • ๋ธ”๋กœํ‚น ์ฝ”๋“œ์™€ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ฝ”๋“œ ํ˜ผ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๋Šฅ๋ ฅ

โšก ์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Naver ๋ฉด์ ‘๊ด€์ด ์•Œ๋ ค์ฃผ๋Š” Reactive ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • โ—์•„๋ž˜์— ์žˆ๋Š” ๋‚ด์šฉ์€ ์‹ค์ œ ๋Œ€ํ™” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๐Ÿ˜Toss ๊ฐœ๋ฐœ์ž : ์š”์ฆ˜ ํŠธ๋ž˜ํ”ฝ์ด ๊ณ„์† ํ„ฐ์ ธ... CPU๋Š” ๊ดœ์ฐฎ์€๋ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํ‹ฐ์ง€๋ฅผ ๋ชปํ•˜๊ณ  ๋‹ค ๋ง‰ํ˜€๋ฒ„๋ฆฌ๋„ค ใ… ใ… 

๐Ÿ˜„ Hong : ํ† ์Šค๋Š” ์–ด๋–ค ๊ตฌ์กฐ ์‚ฌ์šฉํ•˜์ง€?? Thread per Request ๊ตฌ์กฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฑฐ์•ผ?

๐Ÿ˜ Toss ๊ฐœ๋ฐœ์ž : ์‘โ€ฆ ๋Œ€๋ถ€๋ถ„ MVC ๊ธฐ๋ฐ˜์ด๋ผ ์™ธ๋ถ€ API ํ˜ธ์ถœ ๋งŽ์•„์ง€๋ฉด ๋ธ”๋กœํ‚น ๊ตฌ๊ฐ„ ๋•Œ๋ฌธ์— ๋ณ‘๋ชฉ์ด ์ƒ๊ฒจ. ์ธํ”„๋ผ๋ฅผ ๋Š˜๋ ค๋„ ๊ทผ๋ณธ ํ•ด๊ฒฐ์ด ์•ˆ ๋˜๋Š” ๋А๋‚Œ์ด์•ผ.

๐Ÿ˜„ Naver ๋ฉด์ ‘๊ด€(๊ฐœ๋ฐœ์ž) : ์ €๋Š” ๊ทธ๋ž˜์„œ ์‚ฌ์‹ค ๊ทธ๊ฑฐ ์ข€ ์‹ซ์–ดํ•ด์š”. ์žฅ๋‹จ์ ์ด ๋ช…ํ™•ํ•˜๊ธฐ๋Š” ํ•œ๋ฐ... ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ด€์ ์—์„œ๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋”ฐ๋ผ ๊ฐˆ ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๋ฌผ๋ก  ๋Ÿฌ๋‹ ์ปค๋ธŒ๋Š” ์ข€ ์žˆ๊ฒ ์ง€๋งŒ ใ… 

๐Ÿ˜ Toss ๊ฐœ๋ฐœ์ž : ํ•˜.. ๊ทธ๋Ÿฌ๊ฒŒ์š” ๊ทธ๋ž˜์„œ ๊ณ ๋ฏผ์ด์—์š”. ๊ทธ๋ƒฅ Webflux ๋„ฃ์–ด๋ฒ„๋ฆด๊นŒ ํ•˜๋Š”๋ฐ๋„ ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์— ๋‹ค ๋„์ž…ํ•˜๊ธฐ์—๋„ ๋ถ€๋‹ด์Šค๋Ÿฝ๊ณ  ใ… ใ… 

๐Ÿ˜„ Naver ๋ฉด์ ‘๊ด€(๊ฐœ๋ฐœ์ž) : ใ…‹ใ…‹ใ…‹ ๊ทธ๋ž˜์„œ ์ €๋Š” ์ผ๋ถ€ ์„œ๋น„์Šค๋Š” WebFlux ๊ธฐ๋ฐ˜์˜ Reactive ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ–ˆ์–ด์š”. ๋‹ค ์ง„ํ–‰์€ ์•ˆํ•˜๊ณ  ๊ทธ๋ž˜๋„ ์ผ๋ถ€๋ผ๋„ ๋…ผ๋ธ”๋กœํ‚น์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋‹ˆ๊นŒ ๋™์ผํ•œ ์ž์›์—์„œ๋„ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ž˜ ๋”ฐ๋ผ์˜ค๊ธฐ๋Š” ํ•˜๋”๋ผ๊ณ ์š”

๐Ÿ˜„ Hong : ๊ทผ๋ฐ Reactive๋Š” ๊ฐœ๋…๋งŒ ๋“ฃ๊ณ  ๋„์ž…ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜๋„ ์žˆ์ž–์•„์š”?

๐Ÿ˜„ Naver ๋ฉด์ ‘๊ด€(๊ฐœ๋ฐœ์ž) : ๊ทธ์ตธ ์‚ฌ์‹ค Mono, Flux๋งŒ ์•ˆ๋‹ค๊ณ  ๋‹ค ํ•ด๊ฒฐ์ด ์•ˆ๋˜๊ธฐ๋Š” ํ•˜์ฃ  ๋„คํŠธ์›Œํฌ ์žฅ์• ๋‚˜ ํ˜„์‹ค์ ์ธ ๋ฌธ์ œ๋“ค์ด ๋งŽ์œผ๋‹ˆ๊น ์ด๋ฒคํŠธ ๋ฃจํ”„, Back Pressure, ๋ธ”๋กœํ‚น ์ฝ”๋“œ ํ˜ผ์šฉ ์ •๋„?? ์ด ์ •๋„๋Š” ๊ณ ๋ คํ•ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ์–ด์š”.

๐Ÿ˜„ Naver ๋ฉด์ ‘๊ด€(๊ฐœ๋ฐœ์ž) : ์ƒ๊ฐ๋‚œ๊น€์— ์ด๊ฑฐ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด ๋ณด๊ณ  ์‹ถ์€๋ฐ ์–ด๋–„์š”?? ใ…‹ใ…‹ใ…‹ใ…‹

๐Ÿ˜„ Hong : ์•„.... ์ž˜๋ชป ๊ฑธ๋ ธ๋„ค ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ์ด๊ฑธ ์˜๋„ํ•œ๊ฒŒ ์•„๋‹Œ๋ฐ;;

๐Ÿ˜ Toss ๊ฐœ๋ฐœ์ž : ์ „ ๋„ˆ๋ฌด ์ข‹์ฃ  ใ…‹ใ…‹ใ…‹ใ…‹ ์ ๊ทน ์ถ”์ฒœ!!! ์ €๋„ ํ•œ๋ฒˆ ๋“ค์–ด๋ณผ๊ฒŒ์š”... MVC๋งŒ ์ฐ์–ด๋‚ด๋‹ค ๋ณด๋‹ˆ๊น ์š”์ฆ˜ ๋ญ”๊ฐ€ ์ข€ ํผ??์ด ๋–จ์–ด์ง„ ๊ธฐ๋ถ„ ใ…‹ใ…‹ใ…‹ใ…‹

๐ŸŒŠ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋Š” ๋™๊ธฐ ๋ฐฉ์‹๋งŒ ์ž˜ํ•˜๋ฉด ์ถฉ๋ถ„ํ• ๊นŒ์š”?

์—ฌ๋Ÿฌ๋ถ„์€ ํ˜„์žฌ ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์ „ํ†ต์ ์ธ Spring MVC ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ์กฑํ•˜๊ณ  ์ž˜ ๋Œ์•„๊ฐ€๊ณ  ๊ณ„์‹œ๋‚˜์š”?? ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ๊ณ  ๊ทธ๊ฑธ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ณ„์‹œ๋Š”๊ฑด๊ฐ€์š”?? ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์šฐ๋ฆฌ ๊ฐ€์ •ํ•ด ๋ณผ๊ฒŒ์š”.

  • ์™ธ๋ถ€ API ํ˜ธ์ถœ์ด ๋งŽ์•„์ง€๋ฉด์„œ ์‘๋‹ต์ด ๋А๋ ค์ง€๋Š” ๋ฌธ์ œ

  • ์Šค๋ ˆ๋“œ ํ’€์ด ๊ธˆ๋ฐฉ ๊ณ ๊ฐˆ๋˜๋Š” ์ƒํ™ฉ

  • ํŠธ๋ž˜ํ”ฝ์€ ๋Š˜์–ด๋‚˜๋Š”๋ฐ ์ธํ”„๋ผ ๋น„์šฉ๋„ ๊ฐ™์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ

  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ์ ์  ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝํ—˜

ํ˜„๋Œ€์ ์ธ ๋ฐฑ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ์ž˜ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ด€์ ์„ ๋„˜์–ด์„œ์„œ ํŠธ๋ž˜ํ”ฝ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ ์„ค๊ณ„ ๋Šฅ๋ ฅ์ด ์ ์  ๋” ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์–ด๋–ป๊ฒŒ ๊ณ ๋ฏผํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์‹œ๋‚˜์š”??

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ ๋ฐ”๋กœ ์ด ๊ฐ•์˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์„ ์ ์€ ์Šค๋ ˆ๋“œ๋กœ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , Non-Blocking I/O ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์Šคํ…œ ์ž์›์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•. Back Pressure๋ฅผ ํ™œ์šฉํ•ด ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ์‹๊นŒ์ง€ ๋ชจ๋‘ ์ด ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜์‹œ๋ฉด์„œ Spring WebFlux์— ๋Œ€ํ•ด ํ•™์Šตํ•ด ๋ณด์„ธ์š”.

๋‹จ์ˆœํžˆ ์ด๋ก ๋งŒ ๋‹ค๋ฃจ๋Š” ๊ฐ•์˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ ๋‹ค์–‘ํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ Webflux๋ผ๋Š” ์Šคํ‚ฌ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ํ•™์Šตํ•˜์‹œ๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๊ฐ€์‹œ๊ธธ ๋ฐ”๋ผ๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

๐Ÿ”ฅ Why Spring WebFlux!!

Spring WebFlux๋Š” ๋…ผ๋ธ”๋กœํ‚น(Non-Blocking) ๊ธฐ๋ฐ˜์˜ Reactive ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ Spring MVC๊ฐ€ Thread per Request ๋ชจ๋ธ์ด๋ผ๋ฉด, WebFlux๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์˜ ๋…ผ๋ธ”๋กœํ‚น ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Spring WebFlux๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • Non-Blocking I/O

    • ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜์ง€ ์•Š๊ณ , I/O ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํšจ์œจ์ ์œผ๋กœ ์ž์›์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ ์€ ์Šค๋ ˆ๋“œ๋กœ๋„ ๋†’์€ ๋™์‹œ์„ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Reactive Streams & Back Pressure

    • Reactive Streams ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, Back Pressure๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž ๊ฐ„์˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๋„ํ•œ ๋ฐ์ดํ„ฐ ์œ ์ž…์œผ๋กœ ์ธํ•œ ์‹œ์Šคํ…œ ๊ณผ๋ถ€ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Event Loop ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ

    • ์ „ํ†ต์ ์ธ Thread per Request ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜์—ฌ, ๋Œ€๊ทœ๋ชจ ๋™์‹œ ์š”์ฒญ ํ™˜๊ฒฝ์—์„œ๋„ ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • High Concurrency

    • ์™ธ๋ถ€ API ํ˜ธ์ถœ, DB I/O ๋“ฑ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋งŽ์€ ์ž‘์—…์—์„œ๋„ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ์—†์ด ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ณ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ ๊ฐ•์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • Functional & Annotation

    • Spring MVC์™€ ์œ ์‚ฌํ•œ Annotation ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์€ ๋ฌผ๋ก , RouterFunction์„ ํ™œ์šฉํ•œ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ์˜ API ๊ตฌ์„ฑ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” Spring Webflux๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

The original web framework included in the Spring Framework, Spring Web MVC, was purpose-built for the Servlet API and Servlet containers. The reactive-stack web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports Reactive Streams back pressure, and runs on such servers as Netty, and Servlet containers.

Both web frameworks mirror the names of their source modules (spring-webmvc and spring-webflux) and co-exist side by side in the Spring Framework. Each module is optional. Applications can use one or the other module or, in some cases, bothโ€‰โ€”โ€‰for example, Spring MVC controllers with the reactive WebClient.


( Spring Framework์— ์ฒ˜์Œ ํฌํ•จ๋œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ธ Spring Web MVC๋Š” Servlet API์™€ Servlet ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๋ฒ„์ „ 5.0์—์„œ Reactive ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ธ Spring WebFlux๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Spring WebFlux๋Š” ์™„์ „ํžˆ ๋…ผ๋ธ”๋กœํ‚น(Non-Blocking) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, Reactive Streams์˜ Back Pressure๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Netty์™€ ๊ฐ™์€ ์„œ๋ฒ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ์กด์˜ Servlet ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐ๊ฐ์˜ ์†Œ์Šค ๋ชจ๋“ˆ ์ด๋ฆ„(spring-webmvc, spring-webflux)์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅด๋ฉฐ, Spring Framework ๋‚ด์—์„œ ๋‚˜๋ž€ํžˆ ๊ณต์กดํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ์€ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‘ ๋ชจ๋“ˆ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Spring MVC ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ Reactive ๊ธฐ๋ฐ˜์˜ WebClient๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. )

์—ฌ๋Ÿฌ๋ถ„๋“ค์€ Spring WebFlux๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋น„๋™๊ธฐ๋ผ๊ณ ๋งŒ ์ดํ•ดํ•˜์‹œ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. Non-Blocking I/O ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ, ์ ์€ ๋ฆฌ์†Œ์Šค๋กœ ๋†’์€ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ, Back Pressure ๋“ฑ๋“ฑ์„ ์ดํ•ดํ•˜์…”์•ผ ํ•˜๊ณ  ํŠนํžˆ MSA ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์ด ๋งŽ์€ ๊ตฌ์กฐ๋ผ๋ฉด Reactive ๋ฐฉ์‹์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ•์˜๋ฅผ ํ†ตํ•ด Reactive ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋‹จ์ˆœํ•œ ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ™•๋ณดํ•˜๋Š” ๊ธฐ์ˆ ๋กœ ์ดํ•ดํ•˜๊ณ  ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ฉด์„œ ๋ฐ”๋กœ ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ์Œ“์•„๋ณด์‹œ๊ธฐ๋ฅผ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿš€

๐Ÿš€ ์‹ค์ œ ๊ณต๊ณ ๋Š” ์–ด๋–ค๊ฒƒ์„ ์š”๊ตฌํ• ๊นŒ์š”??

ํ† ์Šค์˜ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž JD

ํ† ์ŠคํŽ˜์ด๋จผ์ธ ์˜ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž JD

๋‹ค์šฐ ํ‚ค์›€ ๊ณ„์—ด์‚ฌ์˜ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž JD

ํ—ฅํ†  ๊ทธ๋ฃน์˜ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž JD

โšก ์ด ๊ฐ•์˜์˜ ํŠน์ง•

๐Ÿ“Œ ๋„ค์ด๋ฒ„ ํ”Œ๋žซํผ ํ™˜๊ฒฝ์—์„œ์˜ Reactive ์„ค๊ณ„ ๊ฒฝํ—˜ ๊ธฐ๋ฐ˜ ๊ฐ•์˜

  • ์ด ๊ฐ•์˜๋Š” ๋‹จ์ˆœํžˆ WebFlux ๋ฌธ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๊ฐ•์˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ๊ณผ ์™ธ๋ถ€ API ์˜์กด์„ฑ์ด ๋†’์€ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๊ณ , ์™œ Reactive ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€ ๊ทธ ๋ฐฐ๊ฒฝ๋ถ€ํ„ฐ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    โ€œ์™œ WebFlux์ธ๊ฐ€?โ€์— ๋Œ€ํ•œ ์‹ค๋ฌด์ ์ธ ๋‹ต์„ ๋“œ๋ฆฌ๋Š” ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ 90% ์ด์ƒ ์‹ค์Šต ์ค‘์‹ฌ์˜ ์ปค๋ฆฌํ˜๋Ÿผ

  • Reactive๋Š” ์ด๋ก ๋งŒ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Mono์™€ Flux์˜ ๋™์ž‘ ํ๋ฆ„, Non-Blocking ์ฒ˜๋ฆฌ ๋ฐฉ์‹, ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด์•ผ ๋น„๋กœ์†Œ ๊ฐ์ด ์˜ต๋‹ˆ๋‹ค.

    ์ด ๊ฐ•์˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์‹ค์Šต์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ Reactive ํ๋ฆ„์„ ๋ˆˆ์œผ๋กœ ๋ณด๊ณ , ์ง์ ‘ ์ฒดํ—˜ํ•˜๋ฉด์„œ ์ดํ•ดํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ MVC์™€ WebFlux์˜ ๊ตฌ์กฐ์  ์ฐจ์ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๋Š” ๋ ˆ๋ฒจ์—…

  • โ€œ๋น„๋™๊ธฐโ€๋ผ๋Š” ๋‹จ์–ด ํ•˜๋‚˜๋กœ๋Š” ์„ค๋ช…์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. Thread per Request ๋ชจ๋ธ์˜ ํ•œ๊ณ„, ๋ธ”๋กœํ‚น ๊ตฌ๊ฐ„์ด ๋งŒ๋“œ๋Š” ๋ณ‘๋ชฉ, ๋…ผ๋ธ”๋กœํ‚น ์•„ํ‚คํ…์ฒ˜์˜ ๋™์ž‘ ๋ฐฉ์‹ ๋“ฑ์„ ํ†ตํ•ด ์ฐจ๋ณ„ํ™”๋œ ๊ฐœ๋ฐœ์ž ์ปค๋ฆฌ์–ด๋ฅผ ์ค€๋น„ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ์ฃผ๋‹ˆ์–ด์—๊ฒŒ๋Š” ํ•œ ๋‹จ๊ณ„ ์œ„์˜ ์‹œ์•ผ๋ฅผ ์ œ๊ณต

  • ์‹œ๋‹ˆ์–ด์—๊ฒŒ๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ ํƒ ๊ธฐ์ค€์„

    ๋‹จ์ˆœ CRUD ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋„˜์–ด, ํŠธ๋ž˜ํ”ฝ๊ณผ ์ž์› ํšจ์œจ์„ ๊ณ ๋ คํ•˜๋Š” ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ํ‚ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    WebFlux๋Š”โ€œ์œ ํ–‰ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ ๊ณ ๋™์‹œ์„ฑ ํ™˜๊ฒฝ์—์„œ์˜ ์„ ํƒ์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

๐Ÿคญ ์ด ๊ฐ•์˜๋ฅผ ํ•จ๊ป˜ ์ค€๋น„ํ•ด์ฃผ์‹  ๋„ค์ด๋ฒ„ ๋ฉด์ ‘๊ด€๋‹˜!

Ande (Naver)

10๋…„์ฐจ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž

๊ฐ•์‚ฌ๋‹˜๋“ค์˜ ์ด๋ฆ„์„ ํด๋ฆญํ•˜์—ฌ ๋” ์ž์„ธํ•œ ์ด๋ ฅ๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”!

์ œ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๊ณผ ์Šคํƒ์„ ๋‹ค๋ฅธ๋ถ„๋“ค๊ณผ ๊ณต์œ ํ•˜๊ณ  ์˜๋…ผํ•˜๊ณ  ์‹ถ์–ด์„œ ์ด๋ ‡๊ฒŒ ๊ฐ•์˜๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๋…ธํ•˜์šฐ๋ฅผ ๋‹ค๋ฅธ๋ถ„๋“ค์ด ์Šต๋“ํ•˜์‹œ๊ณ  ์ €์™€๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์ง€์ธ ์ถ”์ฒœ(์นด์นด์˜ค ๋ฉด์ ‘๊ด€)์œผ๋กœ ์ด๋ ‡๊ฒŒ ํ•จ๊ป˜ ํ•ฉ๋ฅ˜ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  Hong์˜ ์ฃผ๋„ํ•˜์— ํ•จ๊ป˜ ์ดฌ์˜์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค., ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋‚ด์šฉ์„ ๋…น์—ฌ๋“œ๋ฆฌ๊ณ ์ž ๋…ธ๋ ฅํ•˜์˜€์œผ๋‹ˆ. ๋งŽ์€๊ด€์‹ฌ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ ์งˆ๋ฌธ๋„ ํŽธํ•˜๊ฒŒ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ตœ๋Œ€ํ•œ ํ™•์ธํ•˜๊ณ  ๋‹ต๋ณ€๋“œ๋ฆฌ๋„๋ก ํ• ๊ฒŒ์š”. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

[็พ] ๋„ค์ด๋ฒ„ ์„œ๋ฒ„(๋ณธ์‚ฌ) ๊ฐœ๋ฐœ์ž

[ๅ‰] ์‹ ์„ธ๊ณ„ ๊ทธ๋ฃน์†Œ์† ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

[ๅ‰] ํ—ฌ์Šค์ผ€์–ด ์Šคํƒ€ํŠธ์—… ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž

[ๅ‰] ์„œ์šธ 4๋…„์ œ ์ปดํ“จํ„ฐ๊ณตํ•™ ์ „๊ณต

์ฐธ๊ณ  ์‚ฌํ•ญ

์‹ค์Šต ํ™˜๊ฒฝ

  • OS

    • Apple M3 Air

    • Docker version 28.0.0, build f9ced58158

    • java 17.0.12 2024-07-16 LTS

์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์ปค๋ฆฌ์–ด๋ฅผ ์ค€๋น„ํ•ด๋‚˜๊ฐ€๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์ฑ„ํŒ…๋ฐฉ์„ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ด€์‹ฌ ๋ถ€ํƒ๋“œ๋ ค์š”!

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

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

  • ํŠธ๋ž˜ํ”ฝ์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์Šค๋ ˆ๋“œ ํ’€ ๊ณ ๊ฐˆ ๋ฌธ์ œ๋กœ ๋ถˆ์•ˆํ•œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

  • MVC ๊ตฌ์กฐ์˜ ํ•œ๊ณ„๋ฅผ ๋А๋ผ์ง€๋งŒ ๋Œ€์•ˆ์„ ์ฐพ์ง€ ๋ชปํ•œ Spring ๊ฐœ๋ฐœ์ž

  • Reactive๋ฅผ ๋„์ž…ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ฐœ๋…์ด ๋ง‰์—ฐํ•ด ์‹œ๋„์กฐ์ฐจ ๋ชป ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

  • ์ธํ”„๋ผ ํ™•์žฅ์œผ๋กœ๋งŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋น„์šฉ ๋ถ€๋‹ด์ด ์ปค์ง€๋Š” ํŒ€์˜ ๊ฐœ๋ฐœ์ž

  • MSA ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ์ง€์—ฐ ๋ฌธ์ œ๋กœ ๊ณ ๋ฏผํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐœ๋ฐœ์ž

  • ๊ณ ๋™์‹œ์„ฑ ํ™˜๊ฒฝ ์„ค๊ณ„ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•ด ์ปค๋ฆฌ์–ด ์„ฑ์žฅ์— ๊ฐˆ์ฆ์„ ๋А๋ผ๋Š” ๊ฐœ๋ฐœ์ž

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

8,049

๋ช…

์ˆ˜๊ฐ•์ƒ

510

๊ฐœ

์ˆ˜๊ฐ•ํ‰

145

๊ฐœ

๋‹ต๋ณ€

4.7

์ 

๊ฐ•์˜ ํ‰์ 

27

๊ฐœ

๊ฐ•์˜

์ž๊ธฐ ์†Œ๊ฐœ

์ง‘์—์„œ ๋นˆ๋‘ฅ๋Œ€๋‹ค ๊ฐœ๋ฐœ์— ํฅ๋ฏธ๋ฅผ ๋А๊ปด ๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜์˜€๊ณ  ํ˜„์žฌ๋Š” ํŒ๊ต์—์„œ ํ”Œ๋žซํผ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ณต๋ถ€๋ฅผ ํ–ˆ๋˜ ๋ฐฉ๋ฒ•๊ณผ ์‹ค๋ฌด์—์„œ ์ ‘ํ•˜์‹ค ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์ ๋“ค๊ณผ ํ•ด๊ฒฐ์ฑ…์„ ์—ฌ๋Ÿฌ๋ถ„๋“ค์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์–ด ์ง€์‹๊ณต์œ ์ž ํ™œ๋™์„ ์ด์–ด๋‚˜๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ•์˜๋Š” ์˜ค๋กœ์ง€ ์ €๋งŒ์˜ ์ง€์‹์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ•์˜๋Š” ํ•จ๊ป˜ํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ๊ณ„์‹ญ๋‹ˆ๋‹ค.

 

์ง€์‹๊ณต์œ ์ž ๊ฒฝ๋ ฅ

[ๅ‰] ์ƒŒ๋“œ๋ฐ•์ŠคIP ๊ด€๋ จ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž

[ๅ‰] ๋ฉ”ํƒ€๋ฒ„์Šค ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

[็พ] ํŒ๊ต์—์„œ ๊ณ ์—ฌ๊ฐ€๋Š” ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž

 

์ธํ„ฐ๋ทฐ ์ด๋ ฅ

๊ธฐํƒ€ ๋ฌธ์˜

  • unduck2022@gmail.com

๋”๋ณด๊ธฐ

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

์ „์ฒด

25๊ฐœ โˆ™ (6์‹œ๊ฐ„ 0๋ถ„)

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

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

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

2๊ฐœ

5.0

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

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

    ์ˆ˜๊ฐ•ํ‰ 2

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

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

    ๊ฐ๋ช…๊นŠ๊ฒŒ ์ž˜ ๋ดค์Šต๋‹ˆ๋‹ค.. ํ˜„์—…์—์„œ 6๋…„์ฐจ ๊ฐœ๋ฐœ์ž๋กœ ๊ทผ๋ฌดํ•˜๊ณ ์žˆ๋Š”๋ฐ๋„ ์•„์ง๋„ ์ €๋„ ๋งŽ์ด ๋ถ€์กฑํ•จ์ด ๋А๊ปด์ง€๋Š” ๊ฐ•์˜๋„ค์š”.. ๋‹จ์ˆœํ•œ ์ฃผ์ œ์ด์ง€๋งŒ ์ •๋ง ํ•ต์‹ฌ๋งŒ ํŒŒ๊ณ ๋“œ๋Š” ์ข‹์€ ๋‚ด์šฉ์ด์˜€์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

      ์•ˆ๋…•ํ•˜์„ธ์š” letes ky๋‹˜ ์ข‹์€ ํ‰ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

  • ํ…๋ฒ„๊ฑฐ!๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ํ…๋ฒ„๊ฑฐ!

    ์ˆ˜๊ฐ•ํ‰ 10

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

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

    ํ•ต์‹ฌ์ ์ธ ๋‚ด์šฉ๋งŒ ์™์™ ๋ฝ‘์•„์„œ ์ •๋ง ๊ฐ€์„ฑ๋น„์žˆ๊ฒŒ ์ž˜ ๋ดค์Šต๋‹ˆ๋‹ค!

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

      ์•ˆ๋…•ํ•˜์„ธ์š” ํ…๋ฒ„๊ฑฐ๋‹˜ ์ข‹์€ ํ‰ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

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

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

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

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

์–ผ๋ฆฌ๋ฒ„๋“œ ํ• ์ธ ์ค‘

์›” โ‚ฉ208,760

5๊ฐœ์›” ํ• ๋ถ€ ์‹œ

50%

โ‚ฉ99,000

โ‚ฉ1,043,799