JAVA 12

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

์ด์ „ ๊ธ€์—์„œ ํ†ฐ์บฃ ์ปค๋„ฅํ„ฐ์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ†ฐ์บฃ์˜ Non-Blocking ๋ชจ๋ธ์— ๋Œ€ํ•œ ์˜คํ•ด์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ Non-Blocking ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Netty๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ? ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „์— ๋จผ์ € ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ Non-Blocking ๋ฐฉ์‹์ด ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.    โ˜‘๏ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ Blocking vs Non-Blocking๊ณผ Network I/OOS ์ปค๋„๋‚ด ์†Œ์ผ“ ๋ฒ„ํผ๋กœ๋ถ€ํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์„ Network I/O๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋•Œ ์ปค๋„์— ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ ์ฝœ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€์ ์—์„œ Blocking๊ณผ Non-Blocking ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค.  ๐Ÿ’  Blocking Bloc..

JAVA 2025.02.17

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

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋Œ€์šฉ๋Ÿ‰์˜ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ ์„œ๋ฒ„์˜ CPU ์‚ฌ์šฉ๋ฅ ์ด ์ผ์ • ์ˆ˜์ค€์ด์ƒ์„ ๋„˜์ง€ ๋ชปํ•˜๊ณ  ์‘๋‹ต์ด ์ง€์—ฐ๋จ๊ณผ ๋™์‹œ์— Waiting ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋งค์šฐ ๋งŽ์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋Š” Spring MVC์™€ ํ†ฐ์บฃ์ด Blocking ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋˜ํ•œ ์ตœ๊ทผ MSA์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋˜ ์ค‘ Spring Cloud์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์ธ Tomcat์ด ์•„๋‹Œ  Netty๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด์— Non-Blocking ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” Netty ํ•™์Šต์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ๋А๊ผˆ๊ณ  ์ด์™€ ๋™์‹œ์— Tomcat์— ๋Œ€ํ•ด์„œ๋„ ์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ณ ์ž ํ–ˆ๋‹ค.   โ˜‘๏ธ ํ†ฐ์บฃ๋จผ์ € ํ†ฐ์บฃ์— ๋Œ€ํ•ด ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž. ํ†ฐ์บฃ์€ Spring์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋กœ..

JAVA 2025.02.10

[Java] JVM ๋™์‹œ์„ฑ ์ œ์–ด ์›๋ฆฌ (Implicit Lock)

์•ž์„  ๊ธ€์—์„œ ์ž๋ฐ” ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ์‹์ธ `synchronized`, `ReentrantLock`, `Semaphore`์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋‹ค. ์ด ์ค‘ `ReentrantLock`, `Semaphore` ์€ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณ ์ˆ˜์ค€ ๋ฝ (Explicit Lock)์ด๋ฉฐ OS ์ˆ˜์ค€์˜ ๋ชจ๋‹ˆํ„ฐ ๋ฝ๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž์ฒด์ ์ธ ๋Œ€๊ธฐ ํ์™€ ๋ฝ ํš๋“ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ž‘ํ•œ๋‹ค. ๋ฐ˜๋ฉด์— `synchronized` ๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์–ดํ•˜๋ฉฐ JVM์—์„œ ๊ด€๋ฆฌํ•˜๋Š” JVM ๋‚ด์žฅ ๋ฝ, ์ฆ‰ ์ €์ˆ˜์ค€ ๋ฝ (Implicit Lock) ์ด๋‹ค.`synchronized`๋Š” JVM ๋ชจ๋‹ˆํ„ฐ ๋ฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด `Biased Locking -> Lightweight Locking -> Heavyweight Locking`์„..

JAVA 2024.08.27

[Java] ์ž๋ฐ” ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ๋ฒ•

Virtual Thread์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋˜ ์ค‘, Pinned Issue๋กœ ์ธํ•ด ์Šคํ”„๋ง ๋ถ€ํŠธ ๋‚ด๋ถ€ ์ฝ”๋“œ์˜ `synchronized` ํ‚ค์›Œ๋“œ๋ฅผ `ReentrantLock`์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ž๋ฐ” ๋™์‹œ์„ฑ ์ œ์–ด ์ค‘ ๋น„๊ด€์ ๋ฝ์˜ ๋งค์ปค๋‹ˆ์ฆ˜์€ synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ์œ ์ผํ–ˆ๋‹ค. ์ด์— `ReentrantLock`๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ๋น„๊ด€์ ๋ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๊ณ  ๊ทธ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.  1๏ธโƒฃ SynchronizedSynchronized๋Š” ์ž๋ฐ”์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ๋ฒ•์œผ๋กœ ํŠน์ • Blcok ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. public class SynchronizedExample { private int a = 0; publ..

JAVA 2024.08.04

[Java] Virtual Thread ์ดํ•ดํ•˜๊ธฐ

๊ตฌ๋… ์ค‘์ธ ํ…Œํฌ ๋‰ด์Šค๋ ˆํ„ฐ์—์„œ ์ž๋ฐ”์˜ ์ตœ๊ทผ ์ด์Šˆ์ด๋ผ๋Š” ์ฃผ์ œ๋กœ ๋ฉ”์ผ์ด ์™”๋‹ค. ์ด๋Š” Virtual Thread์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด์— ์€ํƒ„ํ™˜์€ ์—†๋‹ค๊ณ  ํ•˜์ง€๋งŒ ํ•ด๋‹น ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์€ Java์˜ Default Thread ๋ชจ๋ธ๋กœ ์ ์šฉ๋  ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒํ•˜๋Š” ๊ธฐ๋Œ€๋ฅผ ๊ฐ€์ง€๊ณ  ์ด์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ดค๊ณ , ๊ทธ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ณ ์ž ํ•˜๊ณ ์žํ•œ๋‹ค.   .โ˜‘๏ธ ๊ธฐ์กด ์ž๋ฐ” ์Šค๋ ˆ๋“œ ๋ชจ๋ธ Virtual Thread๋Š” ์ž๋ฐ”์˜ ๋ณ‘ํ–‰์„ฑ ๋ชจ๋ธ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ Project Loom์˜ ์ผํ™˜์ด๋‹ค. ๊ธฐ์กด ์ž๋ฐ”์˜ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์€ JVM ๋‚ด์˜ ํ”Œ๋žซํผ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž๋ฐ” ๋„ค์ดํ‹ฐ๋ธŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด OS ์ปค๋„ ์Šค๋ ˆ๋“œ์™€ ์ผ๋Œ€์ผ ๋งคํ•‘๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ•ด๋‹น ๋ชจ๋ธ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐœ์„ ์ ์ด ์กด์žฌํ•œ๋‹ค. โ˜‘๏ธ ๊ธฐ์กด ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์˜ ๋ฌธ์ œ์ ๊ณผ Virt..

JAVA 2024.07.24

[Java] ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์ง๋ ฌํ™”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ž๋ฐ” ์ง๋ ฌํ™”์— ๋Œ€ํ•ด ์จ๋ณด๊ณ ์ž ํ•œ๋‹ค. ํ˜„๋Œ€ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  ๋‹ค์–‘ํ•œ ์ด์œ ๋“ค๋กœ ์ธํ•ด ์ž๋ฐ”์˜ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌธ ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋‹ค. ๊ทธ ๋Œ€์‹  JSON, XML. Avro์™€ ๊ฐ™์€ ์ง๋ ฌํ™” ํฌ๋งท์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธ€์„ ์“ธ๊นŒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ–ˆ์ง€๋งŒ ์ž๋ฐ”์˜ ๋งŽ์€ ํด๋ž˜์Šค๋“ค์ด ์ง๋ ฌํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ๋„ ํ•˜๊ณ , ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„œ ์ฝ์€ ๋‚ด์šฉ์„ ๊ธฐ์–ตํ•ด๋‘๊ธฐ ์œ„ํ•ด ๊ธ€์„ ์“ฐ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.  โ˜‘๏ธ ์ง๋ ฌํ™”์ง๋ ฌํ™”๋ž€ JVM์˜ ํž™ ๋˜๋Š” ์Šคํƒ ์˜์—ญ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ์ฒด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์˜ JVM์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์˜ JVM์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์—ญ์ง๋ ฌํ™”๋ฅผ ํ†ตํ•ด ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜์‹œ์ผœ ์‚ฌ์šฉํ•œ๋‹ค. ์ง๋ ฌํ™”๋Š” Serializabl..

JAVA 2024.07.16