
๐ ์๊ฐ: ํจ์์ ์ข ๋ฃ ์์ ๊ณผ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌ ์์ ์ together ์ฌ๋ถ
์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ ํ ๋ค์ ์์ ์ ์ํํ๋ ๋ฐฉ์์ด๋ค.
ํน์ ์์ ์ด ์ค๋ ๊ฑธ๋ฆด ๊ฒฝ์ฐ ๋ค๋ฅธ ์์ ์ด ๋ธ๋กํน(Blocking)๋์ด ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆด ์ ์๋ค.

โก๏ธ ์์ฒญ(์์: 1, 2, 3, 4)์ ํตํด ํธ์ถ๋ ํจ์๊ฐ ๋๋๋ ์์ ๊ณผ ํด๋น ํจ์์ ๊ฒฐ๊ณผ ๊ฐ์ด ์ ๋ฌ๋๋ ์์ ์ด ์ผ์นํ๋ ๊ฒ์ด ๋๊ธฐ ๋ฐฉ์์ด๋ค.

๐ฌ ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์์ ํ๋ฉด์ ์ผ๋๊ณ ์๋ฆฌ๋ฅผ ๋น์ด๋ค๋ฉด?
๐จ ์ฌ์ฉ์๊ฐ ์์ ์ ๋ง์น์ง ์์ ์ฑ ์๋ฆฌ๋ฅผ ๋น์ฐ๋ฉด ๋ค์ ์ฌ์ฉ์๋ ๊ทธ ์์ ์ด ๋๋ ๋๊น> ์ง ๋๊ธฐํด์ผ ํ๋ค.
ํ ์์ ์ด ๋๋์ง ์์๋ ๋ค์ ์์ ์ ์ํํ ์ ์๋ค.

ํจ์์ ์ข ๋ฃ์ ๊ฒฐ๊ณผ๊ฐ์ ์๊ฐ์ด ๋ค๋ฅธ ๊ฒ์ด ๋น๋๊ธฐ ๋ฐฉ์์ด๋ค.

์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ (์: API ํธ์ถ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ, ํ์ผ ์ฒ๋ฆฌ)์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ฉด ์ฑ๋ฅ์ด ํฅ์๋๋ค.
Java์์๋ @Async, ExecutorService, WebFlux ๋ฑ์ ํตํด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
| ๋๊ธฐ | ๋น๋๊ธฐ | |
|---|---|---|
| ์์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ | ์์ฐจ์ ์ผ๋ก ์งํ | ๋์์ ์ฌ๋ฌ ์์ ์งํ |
| ์๋ต ๋๊ธฐ ์ฌ๋ถ | ์์ ์ด ๋๋ ๋ ๊น์ง ๋๊ธฐ | ์์ ์ด ๋๋์ง ์์๋ ์์ฒญ ์ํ ๊ฐ๋ฅ |
| ์ฑ๋ฅ | ์๋ ๋๋ฆผ | ๋๊ท๋ชจ ํธ๋ํฝ์์ ์๋ ๋น ๋ฆ |
| ์ฌ์ฉ ๋ฐฉ๋ฒ | ์ผ๋ฐ ๋ฉ์๋ ํธ์ถ | @Async, ExecutorService, โข โข โข |
| ์ ์ฉ ์์ | CRUD, ๋ฐ์ดํฐ ์กฐํ | ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋น๋๊ธฐ API |
๐ ์ ์ด๊ถ: ํจ์๋ฅผ ์คํํ ์ ์๋ ๊ถ๋ฆฌ
์์
์ ์ํํ ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๋๊น์ง ํ์ฌ ์ค๋ ๋๊ฐ ๋ฉ์ถฐ์๋ ๋ฐฉ์

์ด๊ธฐ์๋ 1๏ธโฃํจ์ A๊ฐ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ B๊ฐ ํธ์ถ๋ ๋ ํด๋น 2๏ธโฃ์ ์ด๊ถ์ B์๊ฒ ๋๊ฒจ์ค๋ค.
์ดํ B๋ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ๋ชจ๋ ์์ ์ ์ํํ ํ A์๊ฒ ๋๋ ค์ฃผ๋ฉด3๏ธโฃ A๋ ํด๋น ์ ์ด๊ถ์ผ๋ก ์์ ์ ์ํํ๋ค.
์์
์ ์์ฒญํ ํ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์
์ ์ํํ ์ ์๋ ๋ฐฉ์

ํจ์ A๋ ์ ์ด๊ถ์ ํจ์ B์๊ฒ ์ ์ ๋๊ฒจ์ฃผ์ด ํจ์ B๋ฅผ ํธ์ถํ๊ณ ํจ์ B๋ ํด๋น ์ ์ด๊ถ์ ๋ฐ๋ก A์๊ฒ ๋๋ ค์ค๋ค. (์งง์ ์๊ฐ์ ์ ์ด๊ถ์ด ์ฃผ๊ณ ๋ฐ์์ง๋ค.)
B๋ ์ ์ด๊ถ์ ๋ฐ์ ํธ์ถ๋์๊ธฐ ๋๋ฌธ์ ์์ ์ ์์
์ ์ํํ ์ ์๊ณ ํจ์ A๋ ๋๋ ค๋ฐ์ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์์
์ ์ํํ ์ ์๋ค.
| ๋ธ๋กํน | ๋ ผ ๋ธ๋กํน | |
|---|---|---|
| ์์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ | ์ ์ด๊ถ์ ๋๊ฒจ์ค๋ค. | ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ๊ณ ๋ฐ๋ก ๋ฐ๋๋ค. |
| ์๋ต ๋๊ธฐ ์ฌ๋ถ | ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ด ์ฌ ๋๊น์ง ๋๊ธฐ | ์์ฒญ์ ๋ณด๋ด๊ณ ์ฆ์ ๋ค์ ์์ ์งํ ๊ฐ๋ฅ |
| ์ค๋ ๋ ํจ์จ | ํ๋์ ์์ฒญ์ด ํ๋์ ์ค๋ ๋๋ฅผ ์ ์ | ํ๋์ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ์์ฒญ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
| ์ ์ฉ ์์ | ์ผ๋ฐ์ ์ธ ํ์ผ I/O, JDBC ์ฐ๊ฒฐ | WebFlux, Netty ๊ธฐ๋ฐ ์น ์๋ฒ |
| ์กฐํฉ | ์ค๋ช |
|---|---|
| ๋๊ธฐ(Sync) + ๋ธ๋กํน(Blocking) | ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ด ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. |
| ๋๊ธฐ(Sync) + ๋ ผ๋ธ๋กํน(Non-Blocking) | ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๊ณ์ ํ์ธํ๋ฉด์ ๊ธฐ๋ค๋ฆฐ๋ค. ( CPU ์์์ ๋ง์ด ์ฌ์ฉํ ์ ์๋ค.) |
| ๋น๋๊ธฐ(Async) + ๋ธ๋กํน(Blocking) | ์์ฒญ ์์ฒด๋ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋์ง๋ง ๋ด๋ถ ์ค๋ ๋์ ์์ ์ฒ๋ฆฌ๋ ๋ธ๋กํน๋๋ค.. |
| ๋น๋๊ธฐ(Async) + ๋ ผ๋ธ๋กํน(Non-Blocking) | ์์ฒญ ํ, ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค. |
๐ก ๋๊ธฐ(Sync) + ๋ธ๋กํน(Blocking)

์์ฒญ์ ๋ณด๋ด๊ณ , ๋ชจ๋ ์์ ์ ์ฒ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ ๊ฐ์ ์๋ตํ๋ฉด ๋ค์ ์์ฒญ๋ ์์ ์ ์ํํ ์ ์๋ค.
๐ก ๋๊ธฐ(Sync) + ๋ ผ ๋ธ๋กํน(Non-Blocking)
๋ ผ๋ธ๋กํน์ผ๋ก ์๋ต์ ๋ฐ๋ก ๋ฐ์ง๋ง ๋๊ธฐ๋ผ์ ์ด์ฐจํผ ๊ฒฐ๊ณผ ์์ผ๋ฉด ๊ทธ ์์ ๋๋ ๋๊น์ง ๋ค์ ์ผ์ ํ์ง ๋ชปํ๋ค.
โก๏ธ ๋๋ฌด ๋นํจ์จ์ ์ธ ๊ฒ ๊ฐ๋ค.
๐ก ๋น๋๊ธฐ(Async) + ๋ธ๋กํน(Non-Blocking)

์์ฒญ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ โก๏ธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ฆ์ ๋ค์ ์์ ์ ํ ์ ์๋ค.
ํ์ง๋ง ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ด๋ถ ์์
์ ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋์ด, ์์
์ด ์๋ฃ๋ ๋๊น์ง ํด๋น ์ค๋ ๋๊ฐ ๋ฉ์ถฐ ์๋ค.
์์ฒญ ์์ฒด๋ ์์ ์ด ๋๋์ง ์์๋ ํ ์ ์์ง๋ง ๋ด๋ถ ์ค๋ ๋๋ค์ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผํ๋ค.
๐ก ๋น๋๊ธฐ(Async) + ๋ ผ ๋ธ๋กํน(Non-Blocking) โ

์์ฒญ๊ณผ ์์ ์ ๋ชจ๋ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ค.

ํ๋์ CPU์์ ์ฌ๋ฌ ์์ ์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํํ๋ ๋ฐฉ์
์ค์ ๋ก ๊ฐ์ ์๊ฐ์ ์ฌ๋ฌ ์์ ์ํ โ
โก ์์ ๊ฐ ์ ํ์ ํตํด ๋น ๋ฅด๊ฒ ์ํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์
ex> ๋ฉํฐ ์ค๋ ๋(Multi-Threading), ๋น๋๊ธฐ(Async)ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ด๋ จ
์ฌ๋ฌ๊ฐ์ CPU๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ ์์ ์ ์์ ํ ๋์์ ์คํํ๋ ๋ฐฉ์
๊ฐ ์์ ์ด ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ ์๋๊ฐ ํฌ๊ฒ ํฅ์
โก ๋์์ฑ๊ณผ ๋ค๋ฅด๊ฒ "์ค๋ ๋ ์ ํ"์ด ์๋๋ผ "๊ฐ ์์ ์ด ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋จ"
ex> ๋ฉํฐํ๋ก์ธ์ฑ(Multi-processing), ๋ณ๋ ฌ ์คํธ๋ฆผ(Parallel Streams), ForkJoinPool๊ณผ ๊ด๋ จ
| ๋น๊ต ํญ๋ชฉ | ๋์์ฑ(Concurrency) | ๋ณ๋ ฌ์ฑ(Parallelism) |
|---|---|---|
| ๊ฐ๋ | ์ฌ๋ฌ ์์ ์ ๋ฒ๊ฐ์ ์คํ (์ค๋ ๋ ์ ํ) | ์ฌ๋ฌ ์์ ์ ์์ ํ ๋์์ ์คํ |
| CPU ๊ฐ์ | ๋จ์ผ CPU์์๋ ๊ฐ๋ฅ | ๋ฉํฐ์ฝ์ด CPU ํ์ |
| ์์ ๋ฐฉ์ | ์ฌ๋ฌ ์์ ์ ๋น ๋ฅด๊ฒ ์ค์์นญํ์ฌ ์ฒ๋ฆฌ | ์ฌ๋ฌ ์์ ์ ๋์์ ์คํ |
| ์ ์ฉ ๊ธฐ์ | ๋ฉํฐ์ค๋ ๋ฉ, ๋น๋๊ธฐ ์ฒ๋ฆฌ | ๋ฉํฐํ๋ก์ธ์ฑ, ๋ณ๋ ฌ ์ฐ์ฐ |
| ์ฅ์ | ํ๋์ CPU๋ก๋ ๋ค์ค ์์ ๊ฐ๋ฅ | ์ฑ๋ฅ ์ต์ ํ, ๋๋ ๋ฐ์ดํฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ |
| ๋จ์ | ์ค๋ ๋ ์ ํ ์ค๋ฒํค๋ ๋ฐ์ | ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์์๋ง ํจ๊ณผ์ , ๋น์ |
| ์์ | ์น ์๋ฒ์ ์์ฒญ ์ฒ๋ฆฌ, ๋น๋๊ธฐ ์ด๋ฒคํธ ๋ฃจํ | ๋จธ์ ๋ฌ๋ ์ฐ์ฐ, ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ |