[Netty] Netty๋ก ๋ฐฐ์๋ณด๋ Non-blocking I/O ๊ธฐ์ด
์ค๋์ Java ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ๊ฝ์ธ Netty์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
What is Netty ?
Netty๋ฅผ ๋ค์ด๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด ์๋ง ํ ๋ฒ ์ฏค c10k ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๊ฒฝํํด๋ณด์ จ๊ฑฐ๋ ๊ด์ฌ์ ๊ฐ์ก์๋งํ ๋ถ์ด์ค ๊ฒ ๊ฐ์ต๋๋ค. Netty๋ JVM์์ ์ฌ์ฉํ ์ ์๋ Java NIO ๊ธฐ๋ฐ์ Non-blocking ํ๋ ์์ํฌ์ ๋๋ค. ์ด๋ ํน์ ํ๋กํ ์ฝ(HTTP ๋ฑ)์ ์๋ฒ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์๋ TCP, UDP์ ๋คํธ์ํฌ ํต์ ์ Non-blocking I/O๋ก ์ฒ๋ฆฌํ์ฌ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ๋ฐํ๋ ํ๋ ์์ํฌ์ ๋๋ค.
Non-blocking์ด ๋ฌด์์ธ๊ฐ์? ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด, ์ด๋ ํ ์์ ์ ๋งํ์์ด ์ด์ด๋๊ฐ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๊ฐ๋จํ ์์๋ฅผ ๋ค์ด๋ณด์๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ง์๋ ๋ง์ง์๊ฐ์ ์์์ ๋จน์ผ๋ฌ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์์์ ๋ง๋๋ ์ฌ๋์ด ์ฃผ๋ฌธ๋ ๋ฐ๊ณ , ๊ฒฐ์ ๋ ํ๊ณ ์๋ฆฌ๋ ํ๋ค๋ฉด? ๊ทธ๋ฌ๋ฉด ํ ์ฌ๋์ด ๋ชจ๋ ์ผ์ ๋ค ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ฌธ์ ๋ฐ๋ค๊ฐ๋ ์์๋ ๋ง๋ค์ด์ผ ํ๊ณ , ๊ฒฐ์ ๋ ํ๋ ๋ฑ ์ค๊ฐ ์ค๊ฐ์ ์ผ๋ค์ด ์์ฐจ์ ์ผ๋ก ๋งํ๋ฉด์ ์์ ์ด ์งํ๋ฉ๋๋ค. ์ด๋ฌ๋ฉด ์ผ์ด ๋นจ๋ฆฌ ์งํ๋์ง ๋ชปํ์ฃ .
๊ทธ๋์ ์ฃผ๋ฌธ๋ฐ๋ ์ฌ๋, ๊ฒฐ์ ๋ฐ๋ ์ฌ๋, ์์ ๋ง๋๋ ์ฌ๋์ ๋ณ๋๋ก ๋์ด, ์ฃผ๋ฌธ์ด๋ผ๋ ์ผ๋ จ์ ๊ณผ์ ์ ๋งํ์์ด ์งํํ๋๋ก ํ๋ ๊ฒ์ ์ปดํจํฐ์์๋ Non-blocking์ด๋ผ๊ณ ํฉ๋๋ค.
Netty๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ณ๊ธฐ
์ ๋ JVM ์ธ์ด๋ก ๋ณดํต ์ฝํ๋ฆฐ์ ์ฌ์ฉํฉ๋๋ค. ์ฝํ๋ฆฐ์์๋ ๋์์ฑ ์ฒ๋ฆฌ๋ฅผ ์ํด Java์ Thread์ Kotlin Extension์ Coroutine์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ๋์์ฑ ์ฒ๋ฆฌ๋ ๋น๋ก ๊ทธ ์ค๋ ๋๊ฐ ๊ฒฝ๋ ์ค๋ ๋๋ผ๊ณ ํ ์ง๋๋ผ๋ ์ปดํจํฐ์ ์์์ ๊ทธ๋งํผ ์๋ชจํ๊ฒ ๋ฉ๋๋ค. ์ค๋ ๋์ ์์ฑ ๊ฐฏ์๋ ํ์ ๋์ด ์๊ณ , ์ฐ๋ฆฌ๋ ํ๋์ ํธ์คํธ์์ ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ข ๋ ๊ณ ๋ฏผ์ ํ๊ฒ ๋์๋๋ฐ, ๊ทธ๋ฌ๋ ์ค Java์ NIO๋ฅผ ์ด์ฉํ Netty ํ๋ ์์ํฌ๋ฅผ ๋ณด๊ฒ ๋์์ต๋๋ค.
Java์ NIO๋ Java์์ ๋ฐ์ดํฐ ์ ์ถ๋ ฅ์ ์ง์ํด์ฃผ๋ ํจํค์ง๋ก ๊ณผ๊ฑฐ IO์์๋ ์ ์ถ๋ ฅ์ ์คํธ๋ฆผ(Stream)๋ก ์ฌ์ฉํ๋ค๋ฉด NIO๋ ์ฑ๋(Channel)์ ์ด์ฉํด ์ ์ถ๋ ฅ์ ์งํํ์ฌ Blocking ๋ฟ๋ง ์๋๋ผ Non-blocking๋ ์ง์ํฉ๋๋ค.
๊ฒ๋ค๊ฐ NIO์ Non-blocking์ ํต์ฌ ๊ฐ์ฒด๋ ๋ฉํฐํ๋ ์(Multiplexor)์ ์ ๋ ํฐ(Selector)๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํตํด ์ฒ๋ฆฌ ์๋ฃ๋ ์ฑ๋์ ์ ํํ์ฌ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ์ฌ ๋จ์ผ ์ค๋ ๋๋ก๋ ๋ค์ค ์ฒ๋ฆฌํ ์ ์๋ ์ต๊ณ ์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์์ธํ ์ด์ผ๊ธฐ๋ ์๋์ ๋ธ๋ก๊ทธ์์ ์ข ๋ ์์ธํ๊ฒ ๋ณผ ์ ์์ต๋๋ค.(https://dev-coco.tistory.com/42)
Netty Architecture
Netty ์ํคํ ์ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก SEDA(Staged Event-Driven Architecture)๋ฅผ ๊ธฐ๋ฐ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ์ด์ฉํ๊ณ ์์ต๋๋ค.
์ฝ์ด ๋ถ๋ถ์ ๋ณด๋ฉด ํ์ฅ ๊ฐ๋ฅํ ์ด๋ฒคํธ ๋ชจ๋ธ๊ณผ ๋ค์ํ ํ๋กํ ์ฝ์ ์ง์์ ์ํ ์ฝ๋ฑ์ด ์์ต๋๋ค. Netty๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ๊ฐ์ฒด์ ์ด๋ฒคํธ๋ฅผ ๋ถ์ฌํ์ฌ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฅด๊ฒ ์งํํด์ฃผ๋ ๋ฐฉ์์ ์ด์ฉํฉ๋๋ค.
์ด๋ฌํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ Java NIO Non-blocking ์์ผ์ Selector๋ฅผ ์ด์ฉํ ๋ฐฉ์์ด๋ฉฐ ๋จ์ผ ์ค๋ ๋ ๋ด์ Selector๋ฅผ ํตํด ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
Selector๋ฅผ ๋ชจ๋ฅด๋ ๋ถ๋ค์ ์ํด ์ ๊น ์ค๋ช ๋๋ฆฌ๋ฉด, ๋ธ๋กํน ์์ผ์ ์ด์ฉํด ์๋ฒ๋ฅผ ๊ฐ๋ฐํ์ ๋ ๋ค์ ์ ์ ์ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด์๋ ์์ ๊ฐ์ด ์์ผ ํ๋๋น ์ค๋ ๋๋ฅผ ๋ถ์ฌํ์ฌ์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์ผ์ด Blocking์ด๊ธฐ ๋๋ฌธ์ ํ๋์ ์ ์ ๊ฐ ๊ทธ ์์ผ์ ๋ฌผ๊ณ ์๋ ๋์์ ๋์์ ์ผ์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ง๋ง Selector๋ ๋จ์ผ ์ค๋ ๋ ๋ด์ Selector ๊ฐ์ฒด๋ฅผ ๋ฃ์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ด์ ์์ผ์ Selector์ ๋ฃ๊ณ ์ด๋ฒคํธ๋ก ๊ด๋ฆฌํ๋ ํํ์ ๋๋ค. ์ด ๊ด๋ฆฌ ๊ฐ์ฒด๋ฅผ Java NIO์ ์ฑ๋(Channel)์ด๋ผ ํฉ๋๋ค.
์ค์ ๋ก Java NIO์์๋ ServerSocketChannel, SocketChannel์ ๋ ผ๋ธ๋กํน ์์ผ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์์์ ๊ฐ์งํ๊ธฐ ์ํด OP_ACCEPT๋ผ๋ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Netty๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์
Java NIO๋ Non-blocking I/O๋ฅผ ์ ๊ณตํด์ฃผ๋ ์ฝ์ด์ ์ํ์ง๋ง ๊ทธ ์ฌ์ฉ๋ฒ์ ๊ธฐ๋ณธ์ ์ธ ๋คํธ์ํฌ ์ง์๊ณผ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ์๋ค๋ฉด ์ด๋ ต์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์ง์์ ์์ธํ ์์ง ์์๋ ์ต๋ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ง์คํ ์ ์๋๋ก ๊ฐ๋ฐํ ๊ฒ์ด ๋ฐ๋ก Netty ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๊ฐ ์ง์ NIO๋ฅผ ์ด์ฉํด Non-blocking ์์ผ์ ์ด์ฉํ์ฌ HTTP ์น ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. TCP ์์ผ์ ์ฌ์ฉํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์๋์ ๊ณผ์ ์ ์ผ๊ด์ ์ผ๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.
- ์ฌ์ฉํ ์์ผ์ ํ์ต ๋ฐ ๊ตฌํ (NIO ServerSocketChannel, Selector)
- accept ์ด๋ฒคํธ ์ ์
- HTTP Header, body์ ์์ฒญ์ ๋ฐ์๋ผ ๋ฒํผ ์ ์, ์๋ต ํค๋ ๋ฐ ๋ฐ๋์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ ์
Netty๋ Spring์ฒ๋ผ ์ด๋ฌํ ์ผ๋ จ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํ๋ ํ๋ ์์ํฌ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ ์ฝ์ ํ์ํ ์ฝ๋ฑ์ ์ ๊ณตํ๊ณ ์์ผ์ ์์ฑํ๋ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ธ์ ํ์ํ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๊ฒ ํ๋๋ก ๋์์ค๋๋ค.
Netty's core components
์ฐ๋ฆฌ๋ Netty๋ก Non-blocking I/O ์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด ์๋์ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ์งํํฉ๋๋ค.
- Channels
- Callbacks
- Future
- Events and handlers
์์ธํ ๋ณด๋ฉด JDK 8์์ ์ ๊ณตํ๋ API๋ค์ ๋๋ค. ์ฐจ๋ก๋ก ์ดํด๋ณด๋ฉด Channel์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์จ์ด์์ ๋ฐ์ํ๋ I/O ์ ํธ๋ค์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์ ๋๋ค. ์ฌ๊ธฐ์๋ NIC์์ ๋ฐ์ํ๋ ๋คํธ์ํฌ์ ์์ฒญ/์๋ต ์ ํธ๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
Callback์ ์ฐ๋ฆฌ๊ฐ ํํ ์ด์ผ๊ธฐํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด์ผ๊ธฐ ํฉ๋๋ค. ์ฝ๋ฐฑ์ ๋ํด ์ด๋ ค์ํ์๋ ๋ถ๋ค์ด ๋ง์ผ์ ๋ฐ, ์ฝ๋ฐฑ์ ๋จ์ํ ๋ฉ์๋์ ๋ถ๊ณผํฉ๋๋ค. ๋ค๋ง ์ฐ๋ฆฌ๊ฐ ํจ์์ ๊ทธ ์ธ์๋ฅผ ๋ณ์๊ฐ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ฉฐ ์ด๋ฅผ ํตํด ์ ์์ ํจ์๊ฐ ํ์์ ํจ์๋ฅผ ์ ์ ํ ์๊ฐ์ ํธ์ถํ๋ค๋ ํน์ฑ์ ์ด์ฉํ ๊ฒ ๋ฟ์ ๋๋ค.
์ฌ๊ธฐ์ ์ ์ ํ ์๊ฐ์ด๋, ํ์์ ํจ์๊ฐ ๋๋๊ธฐ ์ ์ ์ ์์ ํจ์๊ฐ ์ข ๋ฃ๋ ์ ์์์ ์ด์ผ๊ธฐ ํฉ๋๋ค. ํ์์ ํจ์๊ฐ I/O wait ์ํ์ธ ๊ฒฝ์ฐ ๊ทธ๋ฅผ ์ข ๋ฃํ ์๊ฐ์ ์๋ตํง ๋๊น์ง๋ก ํ ๊ฒ์ธ๊ฐ, ์๋๋ฉด ํน์ ์๊ฐ์ ์ ํด๋์ ๊ฒ์ธ๊ฐ๋ ๊ฐ๋ฐ์์ ํ๋จ์ธ ๊ฒ์ด์ฃ . Non-blocking I/O์ ์์ด์ ์ด๋ฌํ ์์ ์ ํ์์ ์ ๋๋ค. ์๋ํ๋ฉด Blocking I/O๋ ์๋ฒ์์ ์๋ตํ ๋๊น์ง ๊ณ์ ๊ธฐ๋ค๋ฆฌ์ง๋ง Non-blocking I/O๋ ์๋ฒ์์ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์์ ์ ์ํํด์ผ ํ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Netty์์๋ ์ด๋ฐ ์ฝ๋ฐฑ์ ChannelHandler๋ผ๋ ์ด๋ฆ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด์ฉํฉ๋๋ค. ์ฐจํ ํฌ์คํธ์์ Netty์์ ์ ๊ณตํ๋ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ์ ๋ํด ๋ค๋ค๋ณผ ๋ ์์ธํ ์ด์ผ๊ธฐ ํด๋ณด๊ฒ ์ต๋๋ค.
Futures๋ JDK 8์์ ์ ๊ณตํ๋ ๋น๋๊ธฐ ๋ฉ์ปค๋์ฆ์ผ๋ก ์์ ์ด ์๋ฃ๋์์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๊ฒ ์๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. Javascript์ Promise์ ์ ์ฌํ๋ฉฐ ์๋ต์ ์ง๊ธ ๋ฐ๋ก ํ์ง ์๊ณ , "์ธ์ ๊ฐ ์๋ต ํด์ค๊ฒ"๋ผ๋ ์๋ฏธ๋ก ์ฌ์ฉํฉ๋๋ค.
Netty์์๋ ChannelFuture๋ผ๋ ๋ณ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ฌ์ค์ JDK 8์ Future๋ฅผ ์ด์ฉํ ๊ฒ์ธ๋ฐ, ๊ธฐ๋ณธ์ ์ธ ์ธํฐํ์ด์ค ๊ตฌ์กฐ์์๋ ์์ ์ด ์๋ฃ๋์๋์ง๋ฅผ ์๋์ผ๋ก ํ์ธํด์ผํ๊ฑฐ๋, ์๋ฃ๋ ๋๊น์ง blocking ํด์ผํ๋ ๋งค์ปค๋์ฆ๋ง ์ ๊ณตํ๋ ๋ถํธํจ์ Netty์์๋ ์์ฒด์ ์ผ๋ก ChannelFuture ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ถ๋ถ๋ ์ฐจํ ํฌ์คํธ์์ ์์ธํ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก Events and handlers๋ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์ด์ผ๊ธฐ ํด์๋ Selector์ ์ด๋ฒคํธ์๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. ๋ฌผ๋ก ๊ฐ์ ์ด๋ฒคํธ๊ธด ํ์ง๋ง Netty ํ๋ ์์ํฌ ๋ด์์ ์์ฒด์ ์ผ๋ก ์ฌ์ฉํ ์ด๋ฒคํธ๋ฅผ ์ด์ผ๊ธฐํ๋ ๊ฒ์ผ๋ก ๊ฐ๋ น ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ฑ๊ณต/์คํจ, ํน์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ ์ฝ์ ํตํ ์์ฒญ ์ฑ๊ณต/์คํจ, ์๋ต ์ฑ๊ณต/์คํจ ๋ฑ ๋คํธ์ํฌ์์ ๋ฐ์ํ๋ ๋ค์ํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ด์ผ๊ธฐ ํฉ๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง Netty๋ก Non-blocking I/O์ ๋ํด ๊ฐ๋จํ ์ดํด๋ดค์ต๋๋ค. ์ต๊ทผ์ Netty๋ฅผ ๋ง์ง๊ฒ ๋๋ฉด์ Callback์ ์ํ์ ๊ฒช์ด์ผ ํ๋ ๊ณ ํต์ด ์ด๋ฃจ ๋งํ ์ ์์ง๋ง ๋ค์๊ธ ๋ ผ๋ธ๋กํน I/O์ c10k ์ด์๋ฅผ ๋ค๋ฃจ๋ฉด์ ์์๋ CS ์ง์์ ๋ ์ฌ๋ฆฌ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ๋ฏธ๋ฅผ ๋๋ผ๊ณ ์์ต๋๋ค.
๋ค์ ํฌ์คํธ์์๋ Netty์ ์ฃผ์ API๋ฅผ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.