ยท Develop ยท 14 min read
Java NIO์ Netty
NIO, ๊ทธ๋ฆฌ๊ณ Netty
Spring Webflux๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ด ์์ ๊ณต๋ถํ๊ฒ ๋์๋ค.
Spring Boot๋ 2.x ๋ฒ์ ๋ถํฐ Webflux ์ ํ์ ๋ด์ฅ ํฐ์บฃ์ด ์๋ Netty๋ฅผ ๊ธฐ๋ณธ์ค์ ์ผ๋ก ์ก๋๋ค.
Netty๋ NIO ๊ธฐ๋ฐ ๋คํธ์ํฌ ์ดํ๋ฆฌ์ผ์ด์
ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์ NIO๋ ๊ฐ์ด ์ ๋ฆฌํ์๋ค.
NIO๋?
Java New Input/Output์ ์ฝ์๋ก ์๋ฐ 4๋ถํฐ๋ถํฐ ์ง์๋ ์๊ฐ๋ณด๋ค ์ค๋๋ ๊ธฐ๋ฅ์ด๋ฉฐ,
์๋ฐ 7๋ถํฐ๋ NIO2๊ฐ ์ง์๋์๋ค.
๋ค์์ NIO์ ์ด์ IO ๋ฐฉ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋น๊ต์ด๋ค.
์ด์ IO๋ BIO๋ผ๊ณ ์นญํ๋ค.

BIO
๊ธฐ์กด ์๋ฐ I/O๋ ๊ฐ์๋จธ์ ์ ํ๊ณ๋ก OS์ ์ปค๋ ๋ฒํผ๋ฅผ ์ง์ ์ ์ผ๋ก ํธ๋ค๋ง ํ ์ ์์๋ค.
์๋ํ๋ฉด ์์ผ์ด๋ ํ์ผ์์ Stream์ด ๋ค์ด์ค๋ฉด ์ปค๋ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ์จ์ผํ๋๋ฐ
๋น์์๋ ์ด๋ฅผ ์ฝ๋ ๋ ๋ฒจ์์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ ๋์์ผ๋ก BIO์ ๊ฒฝ์ฐ, JVM์ด ์ปค๋์๊ฒ ์์คํ
์ฝ์ ์ฌ์ฉํ๊ฒ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
ํ์ง๋ง ์ด ๊ณผ์ ์์ JVM์
JVM -> ์ปค๋-> ์์คํ
์ฝ -> ๋์คํฌ ์ปจํธ๋กค๋ฌ -> DMA๊ฐ ์ปค๋๋ฒํผ๋ก ๋ณต์ฌ -> JVM ๋ฒํผ์ ๋ณต์ฌ
์ ๊ธด ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
์ด๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ก๋
JVM์ผ๋ก ๋ด๋ถ ๋ฒํผ ๋ณต์ฌ์ CPU๊ฐ ๊ด์ฌ -> CPU ์ค๋ฒํค๋
๋ณต์ฌ๋ Buffer๋ ํ์ฉ ํ GC ๋์์ด๋จ. -> Stop-the-World๋ก ์ธํ ์ฑ๋ฅ ์ ํ
๋ณต์ฌ์ค์ธ I/O ์์ฒญ ์ค๋ ๋๋ ๋ธ๋กํน ์ํ -> ์ฒ๋ฆฌ์๋ ์ ํ
๊ฐ ์๋ค.
ํนํ 3๋ฒ์งธ์ ๋ธ๋กํน ์ด์๊ฐ ์ฃผ์ ๋ฌธ์ ์๋ค.
Stream์ ๋จ๋ฐฉํฅ์ผ๋ก ์ฝ๊ธฐ ๋๋ฌธ์ ์ฝ์ ๋์ ์ธ ๋ InputStream๊ณผ OutputStream์ผ๋ก
๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ์๊ณ , ์ฝ๊ณ ์ฐ๋ ์์
์ด ๋ค ๋๋ ๋ ๊น์ง๋ ์๋ฌด๊ฒ๋ ํ ์ ์์๋ค.
๋ํ ์๋ฐ๋ C์ C++ ์ค๋ ๋์๋ ๋ค๋ฅด๊ฒ ํ๋จ๊ณ์ ์ถ์ํ ๋ ์ด์ด๊ฐ ๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์
์ด ๋๋ณด๋ค ์ค๋ ๋ ์์ฑ์ ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์ ํ ๊ฒฝ์ฐ์๋ ์์ ์ ์ํ
ํด๋ผ์ด์ธํธ์ ์ค๋ ๋๊ฐ ๋ค ๋ง๋ค์ด์ง๋ ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ์๋๊ฐ ์ฒํ๋์๋ค.
(๊ทธ๋์ ์ค๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด pool ํ์์ผ๋ก ์ฌ์ฉํ๋๊ฒ ๊ฐ๋ค.)
NIO
์๋ฐ 1.3 ์ดํ ๋ถํฐ JVM์ ํต์ผ๋ ์ธํฐํ์ด์ค๊ฐ ๋์
๋์ด, ๊ฐ OS๋ณ ์ปค๋ ๋ฒํผ์ ์ ๊ทผ ํ ์ ์๊ฒ ๋์๋ค.
IO์ NIO ๋ชจ๋ Blocking ๋ชจ๋๋ฅผ ์ง์ํ์ง๋ง, ๋ธ๋กํน์ ๋น ์ ธ๋์ค๊ธฐ ์ํ ๋ฐฉ๋ฒ์๋ ์ฐจ์ด๊ฐ ์๋ค.
IO๋ ์ค์ง Stream์ ๋ซ๋ ๊ฒ์ผ๋ก๋ฏผ ๋ธ๋กํน์ ๋น ์ ธ๋์ฌ ์ ์์ง๋ง, NIO๋ Selector๋ฅผ ํตํด์ ์ด๋ฅผ ํด๊ฒฐ ํ ์ ์๋ค.
์ ๋ ํฐ

java.nio.channels.Selector๋ ์๋ฐ์์์์ ๋
ผ๋ธ๋กํน I/O ๊ตฌํ์ ํต์ฌ์ผ๋ก์จ, **Multiplex/IO **Select****์ ๊ฐ๋ค.
Select๋ ์์คํ
์ด๋ฒคํธ ํต์ง API๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ์ค๋ ๋๋ก ๋์์ ๋ง์ IO๋ฅผ ๋ด๋นํ ์ ์๋ค.
์์คํ ์ด๋ฒคํธ ํต์ง API๋ Linux์ Select()์ Epoll()๊ณผ ๊ฐ์ด ๋ค์ค I/O๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉํฐํ๋ ์ฑ ๋ฐฉ์์ API๋ฅผ ๋งํ๋ค
netty์ ๊ฒฝ์ฐ, ๋ฆฌ๋ ์ค ์์์ ์๋ํ ๊ฒฝ์ฐ, ์๋์ ์ผ๋ก Select๊ฐ ์๋ Epoll์ ์ฌ์ฉํ๋ค.
Select์ Epoll ๋ชจ๋ ์์คํ ์ฝ์ด๋ค.
๊ฐ๋จํ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์๋ฉด, ์์ผ์ ์ด๋ฉด ํ์ผ ๋์คํฌ๋ฝํฐ๋ผ๋ unsigned int ํ์์ ์์ผ ID๋ฅผ ๋ถ์ฌ ํ๋ค.
Select์ ๊ฒฝ์ฐ ๋ฃจํ๋ฅผ ๋๋ฉด์ ํ์ผ ๋์คํฌ๋ฝํฐ๋ค์ ๋ณํ๋ฅผ ๊ฐ์ํ๋ ๋ฐ๋ฉด,
epoll์ ์ฝ๋ฐฑํ์์ผ๋ก ๊ด๋ฆฌํ๋ค. ์ฆ, epoll์ด ๋ ๋น ๋ฅด๋ค.
๋คํฐ ์๊ฐ
ํ์ง๋ง ์์ ๊ฐ์ด NIO๋ฅผ ํตํด Low Level API๋ฅผ ์ง์ ์ด์ฉํ๋ฉด ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฌํ๋๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
๋ํ ๊ทธ๊ฑธ ๋ค๋ฃฐ ๊ณ ๊ธ ๊ฐ๋ฐ์๋ค์๊ฒ๋ง ์์กดํ๊ฒ ๋ ์ ๋ฐ์ ์๋ค. ๊ทธ๋์ Netty๊ฐ ๋ฑ์ฅํ์๋ค.
๋คํฐ ํต์ฌ ์ปดํฌ๋ํธ
๋คํฐ๋ ๋ค์๊ณผ ๊ฐ์ด 4๊ฐ์ ์ฃผ์ ์์๋ก ๊ตฌ์ฑ๋์ด์๋ค.
Channel
- ์ฑ๋์ ์๋ฐ NIO์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ธ ๊ทธ Channel์ด๋ค. ๋คํฐ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ํ ์ด์ก ์๋จ์ผ๋ก ์ฌ์ฉ๋๊ณ , ๋คํฐ๊ฐ ์๋์ผ๋ก Channel์ ์ด๊ฑฐ๋ ๋ซ์์ฃผ๊ธฐ ๋๋ฌธ์ ์ง์ ๊ตฌํํ ํ์๋ ์๋ค.
CallBack
- ์ฝ๋ฐฑ ๋ํ ๊ธฐ์กด์ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ์ฝ๋ฐฑํจ์์ ๋๊ฐ๋ค. ๋คํฐ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ฝ๋ฐฑ์ ํธ๋ฆฌ๊ฑฐํ๋๋ฐ, ์ฝ๋ฐฑ์ด ๋ฐ์ํ๋ฉด ๋ด๋ถ์์๋
ChannelHandler์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์ฝ๋ฐฑ ๋ํ ๊ธฐ์กด์ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ์ฝ๋ฐฑํจ์์ ๋๊ฐ๋ค. ๋คํฐ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ฝ๋ฐฑ์ ํธ๋ฆฌ๊ฑฐํ๋๋ฐ, ์ฝ๋ฐฑ์ด ๋ฐ์ํ๋ฉด ๋ด๋ถ์์๋
Future
- Future๋ ์์
์ด ์๋ฃ๋๋ฉด Application์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ค ํ๋์ด๋ค. ์ด ๊ฐ์ฒด๋ ๋น๋๊ธฐ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ์ญํ ์ ํ๋ฉฐ, ์ด๋ฅผ
placeholder๋ผ๊ณ ๋ถ๋ฅธ๋ค. - JDK ์์ฒด์์ ์ด์๊ฐ์ ์ญํ ์ํ๋
java.util.concurrent.Future์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ง๋ง, ์๋์ผ๋ก ์์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฑฐ๋, ์๋ฃ ์ ๊น์ง ๋ธ๋กํนํ๋ ๊ธฐ๋ฅ๋ง ์์๋ค. - ๊ทธ๋์ ๋คํฐ๋ ์์ฒด์ ์ผ๋ก
ChannelFuture๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์๋์ผ๋ก ์๋ฃ๋๋๋ก ๊ตฌํํ์๋ค.
ChannelFuture์๋ChannelFutureListener์ธ์คํด์ค๋ฅผ ํ๋ ์ด์ ๋ฑ๋กํ ์ ์์ผ๋ฉฐ, ์์ ์ด ์๋ฃ๋๋ฉด ์ด Listener๋ค์ด ํธ์ถ๋๋ฉฐ ์ฒ๋ฆฌ ์ฑ๊ณต ์ ๋ฌด๋ฅผ ํ์ธํ ์ ์๋ค. ์ด๋ฐ ๋ฉ์ปค๋์ฆ์ ํตํด ์์ ์๋ฃ๋ฅผ ์๋์ผ๋ก ํ์ธํ๊ฑฐ๋, ๋ธ๋กํน ํ์ง ์์๋ ๋๋ค.- Future๋ ์์
์ด ์๋ฃ๋๋ฉด Application์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ค ํ๋์ด๋ค. ์ด ๊ฐ์ฒด๋ ๋น๋๊ธฐ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ์ญํ ์ ํ๋ฉฐ, ์ด๋ฅผ
์ด ๋๋ถ์ Netty์ ๋ชจ๋ OutBound ์์ ์ ChannelFuture๋ฅผ ๋ฐํํ๋ฉฐ, ์งํ์ ๋ธ๋กํนํ์ง ์๋๋ค.
Event ์ Handler
- ๋คํฐ๋ ์์ ์ ์ํ ๋ณํ๋ฅผ ์๋ฆฌ๊ธฐ ์ํด ๊ณ ์ ํ ์ด๋ฒคํธ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ ํ ๋์์ ํธ๋ฆฌ๊ฑฐ ํ ์ ์๋ค.

- ๋ค์๊ณผ ๊ฐ์ ์ค๊ณ์์ ํ Channel์ ์ ์ถ๋ ฅ์ด ๋์ผํ ์ค๋ ๋์์ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ๊ฐ ํ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน ์์๋ ํ๋์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ฌ๋ฌ๊ฐ์ Channel๊ณผ ์ฐ๊ฒฐ๋ ์ ์๋ค.
๋คํฐ์ Thread ๊ด๋ฆฌ
- 1. ๋น๋๊ธฐ ๋น๋๊ธฐ ๋ฐฉ์์ ๊ฒฝ์ฐ์๋ 1 Event Loop๊ฐ ์ฌ๋ฌ Channel์ ์ฒ๋ฆฌํ๋ค.

- 2. ๋๊ธฐ ๋๊ธฐ ๋ฐฉ์์ ๊ฒฝ์ฐ์๋ 1 Event Loop๊ฐ 1 Channel์ ์ฒ๋ฆฌํ๋ค.

๊ธฐํ ํน์ง
์ ๋ก ์นดํผ
ํ์ฌ NIO์ Epoll ์ ์ก์์๋ง ์ด์ฉ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ผ๋ก์จ, ํ์ผ ์์ค์ ์ ๋ฐ์ดํฐ๋ฅผ ์ปค๋ ๊ณต๊ฐ์์ ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ๋ณต์ฌํ๋ ๊ณผ์ ์ ์๋ตํ๋ค.
์ด ๊ธฐ๋ฅ ๋๋ถ์ ์์ BIO์์ ์ค๋ช ํ ๋ ์ฒ๋ผ ๋ฒํผ๋ฅผ ๋ณต์ฌํด์ GC ๋์์ด ๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค. ๋๋ถ์ ๋ฆฌ๋ ์ค ์์์ ๊ณผ๋ถํ ์กฐ๊ฑด์์ ์ฑ๋ฅ์์ ์ด์ ์ ๊ฐ์ ธ๊ฐ ์๋ ์๋ค,
๊ณผ๊ฑฐ์ ์ฐ์ฐํ ์จ๋์ ๊ธ์ ๋ฐ๊ฒฌํ์ฌ ์ด๊ณณ์ผ๋ก ๋ค์ ์ฎ๊ฒจ๋ณด์์ต๋๋ค.
ํ๋ฆฐ ๋ถ๋ถ์ ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
Reference
wikibook.co.kr/netty-in-action/
[๋คํฐ ์ธ ์ก์ : Netty๋ฅผ ์ด์ฉํ ์๋ฐ ๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ์๋ฒ & ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ
๋คํฐ๋ ๋ณต์กํ ๋คํธ์ํน, ๋ฉํฐ์ค๋ ๋, ๋์์ฑ์ ๊ด๋ฆฌํ๋ ์๋ฐ ๊ธฐ๋ฐ ๋คํธ์ํน ํ๋ ์์ํฌ๋ก์, ๋ฐ๋ณต์ ์ธ ์ ์์ค ์ฝ๋๋ฅผ ๋ด๋ถ๋ก ๊ฐ์ถค์ผ๋ก์จ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํด
wikibook.co.kr](https://wikibook.co.kr/netty-in-action/)
์๋ฌธ์
1. Spring Webflux๋ ๊ธฐ์กด ThreadLocal์ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋๋ฅผ ์ด๋ป๊ฒ ๋ณด๊ดํ ๊น?
๊ธฐ์กด์ ์ ํต์ ์ธ Thread Pool ๋ฐฉ์์ 1 ์์ฒญ == 1 Thread ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์
์ธ์ฆ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ค์ ThreadLocal์ ํ์์ ๋ณด๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฒคํธ ๋ฃจํ ๊ธฐ๋ฐ์ Netty์ ๊ฐ์ ์ํคํ ์ฒ์์๋ N๊ฐ ์์ฒญ == 1 ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์
ThreadLocal์ ์ฌ์ฉํ ์ ์๋ค. ์ฒ์ ์นํ๋ญ์ค๋ฅผ ๋ฐฐ์ธ๋ ์ด๋ถ๋ถ์ด ์ ์ผ ๊ถ๊ธํ์์๋ค.
๋ํ์ ์ธ ์์๋ก SpringMVC - Spring Security์์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ SecurityContext๋ก ์ ์ฅํ๊ณ ,
์ด๋ฅผ SecurityContextHolder๋ก ๊ฐ์ธ์ ThreadLocal์ ์ ์ฅํ์ฌ ์ฒ๋ฆฌํ๋ค.
ํ์ง๋ง webflux๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๊ฐ์ด ์กํ์ง ์์๋ค.
๊ทธ๋์ Spring ๋ด๋ถ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ด๋ป๊ฒ ๊ตฌํ๋์ด์๋์ง ๋น๊ตํด๋ณด์๋ค.
- SpringMVC : SecurityContextHolder [์ฝ๋]

์ฃผ์์ ๋ณด๋ฉด SpringMVC์์๋ SecurityContext๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ ์ง๋ฅผ
SecurityContextStrategy ๋ผ๋ ์ ๋ตํจํด์ผ๋ก ๊ฒฐ์ ํ๋๋ฐ
๋ณ๋ค๋ฅธ ์ค์ ์ด ์์ผ๋ฉด ThreadLocal์ ์ ์ฅํ๋๊ฑธ ๋ณผ ์ ์๋ค.
- Spring Webflux : ReactiveSecurityContextHolder [์ฝ๋]

๋์ผํ ์ญํ ์ ํ๋ ReactiveSecurityContextHolder๋ฅผ ๋ณด๋ฉด SecurityContext๊ฐ ์๋
Reactor์ ์๋ Context๋ผ๋ ์์ญ์ ์ ์ฅํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋์ Reactor-Core์ Context [์ฝ๋]๋ฅผ ๋ณด์๋๋

Reatorํ๊ฒฝ์์ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ ์ด๋ ๋ณด์ ํ ํฐ๋ฑ์ ์ฌ์ฉํ๊ธฐ ์ด์์ ์ธ Context๊ฐ ์กด์ฌํ์๋ค.
๊ทธ๋ฌ๋ ์ฃผ์์ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด, ์ ์ ์์ key/value๋ง ์ ์ฅํ๊ธฐ๋ฅผ ๊ถ์ฅํ๊ณ ์๊ณ ,
ํ Context๋น 5๊ฐ์ Key/value๊ฐ ๋์ผ๋ฉด Map์ผ๋ก ๋ณต์ฌ๋์ด ์ฌํ ๋น ๋๋ค๊ณ ์ ํ ์์๋ค.
๊ทธ๋์ ๋ ์ฐพ์๋ณด์๋๋โฆ

์ด๋ฐ์์ผ๋ก ๋ณ์ 5๊ฐ ์ดํ๋ฉด Context1, 2, 3.. ์ด๋ฐ ์์ผ๋ก ๋ณ์ ๊ฐ์๋ฅผ
๋ฐ๋ก ๋ง๋ค์ด ์ ์ฅํ๊ณ 5๊ฐ๊ฐ ๋์ด์ผ๋ง LinkedHashMap์ ์ ์ฅํ๋ ๊ฒ์ ์ ์ ์์๋ค.
์ ์ด๋ ๊ฒ ๋ง๋ค์๋์ง ์ฐพ์๋ณด์๋๋ฐ [์๋ จ PR]
Copy-On-Write ์ ๋ต์ ํตํด ์ฑ๋ฅ์์ ์ด๋์ ๋ณด๋ ค๊ณ ์ด๋ ๊ฒ ๊ตฌํํ ๊ฒ์ด์๋ค.
Reactor ์์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ฒ๋ผ ๋ถ๋ณ๊ฐ์ ์ ์งํ๊ธฐ ์ํด ๊ฐ์ ์ถ๊ฐํ ๋๋ง๋ค.
๊ธฐ์กด์ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ๋๋ฐ, Context๋ด์ 5๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ํ ๋๊น์ง๋
Copy-On-Write ์ ๋ต์ ํตํด ๋ณต์ฌํ๊ฒ ์ฒ๋ผ ์์ด๊ณ , ์ค์ ๋ก ๊ฐ์ ๋ณต์ฌํ์ง ์๋๋ค.
์ฆ Context ๋ด์์ ํ ์์ฒญ์๋ํด 5๊ฐ ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด, ์ฑ๋ฅ์์ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ง์ง๋ง์ ์๊ฒ๋์์ง๋ง, Spring Webflux [๋ํ๋จผํธ]์๋ ์ค๋ช ๋์ด์์๋ค.
์๋ฌดํผ ๊ฒฐ๊ตญ SpringMVC : ThreadLocal == Spring Webflux : Context ์ด๋ค.



![[GC] 1. JVM ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋?](/_astro/gc-jvm-garbage-collector.C0vI9_S2.png)