์ ์ฒด ๊ธ (74) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [Java] ๋ฉํฐํ๋ ์ฑ ๊ธฐ๋ฐ์ ๋ค์ค ์ ์ ์๋ฒ๋ก ๊ฐ๊ธฐ๊น์ง ์์ผ์ ํตํ ๋คํธ์ํฌ I/O ์์ผ์ ๋คํธ์ํฌ์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ, ๋ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ํน์ ํฌํธ๋ฅผ ํตํด ์๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด ์ฃผ๋ ์ถ์ํ๋ ์ฅ์น์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ์ ๊ณต๊ฐ์ ์กด์ฌํ๋ ํ๋ก์ธ์ค(์๋ฒ, ํด๋ผ์ด์ธํธ)๋ ์ปค๋ ๊ณต๊ฐ์ ์์ฑ๋ ์์ผ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ ์ ์๋ค. ์์ผ์ ์ง์ญ(๋ก์ปฌ) IP ์ฃผ์์ ํฌํธ ๋ฒํธ, ์๋๋ฐฉ์ IP ์ฃผ์์ ํฌํธ๋ฒํธ, ๊ทธ๋ฆฌ๊ณ ์์ ๋ฒํผ์ ์ก์ ๋ฒํผ๊ฐ ์กด์ฌํ๋ค. ์๋ฒ์ ํด๋ผ์ด์ธํธ ์์ผ์ด ์๋ก ์ฐ๊ฒฐ๋ ํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ฉด ์์ ๋ฒํผ์ ์์ ๋ฐ์ดํฐ๊ฐ ์ฐ์ด๊ณ , ๋ฐ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ผ ๋๋ ์ก์ ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์ฐ์ธ๋ค. ๊ณ ์ฐฐ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์์ผ ์์ฑ๊ณผ ์ฐ๊ฒฐ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋ฒ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์์ฒญ๋ ์ผ์ข ์ ๋ฐ์ดํฐ ์ ์ก์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๊ฒฐ ์์ฒญ์ ๋ฐ์๋ค์ด๊ธฐ.. [Network] TCP/IP์ ์์ผํต์ Send/Recv ๋์ ์๋ฆฌ( + Blocking VS NonBlocking) ํ ์คํธ ์คํจ ํ์ ์๋ฒ(๊ณ ๊ฐ์ฌ ๊ฐ๋ฐ)์ ํด๋ผ์ด์ธํธ(ํ์๊ฐ ๊ฐ๋ฐ) ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ์๋ฒ๋ 150Hz๋ก ํด๋ผ์ด์ธํธ ์ธก์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ 1ํ ์ก์ ์์ฒญ ๋ฐ์ดํฐ๋ง ๋ณด๋ด๋ฉด, ์๋ฒ๋ ์คํธ๋ฆผ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์ก์ ํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ค๋จ ์์ฒญ์ ๋ณด๋ด๋ฉด ๊ทธ๋ ์ ์งํฉ๋๋ค. ์๋ฒ์์ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ sendํ์๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ์์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ์ผ์ ์๊ฐ ์ดํ( ๋ฐ์ ์์ ์ ๋ถํน์ ) ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์์ ํ์ง ๋ชปํจ. ์๋ฒ ์ ์ฅ์์ ๋ชจ๋ํฐ๋ง์ ํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ๊ฐ์ง ๋ชปํด์ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ๋ฐํ์ง. ์ด๋ด ๊ฒฝ์ฐ ๋ญ๊ฐ ๋ฌธ์ ์ด๊ณ ํด๋ผ์ด์ธํธ๋ ๋ฌด์์ ํด์ผํ ๊น? TCP/IP์ ์์ผํต์ Send/Recv.. [Java] ํฐ์ผ๊ณผ ๋คํฐ ์๋ฒ์ ์ฐจ์ด์ OverView ์ด์ ๊ธ์์ ์์ฒญ์ ๋ํ Asynchronousํ ์์ฒญ์ ๋ฐ๊ธฐ์ํ NIO ์ Tomcat์์์ ๋์์ ์์๋ณด์์ต๋๋ค. Tomcat์ New I/O Connector๋ฅผ ํตํด ์ฌ์ฉ์์ ์์ฒญ์๋ํด ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ ์ ์์์ต๋๋ค. ๊ทธ๋ผ ์ด๋ฒ์ Tomcat๊ณผ Netty ๋ ์๋ฒ๊ฐ์ ์ด๋ค์ฐจ์ด์ ์ด ์์๊น๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Tomcat & Netty ์ฐ๋ฆฌ๊ฐ Asynchronous/Non-Blocking ํ๋ฉด Netty์๋ฒ๋ฅผ ๋ ์ฌ๋ฆฌ๋๋ฐ๋ ์ด์ ๊ฐ ์์๊ฒ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ Spring์ WebFlux๋ Netty๋ฅผ ์ธ๊น๊ฐ ๊ถ๊ธํ์ต๋๋ค. WebFlux์ Tomcat์ ์ ์ฌ์ฉํ๋ฉด ๋๋๊ฑฐ ์๋๊น๋ ์๋ฌธ์ด ๋ค์์ต๋๋ค. ์ Reactive Programming์์ Tomcat์ ์ ์ด์ผ๊ธฐ ๋์ง ์์๊น์?.. [Java] Java NIO์ Tomcat์์์ ๋์ OverView ์ด์ ๊ธ์์ Tomcat์ Default๋ก NIO Connector๋ฅผ ์ ๊ณตํ๊ณ ์ด๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ Non-blockingํ๊ฒ ์ฒ๋ฆฌํ ์ ์์์ ์๋ฏธํฉ๋๋ค. Tomcat์ NIO Connector๋ ๋ด๋ถ์ ์ผ๋ก Java์ NIO๋ฅผ ์ฌ์ฉํ๊ธฐ์, ์ด๋ฒ์๊ฐ์ JAVA์ NIO์ ๋ํด ์์ธํ ์์๋ณด๊ณ Tomcat์ ์ด๋ป๊ฒ NIO๋ฅผ ํตํด ๋์ํ๋์ง ์์๋ณด๋ ค ํฉ๋๋ค. Java NIO java.nio์ ์ ์ ๋ช ์นญ์ New Input/Output ์ ์ฝ์๋ก ๊ธฐ์กด ํ์ค I/O๋ฅผ ๋ณด์ํ๊ธฐ ์ํด Java J2SE 1.4์ ํจ๊ป ๋๋น๋์์ผ๋ฉฐ, ์ดํ NIO2๊ฐ Java SE 7๊ณผ ํจ๊ป ์ถ์๋์์ต๋๋ค. ๋ง์ด๋ค BIO/NIO๋ฅผ Blocking IO / Non-blocking IO๋ก ์๊ฐํ๊ณ ์ฐ๊ณ ์์ง๋ง ์ค์ I/.. [Java] ๋๊ธฐ/๋น๋๊ธฐ & NonBlocking Blocking๊ณผ Spring์ ๊ด๊ณ ๋๊ธฐ์/๋น๋๊ธฐ์ & blocking/non-blocking ๋ ๊ทธ๋ฃน์ ์๋ก ๋ค๋ฅธ ๊ฐ๋ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ค ๊ทธ ๊ตฌ๋ถ์ ๋ช ํํ๊ฒ ์ดํดํ๊ธฐ๋ ์ฝ์ง ์์๊ณ ์น ํ๋ก์ ํธ์์ ๋ ๋์ฑ ํผ๋์ ์ผ๊ธฐํ๋ ๊ฒ ๊ฐ์ ์ ๋ฆฌ๊ฐ ํ์ํ์ต๋๋ค. ํํ reactive processing์์ ๋งํ๋ Asynchronouse non-blocing์ ๋ญ๊ฐ Asynchronouseํ๊ณ ๋ญ๊ฐ non-blocingํ๋ค๋ ๊ฑด์ง ๋ด๊ฐ ๊ฐ๋ฐํ๋ WebServer์์ ์ด๋ป๊ฒ ์ดํดํด์ผ ํ ์ง ์ดํด๊ฐ ๊ฐ์ง ์์ ์ ๋ฆฌํด๋ดค์ต๋๋ค. ์ฉ์ด ์ ๋ฆฌ Synchronouse & Asynchronouse ๋๊ธฐ์ ๋น๋๊ธฐ์ ๊ด๊ณ๋ฅผ ์ค๋ช ํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ์ฌ๋ก๋ ํน์ ์์ ์ด ์ํ์ค์ด๊ณ ์ข ๋ฃ๋์ง ์์ ์ํ์ฌ๋, ๋๊ธฐํ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์คํํ๋๋ ๋ชปํ๋๋์ ์ฐจ์ด๊ฐ ์์ต๋๋ค... [Java] Callable, Future ๋ฐ Executors, Executor, ExecutorService, ScheduledExecutorService์ ๋ํ ์ดํด ๋ฐ ์ฌ์ฉ๋ฒ ์ด๋ฒ์๋ ์๋ฐ5 ๋ถํฐ ๋ฉํฐ ์ฐ๋ ๋ ๊ธฐ๋ฐ์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ์ถ๊ฐ๋ Executor, ExecutorService, ScheduledExecutorService์ Callable, Future๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. 1. Callable๊ณผ Future ์ธํฐํ์ด์ค์ ๋ํ ์ดํด ๋ฐ ์ฌ์ฉ๋ฒ [ Thread์ Runnable์ ๋จ์ ๋ฐ ํ๊ณ ] Thread์ Runnable์ ์ง์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ ํ๊ณ์ ์ด ์์ต๋. ์ง๋์น๊ฒ ์ ์์ค์ API(์ฐ๋ ๋์ ์์ฑ)์ ์์กดํจ ๊ฐ์ ๋ฐํ์ด ๋ถ๊ฐ๋ฅ ๋งค๋ฒ ์ฐ๋ ๋ ์์ฑ๊ณผ ์ข ๋ฃํ๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ ์ฐ๋ ๋๋ค์ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ ๋จผ์ ์ฐ๋ ๋๋ฅผ ์ด๋ป๊ฒ ๋ง๋๋์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ๊ด์ฌ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ๋ฐ, Thread์ Runnable๋ฅผ ํตํ ์ฐ๋ ๋์ ์์ฑ๊ณผ ์คํ์ ๋๋ฌด.. [Java] Thread์ Runnable์ ๋ํ ์ดํด ๋ฐ ์ฌ์ฉ๋ฒ ์๋ฐ ์ด๊ธฐ๋ถํฐ ๋ฉํฐ ์ฐ๋ ๋ ๊ธฐ๋ฐ์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ๋ง๋ค์ด์ก๋ Thread์ Runnable๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. 1. Thread์ Runnable์ ๋ํ ์ดํด ๋ฐ ์ฌ์ฉ๋ฒ [ ์ฐ๋ ๋์ ์๋ฐ์ ๋ฉํฐ ์ฐ๋ ๋] ์ฐ๋ ๋๋ ํ๋ก๊ทธ๋จ ์คํ์ ๊ฐ์ฅ ์์ ๋จ์์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ์คํํ๋ฉด 1๊ฐ์ ๋ฉ์ธ(main) ์ฐ๋ ๋์ ์ํด ํ๋ก๊ทธ๋จ์ด ์คํ๋ฉ๋๋ค. ํ์ง๋ง 1๊ฐ์ ์ฐ๋ ๋ ๋ง์ผ๋ก๋ ๋์์ ์ฌ๋ฌ ์์ ์ ํ ์ ์์ต๋๋ค. ๋์์ ์ฌ๋ฌ ์์ ์ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด, ๋ณ๋์ ์ฐ๋ ๋๋ฅผ ๋ง๋ค์ด ์คํ์์ผ์ค์ผ ํ๋๋ฐ, ์๋ฐ๋ ๋ฉํฐ ์ฐ๋ ๋ ๊ธฐ๋ฐ์ผ๋ก ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ค์ ๊ณ์ํด์ ๋ฐ์ ์์ผ ์์ต๋๋ค. ๊ทธ ์ค์์ Thread์ Runnable์ ์๋ฐ ์ด๊ธฐ๋ถํฐ ๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ํด ์ ๊ณต๋์๋ .. [Java] CompletableFuture์ ๋ํ ์ดํด ๋ฐ ์ฌ์ฉ๋ฒ 1. CompletableFuture์ ๋ํ ์ดํด [ Future์ ๋จ์ ๋ฐ ํ๊ณ ] Java5์ Future๊ฐ ์ถ๊ฐ๋๋ฉด์ ๋น๋๊ธฐ ์์ ์ ๋ํ ๊ฒจ๋ก๊ฐ๊ฐ์ ๋ฐํ ๋ฐ์ ์ ์๊ฒ ๋์์ต๋๋ค. ํ์ง๋ง Future๋ ๋ค์๊ณผ ๊ฐ์ ํ๊ณ์ ์ด ์์ต๋๋ค. ์ธ๋ถ์์ ์๋ฃ์ํฌ ์ ์๊ณ , get์ ํ์์์ ์ค์ ์ผ๋ก๋ง ์๋ฃ ๊ฐ๋ฅ ๋ธ๋กํน ์ฝ๋(get)์ ํตํด์๋ง ์ดํ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ ์ฌ๋ฌ Future๋ฅผ ์กฐํฉํ ์ ์์ ex> ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์๋ฆผ์ ๋ฐ์กํ๋ ๋ฑ ์ฌ๋ฌ ์์ ์ ์กฐํฉํ๊ฑฐ๋ ใ ์ธ ์ฒ๋ฆฌํ ์ ์์ Future๋ ์ธ๋ถ์์ ์์ ์ ์๋ฃ์ํฌ ์ ์๊ณ , ์์ ์๋ฃ๋ ์ค์ง get ํธ์ถ ์์ ํ์์์์ผ๋ก๋ง ๊ฐ๋ฅํฉ๋๋ค. ๋ํ ๋น๋๊ธฐ ์์ ์ ์๋ต์ ์ถ๊ฐ ์์ ์ ํ๋ ค๋ฉด get์ ํธ์ถํด์ผ ํ๋๋ฐ, get์ ๋ธ๋กํน ํธ์ถ์ด๋ฏ๋ก.. ์ด์ 1 ยทยทยท 6 7 8 9 10 ๋ค์