week 2 duyongseon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

JAVA

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

Thread๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์Šต๋‹ˆ๋‹ค

  • Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์„ ์‹œ์—๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2. Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” Runnable ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • Thread ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, Thread์˜ ์ƒ์„ฑ์ž์— Runnable ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋„˜๊น๋‹ˆ๋‹ค. ์ด Thread ๊ฐ์ฒด๋Š” ์ด์ œ run() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Runnable ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ Thread๊ฐ์ฒด์˜ start() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

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

  • equals()๋Š” ๋‘ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๊ฐ™์€์ง€, ๋™๋“ฑ์„ฑ(equality)๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.
  • hashCode()๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€, ๋™์ผ์„ฑ(identity)๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.
  • equals()๋กœ ๋น„๊ต ์‹œ ๋‘๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ™๋‹ค๋ฉด, hashCode() ๊ฐ’๋„ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • equals()๋กœ ๋น„๊ต ์‹œ false ๋ผ๋ฉด, hashCode()๊ฐ’์€ ๋‹ค๋ฅผ์ˆ˜๋„, ๊ฐ™์„์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” hashCode() ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒƒ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ Set ์— ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • hashCode() ๊ฐ’์ด ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ, equals()๊ฐ€ true๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด์˜ ๋ฌธ์ œ๋กœ, ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • Parallel GC(-XX:+UseParallelGC)

Parallel GC๋Š” ๊ฐ์ฒด๊ฐ€ ์ œ์ผ ๋จผ์ € ์ƒ์„ฑ๋˜๋Š” Young ์˜์—ญ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“์ฐจ๋ฉด ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ธ Old ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Young ์˜์—ญ์—์„œ๋Š” Eden ์˜์—ญ๊ณผ Survivor ์˜์—ญ(2๊ฐœ)์ธ ์ด 3๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๊ณ , ๊ฐ ์˜์—ญ์˜ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋ฅผ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ธฐ์ˆ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” Eden ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.
  2. Eden ์˜์—ญ์—์„œ GC๊ฐ€ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•œ ํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Survivor ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™๋œ๋‹ค.
  3. Eden ์˜์—ญ์—์„œ GC๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฏธ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” Survivor ์˜์—ญ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์Œ“์ธ๋‹ค.
  4. ํ•˜๋‚˜์˜ Survivor ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด ๊ทธ ์ค‘์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋“ ์ฐฌ Survivor ์˜์—ญ์€ ์•„๋ฌด ๋ฐ์ดํ„ฐ๋„ ์—†๋Š” ์ƒํƒœ๋กœ ๋œ๋‹ค.
  5. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๊ณ„์†ํ•ด์„œ ์‚ด์•„๋‚จ์•„ ์žˆ๋Š” ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

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

  • G1 GC

G1 GC๋Š” Young ์˜์—ญ๊ณผ Old ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŠน์ดํ•œ ์ปฌ๋ ‰ํ„ฐ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ฐ”๋‘‘ํŒ ๋ชจ์–‘์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ์•ฝ 2000๊ฐœ์˜ ๊ตฌ์—ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ”๋‘‘ํŒ ๋ชจ์–‘์˜ ๊ตฌ์—ญ์—์„œ ์ผ๋ถ€๋ฅผ ์„ ์ •ํ•˜์—ฌ Young ์˜์—ญ์œผ๋กœ ์ง€์ •ํ•œ ํ›„ ํ•ด๋‹น ๊ตฌ์—ญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฝ‰ ์ฐจ๋ฉด GC๋ฅผ ์ง„ํ–‰ ํ•ฉ๋‹ˆ๋‹ค. GC ํ›„ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋งŒ Servivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

SPRING

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

์Šคํ”„๋ง AOP ํŠน์ง•

  • ํ”„๋ก์‹œ ํŒจํ„ด ๊ธฐ๋ฐ˜์˜ AOP ๊ตฌํ˜„์ฒด, ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” ์ ‘๊ทผ ์ œ์–ด ๋ฐ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง ๋นˆ์—๋งŒ AOP๋ฅผ ์ ์šฉ ๊ฐ€๋Šฅ
  • ๋ชจ๋“  AOP ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์Šคํ”„๋ง IoC์™€ ์—ฐ๋™ํ•˜์—ฌ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€์žฅ ํ”ํ•œ ๋ฌธ์ œ(์ค‘๋ณต์ฝ”๋“œ, ํ”„๋ก์‹œ ํด๋ž˜์Šค ์ž‘์„ฑ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€, ๊ฐ์ฒด๋“ค ๊ฐ„ ๊ด€๊ณ„ ๋ณต์žก๋„ ์ฆ๊ฐ€ ...)์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ 

Advice ์ข…๋ฅ˜

  • @Before : ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ.

  • @AfterReturning : ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ต์…‰์…˜ ์—†์ด ์‹คํ–‰๋œ ์ดํ›„์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ.

  • @AfterThrowing : ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘ ์ต์…‰์…˜์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ.

  • @After : ์ข…๋ฃŒ ํ›„์— ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋จ. ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘์— ์ต์…‰์…˜์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€์˜ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ๋ฉ”์„œ๋“œ ์‹คํ–‰ ํ›„ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•จ. ( try-catch-finally์˜ finally๋ธ”๋ก๊ณผ ๋น„์Šท )

  • @Around : ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „, ํ›„ ๋˜๋Š” ์ต์…‰์…˜ ๋ฐœ์ƒ ์‹œ์ ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ. ์บ์‹œ ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ Aspect๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ๋กœ ์ด์šฉ

JDK Dynamic Proxy

JDK Dynamic Proxy๋Š” JDK 1.3+ ๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋Š” Proxy Factory์— ์˜ํ•ด ๋Ÿฐํƒ€์ž„ ์‹œ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค. JDK Dynamic Proxy๋Š” ๋ฐ˜๋“œ์‹œ Interface๊ฐ€ ์ •์˜ ๋˜์–ด์žˆ๊ณ , Interface์— ๋Œ€ํ•œ ๋ช…์„ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ Proxy๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Interface ์„ ์–ธ์— ๋Œ€ํ•œ ๊ฐ•์ œ์„ฑ์ด ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ Dynamic Proxy์—์„œ๋Š” InvocationHandler๋ผ๋Š” Interface๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ InvocationHandler์˜ invoke๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ Overrideํ•˜์—ฌ Proxy์˜ ์œ„์ž„ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Object์— ๋Œ€ํ•ด Reflection๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํผํฌ๋จผ์Šค์˜ ํ•˜๋ฝ์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

CGLIB Proxy

CGLIB Proxy๋Š” ์ˆœ์ˆ˜ Java JDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ CGLIB๋ผ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ CGLIB์˜ Enhancer๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Proxy๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, JDK Dynamic Proxy์˜ ๋‹จ์ ์ธ Interface๊ฐ€ ์—†์–ด๋„ Proxy๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CGLIB Proxy๋Š” Target Class๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” Proxy๋ฅผ ์ƒ์„ฑ ํ•˜๊ธฐ ์œ„ํ•ด ๊ตณ์ด Interface๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ƒ์†์„ ์ด์šฉํ•˜๋Š” ๋งŒํผ final์ด๋‚˜ private๊ณผ ๊ฐ™์ด ์ƒ์†์— ๋Œ€ํ•ด Override๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Proxy์—์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ Aspect๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

CGLIB Proxy์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ JDK Dynamic Proxy๋ณด๋‹ค๋Š” ํผํฌ๋จผ์Šค๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฅธ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์Šคํ”„๋ง์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š”๋ฐ ๊ทธ ์ค‘ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹์œผ๋กœ @Transactional์„ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ผ๋ฐ˜์ ์ด๋ฉฐ, ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ ์œ„์— @Transactional์ด ์ถ”๊ฐ€๋˜๋ฉด, ์ด ํด๋ž˜์Šค์— ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ์ด ์ ์šฉ๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” @Transactional์ด ํฌํ•จ๋œ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋  ๊ฒฝ์šฐ, PlatformTransactionManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ์ •์ƒ ์—ฌ๋ถ€์— ๋”ฐ๋ผ Commit ๋˜๋Š” Rollback ํ•ฉ๋‹ˆ๋‹ค.

@Transactional์˜ Propagation ์†์„ฑ

โ–ถ REQUIRED

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

โ–ถ SUPPORTS

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

โ–ถ REQUIRES_NEW

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

โ–ถ MANDATORY

  • REQUIRED์™€ ๋น„์Šทํ•˜๊ฒŒ ์ด๋ฏธ ์‹œ์ž‘๋œ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ฐธ์—ฌํ•œ๋‹ค.

  • ๋ฐ˜๋ฉด์— ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋œ ๊ฒƒ์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

  • ํ˜ผ์ž์„œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

โ–ถ REQUIRES_NEW

  • ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค.

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

โ–ถ NOT_SUPPORTED

  • ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.

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

โ–ถ NEVER

  • ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๊ฐ•์ œํ•œ๋‹ค.

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

โ–ถ NESTED

  • ์ด๋ฏธ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค.

  • ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์— ๋‹ค์‹œ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

  • ํ•˜์ง€๋งŒ ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“œ๋Š” REQUIRES_NEW์™€๋Š” ๋‹ค๋ฅด๋‹ค.

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

์ธ์ฆ : ์‚ฌ์šฉ์ž์˜ ์ •๋‹น์„ฑ ํ™•์ธ ์ธ๊ฐ€ : ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์— ๋Œ€ํ•œ ์ œ์–ด

์ธ์ฆ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

Spring Security๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธ์ฆ ๋ฉ”์นด๋‹ˆ์ฆ˜

1. AuthenticationFilter

  • ์ธ์ฆ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ์ธ์ฆ์ •๋ณด(๊ณ„์ •, ํŒจ์Šค์›Œ๋“œ)๋ฅผ ๋ฐ›๊ณ  Authentication Manager์˜ method ํ˜ธ์ถœ

2. AuthenticationManager(implementation : ProviderManager)

  • ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
  • ๊ธฐ๋ณธ ๊ตฌํ˜„ : AuthenticationProvider์—๊ฒŒ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๊ณ  ์ธ์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š” ๊ตฌ์กฐ

3. AuthenticationProvider(implementation : DaoAuthenticationProvider)

  • ์ธ์ฆ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

์ธ๊ฐ€ ์ฒ˜๋ฆฌ

์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” resource ์ œ์–ด resource์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ •์ฑ… ์ •์˜, resource ์ ‘๊ทผ ์‹œ ์ ‘๊ทผ ์ •์ฑ… ํ™•์ธ ํ›„ ํ—ˆ์šฉ ์—ฌ๋ถ€ ๊ฒฐ์ •

  1. ExceptionTranslationFilter
  • ์ธ๊ฐ€ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
  • ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ํ•˜๊ธฐ ์œ„ํ•œ servlet filter
  • ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ์ ‘๊ทผ ์‹œ, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  1. FilterSecurityInterceptor
  • HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ servlet filter
  • AccessDecisionManager์˜ method๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ
  1. AccessDecisionManager(implementation : AffirmativeBased)
  • AccessDecisionVoter์˜ method๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ ‘๊ทผ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํˆฌํ‘œ
  • ํ•˜๋‚˜์˜ AccessDecisionVoter๊ฐ€ ๋ถ€์—ฌ๋กœ ํˆฌํ‘œํ•˜๋ฉด ์ ‘๊ทผ ๊ถŒํ•œ ๋ถ€์—ฌ
  1. AccessDecisionVoter(implementation : WebExpressionVoter)
  • ์ ‘๊ทผํ•˜๋ ค๋Š” resource์— ์ ‘๊ทผ ์ •์ฑ…์„ ์ฐธ์กฐํ•˜์—ฌ ์ ‘๊ทผ ๊ถŒํ•œ ๋ถ€์—ฌ ์—ฌ๋ถ€ ํˆฌํ‘œ

DATABASE/SQL

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

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

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

๊ณตํ†ต์ 

1. 1ms ์ดํ•˜์˜ ์‘๋‹ต๋Œ€๊ธฐ์‹œ๊ฐ„

๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋””์Šคํฌ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๊ฐœ๋ฐœ์˜ ์šฉ์ด์„ฑ

๋ฌธ๋ฒ•์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐœ๋ฐœ์ฝ”๋“œ ์–‘ ๋˜ํ•œ ์ ์Šต๋‹ˆ๋‹ค.

1. ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…”๋‹

๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜์š”๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์Šค์ผ€์ผ ์•„์›ƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

1. ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ง€์›

์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”, ํŒŒ์ด์ฌ, C, C++, C#, JavaScript, Node.Js, Ruby, Go ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Memcached๋งŒ์˜ ํŠน์ง•

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค์ฝ”์–ด๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์Šค์ผ€์ผ์—…์„ ํ†ตํ•˜์—ฌ ๋”์šฑ ๋งŽ์€ ์ž‘์—…์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Redis๋งŒ์˜ ํŠน์ง•

1. ๋”์šฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

๋ฌธ์ž์—ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ List, Set, ์ •๋ ฌ๋œ Set, Hash, Bit ๋ฐฐ์—ด, hyperloglogs (๋งค์šฐ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•)์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—์„œ ์œ„์˜ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Sorted Set์„ ํ™œ์šฉํ•˜์—ฌ ๊ฒŒ์ž„์œ ์ €์˜ ์ƒ์œ„๋žญํฌ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Snapshots

๋ ˆ๋””์Šค๋Š” ํŠน์ •์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜์—ฌ ํŒŒ์ผ ๋ณด๊ด€์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์žฅ์• ์ƒํ™ฉ์‹œ ๋ณต๊ตฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋ณต์ œ

Master โ€” Salves ๊ตฌ์กฐ๋กœ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฝ๊ธฐ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋†’์€ ๊ฐ€์šฉ์„ฑ(์˜ค๋žœ ์‹œ๊ฐ„๋™์•ˆ ๊ณ ์žฅ๋‚˜์ง€ ์•Š์Œ) ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

3. ํŠธ๋žœ์ ์…˜

ํŠธ๋ Œ์ ์…˜์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•˜๊ณ , ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๋…๋ฆฝ์„ฑ, ์ง€์†์„ฑ์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Redis๋Š” ์ด๋Ÿฌํ•œ ํŠน์ง•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

4. Pub / Sub messaging

Publish(๋ฐœํ–‰)๊ณผ Sub(๊ตฌ๋…)๋ฐฉ์‹์˜ ๋ฉ”์‹œ์ง€๋ฅผ ํŒจํ„ด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋†’์€ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ์ฑ„ํŒ…, ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, SNS ํ”ผ๋“œ ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์ƒํ˜ธํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ ์ง€์›

๋งค์šฐ ๊ฒฝ๋Ÿ‰ํ™”๋œ ์ ˆ์ฐจ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ธ ๋ฃจ์•„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. eval ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจ์•„์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…๋ฃŒํ•˜๊ฒŒํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ์œ„์น˜๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ง€์›

Redis๋Š” ์‹ค์‹œ๊ฐ„ ์œ„์น˜๊ธฐ๋ฐ˜๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‘ ์œ„์น˜์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๊ฑฐ๋‚˜, ์‚ฌ์ด์— ์žˆ๋Š” ์š”์†Œ ์ฐพ๊ธฐ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ง›์ง‘, ๊ธธ์ฐพ๊ธฐ ๊ทธ๋ฆฌ๊ณ  ์ง€๋„๊ธฐ๋ฐ˜์˜ ๊ณ ์„ฑ๋Šฅ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํŠธ๋žœ์žญ์…˜์ด ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ACID ์ค‘ I์— ํ•ด๋‹น๋˜๋Š” ๊ฒฉ๋ฆฌ์„ฑ(Isolation)์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ๋ฐ˜๋Œ€๋กœ ๋™์‹œ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์„ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋“ค ๋•Œ๋ฌธ์— ANSIํ‘œ์ค€์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ์„ฑ๊ณผ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ Trade-off๋ฅผ ๋‘๊ณ  4๋‹จ๊ณ„ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ ค๊ฐˆ์ˆ˜๋ก ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋†’์•„์ ธ์„œ ์–ธ๊ธ‰๋œ ์ด์Šˆ๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

1. Read Uncommitted

ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

2. Read Committed

์ปค๋ฐ‹์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํƒ€๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

3. Repeatable Read

ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํ•œ๋ฒˆ ์กฐํšŒํ•œ ๋ฐ์ดํƒ€๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์กฐํšŒํ•ด๋„ ๊ฐ™์€ ๋ฐ์ดํƒ€๊ฐ€ ์กฐํšŒ ๋œ๋‹ค

์ด๋Š” ๊ฐœ๋ณ„ ๋ฐ์ดํƒ€ ์ด์Šˆ์ธ Dirty Read๋‚˜ Non-Repeatable Read๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ฒฐ๊ณผ ์ง‘ํ•ฉ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” Phantom Read๋Š” ๋ฐœ์ƒ๊ฐ€๋Šฅํ•˜๋‹ค.

4. Serializable

๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

์œ„ 3๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๋ชจ๋‘ ์ปค๋ฒ„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.