JAVA

ํ†ฐ์บฃ VS ๋„คํ‹ฐ (ํ†ฐ์บฃ ํŽธ)

YeopJu 2025. 2. 10. 20:05
๋ฐ˜์‘ํ˜•

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋Œ€์šฉ๋Ÿ‰์˜ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ ์„œ๋ฒ„์˜ 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๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•œ๋‹ค.

 

 

 

  1.  

 

 

์œ„ ๋™์ž‘ ๊ณผ์ •์—์„œ ๊ตต๊ฒŒ ํ‘œ์‹œํ•œ ๊ธ€์ด 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๊ฐ€ ์™œ ์ถ”๊ฐ€๋˜์–ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์— ๋Œ€ํ•ด ์˜๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ถœ์ฒ˜: https://mark-kim.blog/understanding-non-blocking-io-and-nio/

 

 

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
    - ์‚ฌ์šฉ์ž๊ฐ€ ํŽธ์˜์ƒ ๋งˆ์Œ๋Œ€๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์ธํ„ฐ์ด๋‹ค.
    - ํŠน๋ณ„ํžˆ ํŠน์ • ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋‹ค์Œ์— ๋˜๋Œ์•„๊ฐ€์•ผํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

 

์ถœ์ฒ˜: https://mark-kim.blog/understanding-non-blocking-io-and-nio/

 

 

 

 

 

 

์œ„์—์„œ ๋งํ•œ NIO Connecter๊ฐ€ ๋ฐ”๋กœ `ํ†ฐ์บฃ9 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Non-Blocking ๋ชจ๋ธ์„ ์ œ๊ณตํ•œ๋‹ค.` ๋ผ๋Š” ๋ง์„ ํ•˜๋Š” ์ด์œ ์ด๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ Non-Blocking์ด ์•„๋‹ˆ๋ฉฐ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ๋‹ค๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ๋™์ž‘๊ณผ์ •์„ ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

 

 

NIO ์ปค๋„ฅํ„ฐ์˜ ์ „์ฒด์ ์ธ ๋™์ž‘ ๊ณผ์ •

 

์ถœ์ฒ˜: https://mark-kim.blog/understanding-non-blocking-io-and-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์— ๋Œ€ํ•ด ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

๋ฐ˜์‘ํ˜•