๋™๊ธฐ(Sync) != Blocking ๐Ÿšฆ๋น„๋™๊ธฐ(Async) != Non-Blocking

๋Š˜๋ณดยท2025๋…„ 5์›” 1์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
24/24
post-thumbnail

๐Ÿ”—๋™๊ธฐ(Sync) vs ๋น„๋™๊ธฐ(Async) [์‹œ๊ฐ„]

๐Ÿ“Œ ์‹œ๊ฐ„: ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ ์‹œ์ ๊ณผ ๊ฒฐ๊ณผ๊ฐ’์˜ ์ „๋‹ฌ ์‹œ์ ์˜ together ์—ฌ๋ถ€

Sync (๋™๊ธฐ)

์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ ํ›„ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํŠน์ • ์ž‘์—…์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ž‘์—…์ด ๋ธ”๋กœํ‚น(Blocking)๋˜์–ด ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.

โžก๏ธ ์š”์ฒญ(์˜ˆ์‹œ: 1, 2, 3, 4)์„ ํ†ตํ•ด ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋Š” ์‹œ์ ๊ณผ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ์‹œ์ ์ด ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋™๊ธฐ ๋ฐฉ์‹์ด๋‹ค.


๐Ÿ’ฌ ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—… ํ™”๋ฉด์„ ์ผœ๋‘๊ณ  ์ž๋ฆฌ๋ฅผ ๋น„์šด๋‹ค๋ฉด?

๐Ÿšจ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…์„ ๋งˆ์น˜์ง€ ์•Š์€ ์ฑ„ ์ž๋ฆฌ๋ฅผ ๋น„์šฐ๋ฉด ๋‹ค์Œ ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ> ์ง€ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค.


Async (๋น„๋™๊ธฐ)

ํ•œ ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์™€ ๊ฒฐ๊ณผ๊ฐ’์˜ ์‹œ๊ฐ„์ด ๋‹ค๋ฅธ ๊ฒƒ์ด ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด๋‹ค.

์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…(์˜ˆ: API ํ˜ธ์ถœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ, ํŒŒ์ผ ์ฒ˜๋ฆฌ)์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค.

Java์—์„œ๋Š” @Async, ExecutorService, WebFlux ๋“ฑ์„ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ—ƒ๏ธ ๋™๊ธฐ VS ๋น„๋™๊ธฐ ์ •๋ฆฌ

๋™๊ธฐ๋น„๋™๊ธฐ
์ž‘์—… ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—… ์ง„ํ–‰
์‘๋‹ต ๋Œ€๊ธฐ ์—ฌ๋ถ€์ž‘์—…์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์•„๋„ ์š”์ฒญ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
์„ฑ๋Šฅ์†๋„ ๋А๋ฆผ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ ์†๋„ ๋น ๋ฆ„
์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ@Async, ExecutorService, โ€ข โ€ข โ€ข
์ ์šฉ ์˜ˆ์‹œ CRUD, ๋ฐ์ดํ„ฐ ์กฐํšŒ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋น„๋™๊ธฐ API

๐Ÿงฑ Blocking vs Non-Blocking [์ œ์–ด๊ถŒ]

๐Ÿ“Œ ์ œ์–ด๊ถŒ: ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒ๋ฆฌ

Blocking

์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถฐ์žˆ๋Š” ๋ฐฉ์‹

์ดˆ๊ธฐ์—๋Š” 1๏ธโƒฃํ•จ์ˆ˜ A๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  B๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ•ด๋‹น 2๏ธโƒฃ์ œ์–ด๊ถŒ์„ B์—๊ฒŒ ๋„˜๊ฒจ์ค€๋‹ค.

์ดํ›„ B๋Š” ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ A์—๊ฒŒ ๋Œ๋ ค์ฃผ๋ฉด3๏ธโƒฃ A๋Š” ํ•ด๋‹น ์ œ์–ด๊ถŒ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.


Non-Blocking

์ž‘์—…์„ ์š”์ฒญํ•œ ํ›„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹

ํ•จ์ˆ˜ A๋Š” ์ œ์–ด๊ถŒ์„ ํ•จ์ˆ˜ B์—๊ฒŒ ์ž ์‹œ ๋„˜๊ฒจ์ฃผ์–ด ํ•จ์ˆ˜ B๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ•จ์ˆ˜ B๋Š” ํ•ด๋‹น ์ œ์–ด๊ถŒ์„ ๋ฐ”๋กœ A์—๊ฒŒ ๋Œ๋ ค์ค€๋‹ค. (์งง์€ ์‹œ๊ฐ„์— ์ œ์–ด๊ถŒ์ด ์ฃผ๊ณ ๋ฐ›์•„์ง„๋‹ค.)

B๋Š” ์ œ์–ด๊ถŒ์„ ๋ฐ›์•„ ํ˜ธ์ถœ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•จ์ˆ˜ A๋„ ๋Œ๋ ค๋ฐ›์€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ—ƒ๏ธ ๋ธ”๋กœํ‚น VS ๋…ผ ๋ธ”๋กœํ‚น

๋ธ”๋กœํ‚น๋…ผ ๋ธ”๋กœํ‚น
์ž‘์—… ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ค€๋‹ค.์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๊ณ  ๋ฐ”๋กœ ๋ฐ›๋Š”๋‹ค.
์‘๋‹ต ๋Œ€๊ธฐ ์—ฌ๋ถ€์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ฆ‰์‹œ ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰ ๊ฐ€๋Šฅ
์Šค๋ ˆ๋“œ ํšจ์œจํ•˜๋‚˜์˜ ์š”์ฒญ์ด ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
์ ์šฉ ์˜ˆ์‹œ ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ I/O, JDBC ์—ฐ๊ฒฐWebFlux, Netty ๊ธฐ๋ฐ˜ ์›น ์„œ๋ฒ„

๐Ÿ”—๋™๊ธฐ(Sync) vs ๋น„๋™๊ธฐ(Async) | ๐Ÿงฑ Blocking vs Non-Blocking

๋™๊ธฐ, ๋น„๋™๊ธฐ, ๋ธ”๋กœํ‚น, ๋…ผ๋ธ”๋กœํ‚น ์กฐํ•ฉ ์ •๋ฆฌ

์กฐํ•ฉ์„ค๋ช…
๋™๊ธฐ(Sync) + ๋ธ”๋กœํ‚น(Blocking)์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
๋™๊ธฐ(Sync) + ๋…ผ๋ธ”๋กœํ‚น(Non-Blocking)์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๊ณ„์† ํ™•์ธํ•˜๋ฉด์„œ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ( CPU ์ž์›์„ ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.)
๋น„๋™๊ธฐ(Async) + ๋ธ”๋กœํ‚น(Blocking)์š”์ฒญ ์ž์ฒด๋Š” ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—… ์ฒ˜๋ฆฌ๋Š” ๋ธ”๋กœํ‚น๋œ๋‹ค..
๋น„๋™๊ธฐ(Async) + ๋…ผ๋ธ”๋กœํ‚น(Non-Blocking)์š”์ฒญ ํ›„, ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

๐ŸŸก ๋™๊ธฐ(Sync) + ๋ธ”๋กœํ‚น(Blocking)

์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ๋ชจ๋“  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฒฐ๊ณผ ๊ฐ’์„ ์‘๋‹ตํ•˜๋ฉด ๋‹ค์Œ ์š”์ฒญ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐ŸŸก ๋™๊ธฐ(Sync) + ๋…ผ ๋ธ”๋กœํ‚น(Non-Blocking)

๋…ผ๋ธ”๋กœํ‚น์œผ๋กœ ์‘๋‹ต์€ ๋ฐ”๋กœ ๋ฐ›์ง€๋งŒ ๋™๊ธฐ๋ผ์„œ ์–ด์ฐจํ”ผ ๊ฒฐ๊ณผ ์—†์œผ๋ฉด ๊ทธ ์ž‘์—… ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ผ์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

โžก๏ธ ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ธ ๊ฒƒ ๊ฐ™๋‹ค.


๐ŸŸก ๋น„๋™๊ธฐ(Async) + ๋ธ”๋กœํ‚น(Non-Blocking)

์š”์ฒญ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ โžก๏ธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ฆ‰์‹œ ๋‹ค์Œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ์ž‘์—…์€ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด, ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถฐ ์žˆ๋‹ค.

์š”์ฒญ ์ž์ฒด๋Š” ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์•„๋„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ๋“ค์€ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.


๐ŸŸก ๋น„๋™๊ธฐ(Async) + ๋…ผ ๋ธ”๋กœํ‚น(Non-Blocking) โœ…

์š”์ฒญ๊ณผ ์ž‘์—…์„ ๋ชจ๋‘ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์‹œ์„ฑ(Concurrency) VS ๋ณ‘๋ ฌ์„ฑ(Parallelism)

๋™์‹œ์„ฑ (Concurrency)

  • ํ•˜๋‚˜์˜ CPU์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

  • ์‹ค์ œ๋กœ ๊ฐ™์€ ์ˆœ๊ฐ„์— ์—ฌ๋Ÿฌ ์ž‘์—… ์ˆ˜ํ–‰ โŒ

โžก ์ž‘์—… ๊ฐ„ ์ „ํ™˜์„ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž„

ex> ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(Multi-Threading), ๋น„๋™๊ธฐ(Async)ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๋ จ


๋ณ‘๋ ฌ์„ฑ

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ CPU๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์™„์ „ํžˆ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

  • ๊ฐ ์ž‘์—…์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ

โžก ๋™์‹œ์„ฑ๊ณผ ๋‹ค๋ฅด๊ฒŒ "์Šค๋ ˆ๋“œ ์ „ํ™˜"์ด ์•„๋‹ˆ๋ผ "๊ฐ ์ž‘์—…์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋จ"

ex> ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ(Multi-processing), ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ(Parallel Streams), ForkJoinPool๊ณผ ๊ด€๋ จ


๋™์‹œ์„ฑ VS ๋ณ‘๋ ฌ์„ฑ ๋น„๊ต

๋น„๊ต ํ•ญ๋ชฉ๋™์‹œ์„ฑ(Concurrency)๋ณ‘๋ ฌ์„ฑ(Parallelism)
๊ฐœ๋…์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ฒˆ๊ฐˆ์•„ ์‹คํ–‰ (์Šค๋ ˆ๋“œ ์ „ํ™˜)์—ฌ๋Ÿฌ ์ž‘์—…์„ ์™„์ „ํžˆ ๋™์‹œ์— ์‹คํ–‰
CPU ๊ฐœ์ˆ˜๋‹จ์ผ CPU์—์„œ๋„ ๊ฐ€๋Šฅ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU ํ•„์š”
์ž‘์—… ๋ฐฉ์‹์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์Šค์œ„์นญํ•˜์—ฌ ์ฒ˜๋ฆฌ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰
์ ์šฉ ๊ธฐ์ˆ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ, ๋ณ‘๋ ฌ ์—ฐ์‚ฐ
์žฅ์ ํ•˜๋‚˜์˜ CPU๋กœ๋„ ๋‹ค์ค‘ ์ž‘์—… ๊ฐ€๋Šฅ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
๋‹จ์ ์Šค๋ ˆ๋“œ ์ „ํ™˜ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ™˜๊ฒฝ์—์„œ๋งŒ ํšจ๊ณผ์ , ๋น„์Œˆ
์˜ˆ์ œ์›น ์„œ๋ฒ„์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ, ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๋ฃจํ”„๋จธ์‹ ๋Ÿฌ๋‹ ์—ฐ์‚ฐ, ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
profile
๋ˆ„์›Œ๋งŒ ์žˆ์ง€ ๋ง๊ณ  ์ œ๋ฐœ ๋ญ๋ผ๋„ ํ•˜์ž.

0๊ฐœ์˜ ๋Œ“๊ธ€