week2_sangyun - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋™๊ธฐํ™”๋˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

์“ฐ๋ ˆ๋“œ?

  • ์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์ „์— ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž.
  • ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ(ํ”„๋กœ์„ธ์Šค)์˜ ์‹คํ–‰ ํ๋ฆ„ ์ •๋„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์—ฌ๋ž˜๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ heap ์˜์—ญ์„ ๊ณต์œ ํ•œ๋‹ค.
  • ์ž๋ฐ”์—์„œ ์Šคํƒ์˜์—ญ์€ ์“ฐ๋ ˆ๋“œ๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹น๋œ๋‹ค.

JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์˜ ์ฐจ์ด์ ์€?

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ฝ”๋“œ,ํž™,๋ฐ์ดํ„ฐ ์˜์—ญ์„ ๊ณต์œ ํ•œ
  • ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ ํž™, ๋ฉ”์†Œ๋“œ ์˜์—ญ, ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ํ’€์„ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.
  • ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ์€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” OS์˜ ์ œ์–ด์•„๋ž˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์–ดํ•˜์—ฌ ์‹คํ–‰
  • ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ JVM์ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›์•„ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

์“ฐ๋ ˆ๋“œ์—์„œ ์Šคํƒ์˜์—ญ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ์ด์œ ๋Š”?

  • ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์Šคํƒ์˜์—ญ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ „๋‹ฌ๋˜๋Š”์ธ์ž, ๋˜๋Œ์•„๊ฐˆ ์ฃผ์†Œ๊ฐ’ ๋ฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธํ•˜๋Š” ๋ณ€์ˆ˜๋“ฑ์„ ์ž„์‹œ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋…๋ฆฝ์ ์ด๋ผ๋Š” ๊ฒƒ์€ ๋…๋ฆฝ์ ์ธ ํ•จ์ˆ˜ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์Šค๋ ˆ๋“œ๋Š” ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ํ๋ฆ„์„ ๋ณด์žฅํ•˜๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•ด์„œ ์Šคํƒ์„ ๊ฐ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ํ• ๋‹นํ•˜๋Š”๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•?

  • Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ฐฉ๋ฒ•
  • Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•(๋‹ค์ค‘ ์ƒ์†๊ฐ€๋Šฅํ•ด์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ)

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™” ๊ธฐ๋ฒ•?

์•”์‹œ์  Lock

  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋ฉด์„œ ์‰ฌ์šด ๋ฐฉ๋ฒ•์œผ๋กœ Lock์„ ๊ฑธ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
  • Lock์„ ์ ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ
  • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋“œ๋งŒ ์ ‘๊ทผํ•˜๋ฏ€๋กœ ๋ณ‘๋ น์„ฑ์€ ๋งค์šฐ ๋‚ฎ์•„์ง„๋‹ค.

๋ช…์‹œ์  Lock

  • synchronized ํ‚ค์›Œ๋“œ ์—†์ด ์‚ฌ์šฉํ•˜๋Š” Lock
  • ์ง์ ‘์ ์œผ๋กœ Lock๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • lock()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น lock()๋ฉ”์„œ๋“œ ์‹œ์ž‘์ ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ
  • unlock()๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๊ฐ€ lockํš๋“ ๊ฐ€๋Šฅ

์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•œ ๊ฐ์ฒด ์‚ฌ์šฉ

  • Concurrent ํŒจํ‚ค์ง€
  • AtomicInteger์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋Š” i++์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ๋‹จ์ผ์—ฐ์‚ฐ์œผ๋กœ ๋งŒ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณต
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•˜๊ฒŒ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์–ด ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค.

๋ถˆ๋ณ€๊ฐ์ฒด

  • ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•
  • ์Šคํ”„๋ง ๊ฐ์ฒด์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ ๋งŒ๋“ค๋ฉด ๊ทธ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒํƒœ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ฐธ์กฐํ•ด๋„ ๋™์‹œ์„ฑ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž๋กœ ๋ชจ๋“  ์ƒํƒœ ๊ฐ‘์Šนใ„น ์ƒ์„ฑํ•  ๋•Œ ์„ธํŒ…ํ•˜๊ณ , ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.(setter๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋„๋ก final ์„ ์–ธ)

hashCode() ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”? hashcode()์™€ equls()๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๊ณ  ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€?

hashCode()?

  • ์ž๋ฐ”์˜ hashCode()๋Š” Object.hashCode()๋กœ ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š”๋‹ค.
  • int ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— 2^32 ๊นŒ์ง€ ์ž๋ฃŒ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์–ธ์ œ๋“  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด์‹œ์ฝ”๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ์œ„ํ•œ ์ •์ˆ˜๊ฐ’
  • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’๊ณผ ๋‹ค๋ฅด๋‹ค.

์™œ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š”๊ฐ€?

  • ํ•ด์‰ฌ๋งต, ํ•ด์‰ฌํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ธฐ์œ„ํ•ด์„œ hashCode()๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์—๋Š” key,value๋กœ ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์ด๋•Œ key๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค(๊ณ ์œ ํ•œ ์‹๋ณ„๋ฒˆํ˜ธ)

equals() vs hashCode()

  • equals() : ๋‘ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๊ฐ™์€์ง€ ํ™•์ธ
  • hashCode() : ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธ
  • ์ผ๋ฐ˜์ ์œผ๋กœ hash๊ฐ’ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€๋„ ํ™•์ธํ•ด์•ผํ•˜๊ณ  equals๋ฅผ ํ†ตํ•ด์„œ ๋‚ด์šฉ๋„ ๊ฐ™์€์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๊ฒฐ๋ก 

๊ฐ์ฒด A, ๊ฐ์ฒด B๊ฐ€ ๋งŒ์•ฝ ๊ฐ™์€ hashcode๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋•Œ, hash ์ž๋ฃŒ๊ตฌ์กฐ์— ์ €์žฅํ•˜๋Š”๊ฒฝ์šฐ ์–ด๋–ค์ผ์ด ๋ฐœ์ƒํ• ๊นŒ? ๋‘ ๊ฐ์ฒด๋Š” ์„œ๋กœ ๊ฐ™์€ hashcode๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ™์€ bucket์— ์ €์žฅ๋˜๊ณ  equals()๋ฅผ ํ†ตํ•ด์„œ ๋‘๊ฐœ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. hash์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๊ฐ๊ฐ์˜ ๋ฒ„ํ‚ท์€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋“ค์ด ๋งŽ์•„์ง€๊ฒŒ๋˜๋ฉด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด hash์ž๋ฃŒ๊ตฌ์กฐ์˜ ์žฅ์ ์ธ ๊ฒ€์ƒ‰์†๋„๊ฐ€ ๋–จ์–ด์ง€๊ธฐ๋•Œ๋ฌธ์— ์ถฉ๋Œ์„ ์ตœ์†Œํ™” ์‹œ์ผœ์•ผํ•œ๋‹ค.


ํŒจ๋Ÿฌ๋ŸดGC, G1GC์˜ ์ฐจ์ด์  ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

ํŒจ๋Ÿฌ๋Ÿด GC๋Š” old์˜์—ญ์—์„œ ์‚ด์•„ ๋‚จ์€ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  heap์˜ ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ํ™•์ธํ•˜์—ฌ ์‚ด์•„์žˆ๋Š” ๊ฒƒ๋งŒ ๋‚จ๊ธด๋‹ค(sweep) ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก ํž™์˜ ๊ฐ€์žฅ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค(compaction) Serial GC์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด์ง€๋งŒ GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์—ฌ์„œ ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ์ฝ”์–ด๊ฐ€ ๋งŽ์„๋•Œ ์œ ๋ฆฌํ•˜๋‹ค.

CMS GC๋Š” ๊ธฐ์กด GC๋ณด๋‹ค JVM์ด ๋ฉˆ์ถ”๋Š” ์‹œ๊ฐ„์„ ์ค„๊ธฐ์ด ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” compaction์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

G1GC๋Š” heap์˜์—ญ์„ 2048๊ฐœ region ์˜์—ญ์œผ๋กœ ์ชผ๊ฐœ๊ณ  Eden,Survivor, Old, Permanent, Humongous, Available/Unused ์ƒํƒœ๋กœ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๊ณ . ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์ฐฌ region์—์„œ GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


Spring์˜ AOP์˜ ํŠน์ง•๊ณผ ์–ด๋“œ๋ฐ”์ด์Šค ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ๋œ proxy ํŒจํ„ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

AOP๋Š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross Cutting Concern)์„ ํ•œ ๊ณณ์—์„œ ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

์ด๋•Œ, ํšก๋‹จ๊ดŒ์‹œ์‚ฌ๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์„ ์–ด๋“œ๋ฐ”์ด์Šค๋ผ๊ณ  ํ•œ๋‹ค.

์Šคํ”„๋ง AOP์—์„œ ์ œ๊ณต๋˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์˜ ์ข…๋ฅ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • Before
  • AfterReturning
  • AfterThrowing
  • After
  • Around

์ž๋ฐ”์—์„œ AOP๋Š” Dynamic Proxy ํ˜น์€ CGLIB๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒฝ์šฐ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. Dynamic Proxy๋Š” ์ž๋ฐ”์—์„œ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ™œ์šฉํ•œ Proxyํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋Ÿฐํƒ€์ž„์‹œ์— ๋™์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ํ•ด๋‹น ๋ฐฉ์‹์˜ ์ œ์•ฝ์‚ฌํ•ญ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ Proxy๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. CGLIB๋ฅผ ์ด์šฉํ•˜๋ฉด ํด๋ž˜์Šค์˜ ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด finalํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ๋Š” adviseํ•  ์ˆ˜ ์—†๋‹ค.

์Šคํ”„๋ง AOP๋Š” AspectJ ์Šคํƒ€์ผ๋กœ ์ œ๊ณตํ•œ๋‹ค. Pointcut์„ ํŒŒ์‹ฑํ•˜๊ณ  ๋งค์นญํ•ด์ฃผ๋Š” ์ œํ•œ์ ์ธ AOP๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


์Šคํ”„๋ง์—์„œ @Transactional์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ ์–ด๋–ค ์˜ต์…˜์ด ์žˆ๋Š”๊ฐ€?

์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜ ๋™์ž‘์›๋ฆฌ

@Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์€ Sprig AOP๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ํด๋ž˜์Šค,๋ฉ”์†Œ๋“œ์— @Transactional์ด ํƒœ๊น…๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์— ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” @Transactional์ด ํฌํ•จ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๊ฒฝ์šฐ, ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  commit or rollback์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. checkedException์ด๋‚˜ ์˜ˆ์™ธ๊ฐ€ ์—†์„ ๋•Œ๋Š” Commit UncheckedException์ด ๋ฐœ์ƒํ•˜๋ฉด RollBack

์˜ต์…˜

์ „ํŒŒ

ํŠธ๋žœ์žญ์…˜ ๋™์ž‘ ๋„์ค‘ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์„ ํ˜ธ์ถœํ•˜๋Š” ์ƒํ™ฉ์— ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜

Required

๋””ํดํŠธ ์†์„ฑ, ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰ํ•˜๋ฉฐ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์—†์„ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค.

Supports

์ด๋ฏธ ์‹œ์ž‘๋œ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ฐธ์—ฌํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

Requires_new

๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์„ ๋ฌด์‹œํ•˜๊ณ  ๋ฌด์กฐ๊ฑด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์ด ์ƒ์„ฑ

Mandatory

REQUIRED์™€ ๋น„์Šทํ•˜๊ฒŒ ์ด๋ฏธ ์‹œ์ž‘๋œ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ฐธ์—ฌํ•œ๋‹ค. ๋ฐ˜๋ฉด์— ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋œ ๊ฒƒ์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ํ˜ผ์ž์„œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

Not_supported

ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์ด๋ฏธ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ํŠธ๋žœ์žญ์…˜์„ ๋ณด๋ฅ˜์‹œํ‚จ๋‹ค.

Never

ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๊ฐ•์ œํ•œ๋‹ค. ์ด๋ฏธ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜๋„ ์กด์žฌํ•˜๋ฉด ์•ˆ๋œ๋‹ค ์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

Nested

์ด๋ฏธ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค. ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์— ๋‹ค์‹œ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“œ๋Š” REQUIRES_NEW์™€๋Š” ๋‹ค๋ฅด๋‹ค. REQUIRED์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ SAVEPOINT๋ฅผ ์ง€์ •ํ•œ ์‹œ์ ๊นŒ์ง€ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

readOnly

ํŠธ๋žœ์žญ์…˜์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๊ณ , ํŠน์ • ํŠธ๋žœ์žญ์…˜ ์ž‘์—… ์•ˆ์—์„œ ์“ฐ๊ธฐ ์ž‘์—…์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ์˜๋„์ ์œผ๋กœ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ผ๋ถ€ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €์˜ ๊ฒฝ์šฐ ์ฝ๊ธฐ์ „์šฉ ์†์„ฑ์„ ๋ฌด์‹œํ•˜๊ณ  ์“ฐ๊ธฐ ์ž‘์—…์„ ํ—ˆ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋œ ์ดํ›„ INSERT, UPDATE, DELETE ๊ฐ™์€ ์“ฐ๊ธฐ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์šฐ์„ ์ˆœ์œ„

@Transactional์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์— ์„ ์–ธ๋œ ํŠธ๋žœ์žญ์…˜์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ํŠธ๋žœ์žญ์…˜์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š” ํด๋ž˜์Šค์— ์ ์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ๊ณ ํ•œ๋‹ค.

ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ -> ํด๋ž˜์Šค -> ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ -> ์ธํ„ฐํŽ˜์ด์Šค

๋ชจ๋“œ

Proxy Mode(default)

๋ฐ˜๋“œ์‹œ public ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค. @Transactinal์ด ํƒœ๊น…๋˜์ง€ ์•Š์€ public method์—์„œ @Transactional์ด ํƒœ๊น…๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

AspectJ Mode

public๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ์—ฌ๋„ ๋œ๋‹ค.


์Šคํ”„๋ง์—์„œ ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

  • ์ธํ„ฐ์…‰ํ„ฐ, ํ•„ํ„ฐ ํ™œ์šฉ

SQL์˜ HINT๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

SQL์— ํฌํ•จ๋˜์„œ ์“ฐ์—ฌ์ง€๊ณ  Optimizer์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. Optimizer๋ผ๊ณ  ํ•ด์„œ ํ•ญ์ƒ ์ตœ์„ ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•  ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ ํ…Œ์ด๋ธ”์ด๋‚˜ ์ธ๋ฑ์Šค์˜ ์ž˜๋ชป๋œ ์‹คํ–‰ ๊ณ„ํš์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


memcached๋ณด๋‹ค redis์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์€?

Memcached๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๊ณ ์„ฑ๋Šฅ ๋ถ„์‚ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด ์บ์‹ฑ ์‹œ์Šคํ…œ์ด๋‹ค. ๋™์  ์›น์„œ๋น„์Šค์˜ DB ๋ถ€ํ•˜๋ฅผ ๊ฒฝ๊ฐ์‹œํ‚ค๊ธฐ ์œ„ํ•œ๊ฒƒ์ด ์ฃผ ๋ชฉ์ ์ด๋‹ค. ๋ฐ˜๋ฉด, Redis๋Š” key-value ๊ธฐ๋ฐ˜์˜ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— NoSQL ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Redis๋Š” CAP์ด๋ก ์—์„œ CA๋ฅผ ๋งŒ์กฑํ•œ๋‹ค( ๊ณ ๊ฐ€์šฉ์„ฑ,์ผ๊ด€์„ฑ)

Master-Slave, Clustering, Sentinel์„ ์ด์šฉํ•ด์„œ ๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ์ผ๊ด€์„ฑ ์„ ๋ณด์žฅํ•œ๋‹ค.

(CAP์ด๋ก  : ๋ถ„์‚ฐ ์ปดํ“จํŒ… ์‹œ์Šคํ…œ์—์„œ ์ผ๊ด€์„ฑ,๊ฐ€์šฉ์„ฑ,์ง€์†์„ฑ์ผ ๋™์‹œ์— ์ œ๊ณตํ•˜๋Š”๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๋‘๊ฐ€์ง€๋งŒ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋‹ค.)


ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ (Isolation Level) ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์„ธ์š”.

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ์„ฑ๊ณผ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ Trade Off์„ ๋‘๊ณ  4 level ๊ฒฉ๋ฆฌ์ˆ˜์ค€์ด ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

Read Uncommitted

  • ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ํ…Œ์ด๋ธ” ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • Dirty ready, Non-repeatable read, Phantom read ํ˜„์ƒ ๋ฐœ์ƒ

Read Committed

  • ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด commit์ด ์•ˆ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ undo ์˜์—ญ์— ์žˆ๋Š” ๊ธฐ์กด ๊ฐ’์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋ณด์—ฌ ์ฃผ๊ฒŒ ๋œ๋‹ค.
  • Non-Repeatable Read ๋ฌธ์ œ ๋ฐœ์ƒ

Repeatable Read

  • InnoDB Storage Enging์€ ํŠธ๋žœ์žญ์…˜์ด Rollback๋  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€๋น„ํ•ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „ ๋ ˆ์ฝ”๋“œ๋ฅผ Undo ๊ณต๊ฐ„์— ๋ฐฑ์—…ํ•ด ๋‘๊ณ  ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝ(MVCC - Multi Version Concurrency Control)
  • MVCC๋ฅผ ์œ„ํ•ด undo ์˜์—ญ์— ๋ฐฑ์—…๋œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋™์ผ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅ
  • ํŒฌํ…€๋ฆฌ๋“œ

Serializable

  • ์ฝ๊ธฐ ์ž‘์—…๋„ ๊ณต์œ  ์ž ๊ธˆ์„ ํš๋“ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋™์‹œ์„ฑ์ด ์ค‘์š”ํ•œ DB์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ x
  • Phantom Read๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, inno db ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ๋Š” repeatable read๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ ์ด๋ฏธ phantom read๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์„œ ๊ตณ์ด serializable ์‚ฌ์šฉํ•  ํ•„์š” ์—†๋‹ค.