week 1 leekyunghee - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

1์ฃผ์ฐจ

JAVA

* JVM, JDK, JRE๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
JVM์€ ๋ฌผ๋ฆฌ์ ์ธ ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์†Œํ”„ํŠธ์›จ์–ด๋กœ์„œ ํ•˜๋‚˜์˜ ๊ฐœ๋…์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "VIRTUAL"์„ ๋œปํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JVM์€ ๋…์ž์ ์œผ๋กœ ์ž‘๋™ํ•  
์ˆ˜์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ์ถ•์•ฝ๋œ ์ปดํ“จํ„ฐ์™€ ๊ฐ™์€ ์˜๋ฏธ์—์„œ "MACHINE"์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์กฐํ•ฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
JVM์€ JAVA ํ”„๋กœ๊ทธ๋žจ๊ณผ OS์˜ ์‚ฌ์ด์˜ ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ™œ์ด๋ฉฐ JAVA ํ”„๋กœ๊ทธ๋žจ์ด OS์— ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
Java Compiler๋ฅผ ํ†ตํ•ด Java Source File์„ ByteCode๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ JVM์— ๋„˜๊ฒจ์ฃผ๋ฉด JVM์€ OS๊ฐ€ ByteCode๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์„ ํ•ด์ค๋‹ˆ    
๋‹ค. 
  • ์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค Java ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ค‘ stack๊ณผ heap ์˜์—ญ์˜ ์ดˆ์ ์— ๋งž์ถ”์–ด์„œ ์„ค๋ช…ํ•œ๋‹ค.

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค. Serial GC old ์˜์—ญ์˜ GC๋Š” mark-sweep-compact์ด๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Old์˜์—ญ์— ์žˆ๋Š” ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฐ์ฒด๋“ค์„ ํ‘œ์‹œ(Mark) ํ•˜๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐ(Sweep)ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ค‘๊ฐ„์ค‘๊ฐ„ ๋นˆ ๊ณต๊ฐ„์ด ์ƒ๊ธฐ๊ณ  ์ด ๋ถ€๋ถ„์„ ์ œ๊ฑฐ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก ํž™์˜ ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ณต๊ฐ„์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.(Compact)

Parallel GC Parallel GC๋Š” Serial GC์™€ ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ™์Šต๋‹ˆ๋‹คํ•˜์ง€๋งŒ Serial GC๋Š” GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๋ฐ˜๋ฉด Parallel GC๋Š” GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Serial GC ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Parallel GC๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜๊ณ  ์ฝ”์–ด์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Permanent ์˜์—ญ ๋ณดํ†ต Class์˜ Meta ์ •๋ณด๋‚˜ Method์˜ Meta ์ •๋ณด, Static ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜ ์ •๋ณด๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ํ”ํžˆ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ ์˜์—ญ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜์—ญ์€ Java 8๋ถ€ํ„ฐ๋Š” Native ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ Metaspace์˜์—ญ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Prem ์˜์—ญ์— ์กด์žฌํ•˜๋˜ Static Object๋Š” Heap ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ์ ธ์„œ GC์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” Perm ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด OOM(Out Of MemoryError)์ด ๋ฐœ์ƒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์œผ๋กœ ์ด๋Ÿฌํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (Heap ์˜์—ญ์€ JVM์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ ์˜์—ญ์ด๋ฉฐ, Native ๋ฉ”๋ชจ๋ฆฌ๋Š” OS ๋ ˆ๋ฒจ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„)

SPRING

* ์Šคํ”„๋ง๋ถ€ํŠธ์™€ ์Šคํ”„๋ง์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค
* ์Šคํ”„๋ง์˜ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋น—๋Œ€์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค
* ์Šคํ”„๋ง์˜ ์„œ๋น„์Šค ์ถ”์ƒํ™”๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค

์•„ํ‚คํ…์ฒ˜

* ๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ์ ˆ์ฐจ์ง€ํ–ฅ์— ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค
* SOLID ์›์น™์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•˜์‹œ์˜ค
* ์บก์Šํ™”์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค