๋ถํ ํ ์คํธ๋ฅผ ์งํํ๋ฉด์ ๋์ฉ๋์ ์์ฒญ์ด ๋ฐ์ํ ๋ ์๋ฒ์ CPU ์ฌ์ฉ๋ฅ ์ด ์ผ์ ์์ค์ด์์ ๋์ง ๋ชปํ๊ณ ์๋ต์ด ์ง์ฐ๋จ๊ณผ ๋์์ Waiting ์ํ์ ์ค๋ ๋๊ฐ ๋งค์ฐ ๋ง์ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ด๋ Spring MVC์ ํฐ์บฃ์ด Blocking ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค. ๋ํ ์ต๊ทผ MSA์ ๋ํด ๊ณต๋ถํ๋ ์ค Spring Cloud์์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ธ Tomcat์ด ์๋ Netty๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์ด์ Non-Blocking ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋กํ๋ Netty ํ์ต์ ๋ํ ํ์์ฑ์ ๋๊ผ๊ณ ์ด์ ๋์์ Tomcat์ ๋ํด์๋ ์กฐ๊ธ ๋ ์์ธํ๊ฒ ์์๋ณด๊ณ ์ ํ๋ค.
โ๏ธ ํฐ์บฃ
๋จผ์ ํฐ์บฃ์ ๋ํด ์์ธํ๊ฒ ์์๋ณด์. ํฐ์บฃ์ Spring์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ก, ์ผ๋ฐ์ ์ผ๋ก MVC์ ํจ๊ป Blocking I/O ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. ๊ทธ๋ฐ๋ฐ ํฐ์บฃ์ ๋ํด ๊ณต๋ถํ๋ ์ค, ๋ง์ ๋ธ๋ก๊ทธ์์ `ํฐ์บฃ 9 ๋ฒ์ ์ดํ๋ก๋ Non-Blocking ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์๋ค` ๋ผ๋ ๊ธ์ ๋ดค๊ณ , ์ด์ ๋ํด ์์ธํ๊ฒ ์์๋ณด๊ณ ์ ํ๋ค.
๋๋ต์ ์ธ ํฐ์บฃ์ ๋์ ๋ฐฉ์์ `ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํฐ์บฃ์ ์ค๋ ๋ ํ์์ ํ๋์ ์ค๋ ๋๋ฅผ ํ ๋นํ๋ค.` ๋ถํฐ ์์ํ ๊ฒ์ด๋ค. ํ์ง๋ง ์กฐ๊ธ ๋ ์์ธํ๊ฒ ์์๋ณด๋ฉด ์์ฒญ์ ์ค๋ ๋์ ํ ๋นํ๋ ๋จ๊ณ ์ด์ ์ ๊ณผ์ ์ ๋ํด ์ ์ ์๋ค. ์ด๋ฌํ ๊ณผ์ ์ฆ, ๋ฐ์ดํฐ ํจํท์ `HttpServletRequest` ๋ก ๋ณํํ์ฌ ์๋ธ๋ฆฟ ๊ฐ์ฒด์ ์ ๋ฌํ๋ ๊ณผ์ ์ ๋ด๋นํ๋ ๊ฒ์ด Connecter์ด๋ฉฐ, ์ด๋ ์ธ๊ฐ์ง ๋ฒ์ ์ผ๋ก ๋๋๋ฉฐ ๊ฐ ๋ฒ์ ๋ณ๋ก 4๊ฐ์ง(BIO, NIO, NIO2, APR)์ ๋์ ๋ฐฉ์์ ์ค์ ํ ์ ์๋ค.
Tomcat Connector
1. HTTP/1.1 Connector
2. HTTP/2 Connector
3. AJP Connector (with Apache HTTP web server) : ํน์ Protocol์ฒ๋ฆฌ
๊ทธ ์ค ๋ํ์ ์ธ ๋์ ๋ฐฉ์์ธ BIO(Blocking I/O)์ NIO(Non-Blocking I/O)์ ๋ํด ์์๋ณด์. ์ฐธ๊ณ ๋ก NIO๋ New I/O์ ์ค์๋ง์ด๋ค. NIO API ์ค File API์ ๊ฐ์ ์ผ๋ถ API๋ Blocking ๋ฐฉ์์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ NIO๋ฅผ Non-Blocking I/O๋ผ๊ณ ํด์ํ๋ค๋ฉด ์คํด์ ์์ง๊ฐ ์๊ธธ ์ ์๋ค.
โ BIO Connecter
BIO Connecter๋ ์๋์ ๊ฐ์ด ๋์ํ๋ฉฐ ์ด๋ ์ปค๋ฅ์ ์ด ์๋ฆฝ๋๋ ์๊ฐ๋ถํฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ ์๊ฐ๊น์ง ๋ชจ๋ ๊ณผ์ ์ Blocking์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
๋์ ๊ณผ์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ์ ์์ฒญํ๋ฉด, Tomcat์ Acceptor Thread๊ฐ ์๋ฒ์์ผ์ ํตํด ์ฐ๊ฒฐ์ ์๋ฝํ๊ณ ์ Socket์ ์์ฑํ๋ค.
- ์ฐ๊ฒฐ๋ Socket์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๋ ๋ ํ์์ ์ค๋ ๋ ํ๋๋ฅผ ํ ๋นํ๊ฑฐ๋ ์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ค.
- ์ค๋ ๋๋ ์์ผ์ InputStream์ ํตํด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ก ์ ๋ฌํ๋ค.
- OS๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ DMA๋ฅผ ์ด์ฉํ์ฌ ์ปค๋ ๋ฒํผ์ ๋ณต์ฌํ๋ค.
- ์ดํ์ JVM ๋ด๋ถ ๋ฒํผ๋ก ์ปค๋ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ณ ์ด๋ฅผ ํ์ฑํ์ฌ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ก ์ ๋ฌํ๋ค.
- ์๋ธ๋ฆฟ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด, ์ค๋ ๋๋ ์๋ต ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๋ค.
- ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด, ์ค๋ ๋๋ ์ค๋ ๋ ํ๋ก ๋ฐํ๋๋ค.
โ NIO Connecter
๋์ ๊ณผ์
1. ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ์์ฒญํ๋ฉด, Tomcat์ Acceptor Thread๊ฐ ServerSocketChannel์ ํตํด ์ฐ๊ฒฐ์ ์๋ฝํ๊ณ SocketChannel์ ์์ฑํ๋ค.
2. ์์ฑ๋ SocketChannel์ Poller Thread์ ๋ฑ๋ก๋๋ค.
3. Poller Thread๋ ์์ฑ๋ SocketChannel์ Selector์ ๋ฑ๋กํ๋ค.
4. SocketChannel์ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ ์ด ์ค๋น๋ ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค.
5. ์ด๋ฒคํธ ๋ฆฌ์ค๋์ธ Selector๋ ๊ฐ์ง๋ I/O ์ด๋ฒคํธ(๋ฐ์ดํฐ ์ฝ๊ธฐ ์ค๋น ์๋ฃ)๋ฅผ Poller Thread์ ์ ๋ฌํ๋ค.
6. Poller Thread๋ ํด๋น ์์ ์ Worker Thread์ ์์ ์ ์์ํ๋ค.
7. Worker Thread๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ก ์ ๋ฌํ๋ค.
- ์ด ๊ณผ์ ์์ Worker Thread๋ ByteBuffer๋ฅผ ์ฌ์ฉํ๋ค.
- ByteBuffer๋ ์ปค๋ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ด ์๋๋ผ ์ง์ ์ฐธ์กฐํ๋ฉฐ, ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์ฑํ์ฌ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋กค ์ ๋ฌํ๋ค.
8. ์๋ธ๋ฆฟ์ด ์๋ต ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด Poller Thread๊ฐ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๋ค.
์ ๋์ ๊ณผ์ ์์ ๊ตต๊ฒ ํ์ํ ๊ธ์ด BIO์ NIO์ ์ฐจ์ด์ ์ด๋ค. ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด BIO์ Acceptor์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Poller, Selector๊ฐ ์ถ๊ฐ๋๊ณ ๊ธฐ์กด ๋จ๋ฐฉํฅ ์ ์ถ๋ ฅ์ ์ง์ํ๋ Stream์ด ์๋ฐฉํฅ ์ ์ถ๋ ฅ Channel๋ก ๋ณ๊ฒฝ๋์์ผ๋ฉฐ Buffer๊ฐ ์ถ๊ฐ๋ ํํ๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํผ๋๋ ์ ์๋ ๋ถ๋ถ์ ์ง์ด๋ณด์๋ฉด Acceptor Thread์ Poller Thread๋ ๋ณ๊ฐ์ ์ ์ฉ ์ค๋ ๋์ด๋ฉฐ Worker Thread๋ ์ค๋ ๋ ํ์์ ๊ด๋ฆฌ๋๋ ์ค๋ ๋๋ฅผ ์๋ฏธํ๋ค.
์ด๋ ๊ฒ๋ง ๋ค์ผ๋ฉด ์ด๊ฒ ์ Non-Blocking ๋ชจ๋ธ์ธ์ง ์๋ฌธ์ด ์๊ธธ ์ ์๋ค.
๊ทธ๋ฆผ์๋ ๋์ ์์ง ์์ Selector๊ฐ ์ฌ๋ฌ Channel์ ๋ณ๋ ฌ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ฌ๋ฌ Channel ์ค ์ฝ๊ธฐ ์ค๋น๊ฐ ์๋ฃ๋ Channel์ Poller Thread์ ์ ๋ฌ(4, 5 ๋ฒ ๊ณผ์ )ํ๋ค. ์ด๋ฅผ BIO์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ ์ค๋น์ ๊ฐ์ ๊ธฐ์กด ๋ชจ๋ ๊ณผ์ ์ Blocking ํ๊ฒ ๋๊ธฐ์ ์ผ๋ก ์คํํด์ผ๋๋ ๊ฒ๊ณผ ๋น๊ตํด๋ณด๋ฉด ๋น๋๊ธฐ Non-Blocking์ผ๋ก ์๋ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ฆ, Selector๊ฐ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ด์ ๋ฉํฐํ๋ ์ ์ญํ ์ ํ๋ ๊ฒ์ด๋ค.
๋ํ ByteBuffer๊ฐ ์ ์ถ๊ฐ๋์ด ์ป์ ์ ์๋ ์ด์ ์ ๋ํด ์๋ฌธ์ด ์๊ธธ ์ ์๋ค.
Bio ์ปค๋ฅํฐ์์๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์ ํ ๋ฐ์ดํฐ๋ฅผ ์ปค๋ ๋ฒํผ์ ์ ์ฅํ ํ, ํด๋น ๋ฐ์ดํฐ๋ฅผ JVM ๋ด๋ถ ๋ฒํผ์ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋ด๋ถ ๋ฒํผ๋ก ๋ณต์ฌํ ๋ CPU๊ฐ ์ฌ์ฉ๋๊ณ , ์ดํ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด CG๋ฅผ ์งํํ ๋๋ CPU๊ฐ ์ฌ์ฉ๋ ๋ฟ๋๋ฌ, ๋ณต์ฌ๊ฐ ์งํ๋๋ ๋์ I/O๋ฅผ ์์ฒญํ Thread๋ Blocking ์ํ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์์ ๊ฐ์ ์ธ๊ฐ์ง ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์ ์ถ๊ฐ๋ ๊ฒ์ด ByteBuffer์ด๋ค. ByteBuffer๋ ์ปค๋ ๋ฒํผ๋ฅผ ์ง์ ์ฐธ์กฐํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ถํ CG๋ฅผ ํ ํ์๊ฐ ์์ด์ง๋ฉฐ, ๋์คํฌ ํน์ ์์ผ์์ ์ปค๋ ๋ฒํผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ์ DMA๊ฐ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ CPU๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉ๋ ํ์๋ ์์ด์ง๋ค. ๋ํ ๋ณต์ฌ๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ Thread๊ฐ Blocking ์ํ์ ๋ค์ด๊ฐ ์ผ๋ ์์ด์ง๊ฒ ๋๋ค.
ByteBuffer์ ๊ตฌ์กฐ
ByteBuffer๋ ๋ด๋ถ์ byte ๋ฐฐ์ด๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๋ฒํผํํ์ ๋ค ๊ฐ์ง ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํด๋์ค์ด๋ค.
โ position
- ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ๊ฐ ์์
์ค์ธ ์์น๋ฅผ ๋ํ๋ธ๋ค.
- ๋ฒํผ ์์ฑ์ 0์ผ๋ก ์ด๊ธฐํ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๊ฑฐ๋ ์ฝ์ผ๋ฉด ์๋์ผ๋ก ์ฆ๊ฐํ๋ค.
- limit์ capacity๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
โ limit
- ์ฝ๊ณ ์ธ ์ ์๋ ๋ฒํผ ๊ณต๊ฐ์ ์ต๋์น๋ฅผ ๋ํ๋ธ๋ค.
- ์ด ๊ฐ์ capacity๋ณด๋ค ํฌ๊ฒ ์ค์ ํ ์ ์๋ค.
โ capacity
- ๋ฒํผ์ ์ ์ฅํ ์ ์๋ ๋ฐ์ดํฐ์ ์ต๋ ํฌ๊ธฐ๋ก ํ ๋ฒ ์ ํ๋ฉด ๋ณ๊ฒฝ์ด ๋ถ๊ฐํ๋ค.
โ mark
- ์ฌ์ฉ์๊ฐ ํธ์์ ๋ง์๋๋ก ์ง์ ํ ์ ์๋ ํฌ์ธํฐ์ด๋ค.
- ํน๋ณํ ํน์ ์์น๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ ๋ค์์ ๋๋์๊ฐ์ผํ ๋ ์ฌ์ฉ๋๋ค.
์์์ ๋งํ NIO Connecter๊ฐ ๋ฐ๋ก `ํฐ์บฃ9 ๋ฒ์ ๋ถํฐ๋ Non-Blocking ๋ชจ๋ธ์ ์ ๊ณตํ๋ค.` ๋ผ๋ ๋ง์ ํ๋ ์ด์ ์ด๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์์ Non-Blocking์ด ์๋๋ฉฐ ์คํด์ ์์ง๊ฐ ๋ค๋ถํ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋์๊ณผ์ ์ ์์๋ ํ์๊ฐ ์๋ค.
NIO ์ปค๋ฅํฐ์ ์ ์ฒด์ ์ธ ๋์ ๊ณผ์
โ ํฐ์บฃ์ด ์์ ํ Non-Blocking์ด ๋ถ๊ฐ๋ฅํ ์ด์
์ด๋ ๋ฏ ์ปค๋ฅํฐ์์ Non-Blocking ๋ชจ๋ธ์ ์ฌ์ฉํจ์๋ ๋ถ๊ตฌํ๊ณ ํฐ์บฃ์ ์ ์ฒด์ ์ผ๋ก Blocking ๋ชจ๋ธ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์์ ํ Non-Blocking์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ Thread Per Request์ ํํ์ ๋๋ค. ๋ํ ๊ทธ ์ด์ ๋ฅผ ์กฐ๊ธ ๋ ์์ธํ๊ฒ ๋งํ์๋ฉด ์๋์ ๊ฐ๋ค.
1. ํฐ์บฃ์ ์๋ธ๋ฆฟ API๋ฅผ ์ฌ์ฉํ๊ณ , ํด๋น API(`HttpServletRequest`, `HttpServletResponse`)๊ฐ Blocking ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ด๋ค. ์คํ๋ง์์ ์ฌ์ฉํ๋ ๋์คํ์ฒ ์๋ธ๋ฆฟ ๋ํ ํด๋น API์ ์์กดํ๋ค.
2. ํฐ์บฃ์์๋ ์์ฒญ์ด ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌ๋๊ธฐ ์ ์ ๋๊ธฐ์ ์ผ๋ก ์๋ํ๋ ํํฐ์ ์ธํฐ์ ํฐ ์กด์ฌํ๋ค.
Thread Per Request๋ ๋์ฉ๋์ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ ํ๋ฒ์ Thread์ ์๋งํผ์ ์์ฒญ๋ง ๋ฐ์๋ค์ด๋ฉฐ I/O ์์ ์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ ํด๋น Thread๊ฐ Waiting ์ํ๋ก ๋๊ธฐํ๊ฒ ๋๋ค๋ ํ๊ณ๊ฐ ์๋ค. ์ด๋ก ์ธํด CPU์ ์ฑ๋ฅ์ ์จ์ ํ๊ฒ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋๋ค.
์ด๋ฌํ ๋ณ๋ชฉ์ ์ํํ๊ธฐ ์ํด Thread ์๋ฅผ ๋๋ฆด ์๋ ์์ง๋ง Context Switching ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํจ๋ค.
โ๏ธ ๊ฒฐ๋ก
ํฐ์บฃ๊ณผ ๋คํฐ์ ๋ํ ๋ด์ฉ์ ํ๋์ ๊ธ์ ๋ชจ๋ ๋ด์๋ด๋ ค๊ณ ํ์ง๋ง ์๊ฐ๋ณด๋ค ๋ด์ฉ์ด ๊ธธ์ด์ก๋ค. ์ฌ์ค ์ฌ๊ธฐ๊น์ง์ ๊ธ์ ๊ฒฐ๊ตญ ํฐ์บฃ์ Blockingํ๊ฒ ๋์ํ๋ค๋ ๊ฒ์ ๋งํ๊ณ ์ ํจ์ด์๋ค. ๋ค์ ๊ธ์์ Netty์ ๋ํด ์์ธํ๊ฒ ์์๋ณด์.