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

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

ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ

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

์“ฐ๋ ˆ๋“œ์˜ ๊ตฌํ˜„๊ณผ ์‹คํ–‰

  • Threadํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ฐฉ๋ฒ•
public static class ThreadTest2 extends Thread {
        public void run() {
            System.out.println(getName());
        }
    }

// ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์—์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•
Thread t1 = new ThreadTest2();
  • Runnabele ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• (๋‹ค์ค‘ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ)
public static class ThreadTest implements Runnable {
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

// ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์—์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•
Thread t1 = new Thread(new ThreadTest()); // new Thread(Runnable target) ์ƒ์„ฑ์ž ์ด์šฉ

์“ฐ๋ ˆ๋“œ์˜ ๋™๊ธฐํ™” ๊ณผ์ •

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ์‹œ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ํ•œ๊ฐœ๋ผ๋„ ์ƒ์„ฑํ•ด์„œ ์šด์˜ํ•œ๋‹ค๋ฉด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ๋‹ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ๋Š” ๋ณ„๋„๋กœ ์‹คํ–‰๋˜๋Š” ํ•˜๋‚˜์˜ ์‹คํ–‰์ด๋ฏ€๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์Šค๋ ˆ๋“œ๋“ค์ด ๊ณต์œ ํ•˜๋Š” ์ž์›์— ๋Œ€ํ•ด ๋™๊ธฐํ™”๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์Šค๋ ˆ๋“œ๋“ค์ด ์„œ๋กœ ์นจ๋ฒ”ํ•˜๋Š” ์˜์—ญ์—†์ด ๋™์ž‘ํ•œ๋‹ค๋ฉด ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋“ค ๊ฐ„์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋ฏธ OS๊ฐ€ ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์•Œ์•„์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋Š” ์ž๊ธฐ๋งŒ์— address space ๋ฒ”์œ„๋ฅผ ๊ฐ–๊ณ ์žˆ๊ณ , ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ŠคํŽ˜์ด์Šค๋ฅผ ์นจ๋ฒ”ํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.  ํ•œ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋“ค์€ ์„œ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ๋•Œ ๋™๊ธฐํ™”๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์˜ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ๋“ค๊ณผ ๊ณต์œ  ๋ฐ์ดํ„ฐ

๋™๊ธฐํ™” ๋ฌธ์ œ๋Š” ์Šค๋ ˆ๋“œ๋“ค๊ฐ„์˜ ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ํ•œ๋ฒˆ์— ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋ฒˆ์— ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ๊ณต์œ ์ž์›์— ์•ก์„ธ์Šคํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋™๊ธฐํ™”๋ฌธ์ œ ํ•ด๊ฒฐ์ด ๋ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”๋Ÿฐํƒ€์ž„์‹œ์—๋Š” ์“ฐ๋ ˆ๋“œ๋“ค๊ฐ„ ์•„๋ž˜์˜ ์˜์—ญ์ด ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ํ•ญ๋ชฉ๋“ค์€ ์Šค๋ ˆ๋“œ๋“ค๊ฐ„ ๊ณต์œ ๋˜๋Š” ์˜์—ญ๋„ ์žˆ๊ณ , ๋…๋ฆฝ์ ์ธ ์˜์—ญ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ™•์ธํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ๊ณต์œ ๋˜๋Š” ์˜์—ญ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์€ ๊ฐ๊ฐ์˜ Program Counter(์ผ์ข…์˜ ์ง€์‹œ์ž, ๋‹ค์Œ ์ˆ˜ํ–‰๋˜์•ผํ•  ๋ช…๋ น์–ด๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ์Œ.)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • PC(Program Counter) ๋ ˆ์ง€์Šคํ„ฐ ์˜์—ญ: ์Šค๋ ˆ๋“œ ๊ฐ๊ฐ์ด ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์Šค๋ ˆ๋“œ๊ฐ„ ๋…๋ฆฝ์ ์ธ ์˜์—ญ
  • JVM ์Šคํƒ ์˜์—ญ: ์ง€์—ญ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด๊ฐ’, ๊ฐ์ฒด ๋ ˆํผ๋Ÿฐ์Šค๋“ค์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ณต๊ฐ„. ์Šค๋ ˆ๋“œ ๊ฐ๊ฐ์ด ๊ฐ–๊ณ ์žˆ๋Š” ๋”ฐ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋…๋ฆฝ์ ์ธ ์˜์—ญ
  • ํž™ ์˜์—ญ: ์ƒ์„ฑ๋œ ์ž๋ฐ”์˜ ๊ฐ์ฒด๋“ค์ด ์ €์žฅ๋˜๋Š” ๋ถ€๋ถ„. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (๊ณต์œ ๋˜๋Š” ์˜์—ญ)
  • ๋ฉ”์†Œ๋“œ ์˜์—ญ: ํ•จ์ˆ˜์˜์—ญ์œผ๋กœ ๊ฐ ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Ÿฐํƒ€์ž„ ์ปจํ…์ŠคํŠธ ํ’€์˜์—ญ, ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์œผ๋กœ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์— ์˜ํ•ด์„œ ๊ณต์œ ๋˜๋Š” ์˜์—ญ ์ž…๋‹ˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์ปจํ…์ŠคํŠธ ํ’€ ์˜์—ญ: ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ํด๋ž˜์Šค ๋ณ€์ˆ˜, static ๋ณ€์ˆ˜, ํด๋ž˜์Šค ๊ฐ์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์œผ๋กœ ์Šค๋ ˆ๋“œ๋“ค๊ฐ„ ๊ณต์œ ๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์†Œ๋“œ ์Šคํƒ ์˜์—ญ: ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šค๋ ˆ๋“œ๋“ค๊ฐ„ ๊ณต์œ ๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค.

์ž„๊ณ„ ์˜์—ญ

์ž„๊ณ„์˜์—ญ์ด๋ž€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๊ณต์œ ์ž์›์ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์˜ ๋ฒ”์œ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

  • ์ฆ‰, ํ•œ๋ฒˆ์— ํ•œ ์“ฐ๋ ˆ๋“œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์˜์—ญ์„ ์ž„๊ณ„์˜์—ญ์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž„๊ณ„์˜์—ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋™๊ธฐํ™”๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฐ์ฒด์— ๋ฝ(lock)์„ ํฌํ•จ ์‹œํ‚ต๋‹ˆ๋‹ค.

๋ฝ(lock)

๋ฝ์ด๋ž€ ๊ณต์œ  ๊ฐ์ฒด์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ํž™ ์˜์—ญ์— ์ƒ์„ฑ๋ ๋•Œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์ฆ‰, ๊ณต์œ  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” lock์„ ํš๋“ํ•œ ๋‹จ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์ด ์˜์—ญ ๋‚ด์˜ ์ฝ”๋“œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ.

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

์ด์ฒ˜๋Ÿผ ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ฐ„์„ญํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ๊ฒƒ์„ ๋™๊ธฐํ™”๋ผ๊ณ  ํ•œ๋‹ค.

์Šค๋ ˆ๋“œ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ synchronized๋ฅผ ์ด์šฉํ•ด์„œ ์ž„๊ณ„์˜์—ญ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

synchronized๋ฅผ ์ด์šฉํ•œ ๋™๊ธฐํ™”

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์ด๋ฉฐ, ์ด ํ‚ค์›Œ๋“œ๋Š” ์ž„๊ณ„ ์˜์—ญ์„ ์„ค์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ ์ž„๊ณ„ ์˜์—ญ์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์˜์—ญ์„ ์ž„๊ณ„ ์˜์—ญ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

public synchronized void calcSum() {
	...
}

synchronized(๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ณ€์ˆ˜) {
	...
}
  • ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ฉ”์„œ๋“œ ๋‚ด์˜ ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ ๋ธ”๋Ÿญ์œผ๋กœ ๊ฐ์‹ธ๊ณ  ๋ธ”๋Ÿญ ์•ž์— synchronized(์ฐธ์กฐ๋ณ€์ˆ˜) ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ๋ฝ์„ ๊ฑธ๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.

  • ์ด ๋ธ”๋Ÿญ์„ synchronized ๋ธ”๋Ÿญ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ด ๋ธ”๋Ÿญ์˜ ์˜์—ญ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด์„œ๋ถ€ํ„ฐ ์“ฐ๋ ˆ๋“œ๋Š” ์ง€์ •๋œ ๊ฐ์ฒด์˜ lock์„ ์–ป๊ฒŒ ๋˜๊ณ , ์ด ๋ธ”๋Ÿญ์„ ๋ฒ—์–ด๋‚˜๋ฉด lock์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค.

  • ๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ lock์˜ ํš๋“๋  ๋ฐ˜๋‚ฉ์ด ์ž๋™์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ์ž„๊ณ„ ์˜์—ญ๋งŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  • ๋ชจ๋“  ๊ฐ์ฒด๋Š” lock์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด์˜ lock์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋งŒ ์ž„๊ณ„ ์˜์—ญ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

๊ฐ์ฒด ๋น„๊ต(equals())

// Object์˜ equals ๋ฉ”์„œ๋“œ
public boolean equals(Object obj) {
    return (this == obj);
}

Object ํด๋ž˜์Šค์˜ equals()๋Š” ์œ„์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์œผ๋กœ์จ ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋น„๊ต ์—ฐ์‚ฌ์ž์ธ == ๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์˜ค๋กœ์ง€ ์ฐธ์กฐ๊ฐ’(๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’)์ด ๊ฐ™์€์ง€, ๋‹ค์‹œ๋งํ•˜๋ฉด ๋™์ผ ๊ฐ์ฒด์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ž๋ฐ”์—์„œ๋Š” ๋‘ ๊ฐ์ฒด๋ฅผ ๋™๋“ฑ ๋น„๊ตํ•  ๋•Œ equals() ๋ฉ”์†Œ๋“œ๋ฅผ ํ”ํžˆ ์‚ฌ์šฉํ•œ๋‹ค. equals() ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•ด์„œ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋™๋“ฑํ•˜๋ฉด true๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

๋…ผ๋ฆฌ์ ์œผ๋กœ ๋™๋“ฑํ•˜๋‹ค๋Š”๊ฒƒ์€ ๋‘˜์˜ ์ฐธ์กฐ๊ฐ’์ด ๋‹ค๋ฅด๋”๋ผ๋„ ๊ฐ์ฒด ๋‚ด๋ถ€ value๋Š” ๊ฐ™๋‹ค๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด equalsํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๊ฐ€ String class์ด๋‹ค. String class๋Š” equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ๋ฒˆ์ง€๋น„๊ต๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด '๊ฐ’'์„ ๋น„๊ตํ•œ๋‹ค.

  • ๋™์ผ์„ฑ ๋น„๊ต๋Š” == ๋น„๊ต๋‹ค. ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
  • ๋™๋“ฑ์„ฑ ๋น„๊ต๋Š” equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

Java hash code๋ž€

๊ฐ์ฒด ํ•ด์‹œ์ฝ”๋“œ๋ž€ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ํ•˜๋‚˜์˜ ์ •์ˆ˜๊ฐ’์„ ๋งํ•œ๋‹ค. Object์˜ hashCode() ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฒˆ์ง€๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋™๋“ฑ์„ฑ ๋น„๊ต์‹œ hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ํ•„์š”์„ฑ์ด ์žˆ๋Š”๋ฐ, ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ HashSet, HashMap, HashTable์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™๋“ฑํ•œ์ง€ ๋น„๊ตํ•œ๋‹ค.

์šฐ์„  hashCode() ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋ฆฌํ„ด๋œ ํ•ด์‹œ์ฝ”๋“œ ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ๋ณธ๋‹ค. ํ•ด์‹œ ์ฝ”๋“œ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•˜๊ณ , ํ•ด์‹œ ์ฝ”๋“œ๊ฐ’์ด ๊ฐ™์œผ๋ฉด equals()๋ฉ”์†Œ๋“œ๋กœ ๋‹ค์‹œ ๋น„๊ตํ•œ๋‹ค. ์ด ๋‘ ๊ฐœ๊ฐ€ ๋ชจ๋‘ ๋งž์•„์•ผ ๋™๋“ฑ ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•œ๋‹ค. ์ฆ‰, ํ•ด์‹œ์ฝ”๋“œ ๊ฐ’์ด ๋‹คf๋ฅธ ์—”ํŠธ๋ฆฌ๋ผ๋ฆฌ๋Š” ๋™์น˜์„ฑ ๋น„๊ต๋ฅผ ์‹œ๋„์กฐ์ฐจ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Java HashTable

equals์™€ hashcode ๋ฉ”์„œ๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฐ”์—์„œ HashTable์ด ์ž‘๋™ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด์ž.

HashTable์€ <key,value> ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด ๋•Œ ํ•ด์‹œ ํ•จ์ˆ˜(Hash Function)์„ ์ด์šฉํ•˜์—ฌ key๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ณ ์œ ํ•œ ์‹๋ณ„๊ฐ’์ธ ํ•ด์‹œ๊ฐ’์„ ๋งŒ๋“ ๋‹ค. (hashcode๊ฐ€ ํ•ด์‹œ๊ฐ’์„ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.) ์ด ํ•ด์‹œ๊ฐ’์„ ๋ฒ„ํ‚ท(Bucket)์— ์ €์žฅํ•œ๋‹ค.

ํ•˜์ง€๋งŒ HashTable ํฌ๊ธฐ๋Š” ํ•œ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ผ ํ•˜๋”๋ผ๋„ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๊ฒƒ์„ **ํ•ด์‹œ ์ถฉ๋Œ(Hash Collisions)**์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋‹น ๋ฒ„ํ‚ท(Bucket)์— LinkedList ํ˜•ํƒœ๋กœ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์˜ ๋ฒ„ํ‚ท ์•ˆ์— ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ equals ๋ฉ”์„œ๋“œ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

HashTable์— put ๋ฉ”์„œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ

  • ๊ฐ’์ด ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด(equals()๊ฐ€ true๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ฎ์–ด์“ด๋‹ค.
  • ๊ฐ’์ด ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด(equals()๊ฐ€ falseํ•ด๋‹น entry๋ฅผ LinkedList์— ์ถ”๊ฐ€ํ•œ๋‹ค.

HashTable์— get ๋ฉ”์„œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ

  • ๊ฐ’์ด ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด (equals()๊ฐ€ true๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ๊ฐ’์ด ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด(equals()๊ฐ€ falsenull์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ ์„ธ ๊ฐ์ฒด (Entry<K1,V1>, Entry<K2,V2>, Entry<K3,V3>)๋Š” ์„œ๋กœ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์„ ๊ฐ™๋Š”๋‹ค. ๋”ฐ๋ผ์„œ hashcode() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ™์€ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋กœ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— equals() ๋ฉ”์„œ๋“œ๋Š” false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

equals()์™€ hashcode()๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

๋งŒ์•ฝ equals()์™€ hashcode() ์ค‘ ํ•˜๋‚˜๋งŒ ์žฌ์ •์˜ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์œ„ ์˜ˆ์—์„œ๋„ ๋ดค๋“ฏ์ด hashcode()๋ฅผ ์žฌ์ •์˜ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ™์€ ๊ฐ’ ๊ฐ์ฒด๋ผ๋„ ํ•ด์‹œ๊ฐ’์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ HashTable์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ๋ฒ„ํ‚ท์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

๋ฐ˜๋Œ€๋กœ equals()๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด hashcode()๊ฐ€ ๋งŒ๋“  ํ•ด์‹œ๊ฐ’์„ ์ด์šฉํ•ด ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ๋ฒ„ํ‚ท์„ ์ฐพ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ž์‹ ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€ ๊ฐ’์„ ๋น„๊ตํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— null์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ญ์‹œ ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๊ฐ์ฒด์˜ ์ •ํ™•ํ•œ ๋™๋“ฑ ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ๋Š” (ํŠนํžˆ Hash ๊ด€๋ จ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ!) Object์˜ equals() ๋ฉ”์†Œ๋“œ๋งŒ ์žฌ์ •์˜ํ•˜์ง€ ๋ง๊ณ  hashCode()๋ฉ”์†Œ๋“œ๋„ ์žฌ์ •์˜ํ•ด์„œ ๋…ผ๋ฆฌ์  ๋™๋“ฑ ๊ฐ์ฒด์ผ๊ฒฝ์šฐ ๋™์ผํ•œ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ๋ฆฌํ„ด๋˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

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

Old ์˜์—ญ์— ๋Œ€ํ•œ GC

Serial GC

Serial GC ์ ์šฉ์„ ์œ„ํ•œ JVM ์˜ต์…˜ : -XX:+UseSerialGC

Serial ์ด๋ž€ ๋‹จ์–ด์˜ ์˜๋ฏธ์ธ โ€˜์ˆœ์ฐจ์ ์ธโ€™ GC ๋ฐฉ์‹์ด๋‹ค. Young ์˜์—ญ์—์„œ์˜ GC๋Š” ์ด์ „์— ์„ค๋ช…ํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. (Eden, Survivor1, Survivor2๋กœ์˜ ์ด๋™) Old ์˜์—ญ์˜ GC๋Š” mark-sweep-compact์ด๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค. Serial GC ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” Parallel GC ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Mark-Sweep-Compaction ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•Œ์•„๋‘์–ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Mark-Sweep-CompactionMark-Sweep-Compaction ์ด๋ž€ ์„œ๋กœ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ GC์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. GC ๋Œ€์ƒ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋ฉฐํŒŒํŽธํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ž‘์—… (Mark)
  • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—… (Sweep)
  • ํŒŒํŽธํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ์ž‘์—… (Compaction)
    Compaction ์ž‘์—…์˜ ๊ฒฝ์šฐ Windows์˜ ๋””์Šคํฌ ์กฐ๊ฐ ๋ชจ์Œ์„ ์ƒ๊ฐํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค.

Mark-Sweep-Compaction ๊ณผ์ •๋™์•ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณ€ํ™”

https://mirinae312.github.io/img/jvm_gc/MarkSweepCompaction.png

Serial GC๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ์ด์œ ๋Š” GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Parallel GC

Parallel GC ์ ์šฉ์„ ์œ„ํ•œ JVM ์˜ต์…˜ : -XX:+UseParallelGC, -XX:ParallelGCThreads (Minor GC ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜)

์•ž์„œ ์‚ดํŽด๋ณธ Serial GC์„ ์‚ฌ์šฉํ•˜๋˜ ์‹œ์ ˆ๋ณด๋‹ค PC์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๋ฉ”๋ชจ๋ฆฌ๋„ ๋„‰๋„‰ํ•ด์กŒ๊ณ  CPU Core ๋„ ์ข€ ๋” ๋งŽ์•„์กŒ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์ด๋ผ๋ฉด ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ–ˆ๋˜ Serial GC๋ฅผ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์–ด์งˆ ๊ฒƒ์ด๋‹ค. Parallel GC๋Š” Serial GC์™€ ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ™์ง€๋งŒ, Minor GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋Š˜๋ ค ์ข€ ๋” ๋น ๋ฅธ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๊ฒŒํ•œ ๋ฐฉ์‹์ด๋‹ค.

https://mirinae312.github.io/img/jvm_gc/SerialGC_vs_ParallelGC.png

Serial GC์™€ Parallel GC์˜ ์ฐจ์ด

๊ทธ๋ฆผ์„ ๋ณด๋ฉด Serial GC๋Š” GC ์ž‘์—…์„ ํ•˜๋Š” ์Šค๋ ˆ๋“œ(GC Thread)๊ฐ€ ํ•˜๋‚˜์ด๋ฉฐ, Parallel GC์—์„œ๋Š” ์ด GC Thread๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์กด์žฌํ•œ๋‹ค.

์ด๋Š” Parallel GC ์—์„œ์˜ GC ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ฐจ์ด๋Š” GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ Java์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋‘ ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๋Š” Stop-The-World ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚˜๋Š” ์‹œ๊ฐ„์—๋„ ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ๋œ๋‹ค.

์ฆ‰, STW(Stop-The-World) ์‹œ๊ฐ„์ด ์ข€ ๋” ์ ๊ฒŒ ๊ฑธ๋ฆฌ๋Š” Parallel GC์—์„œ์˜ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข€ ๋” ๋งค๋„๋Ÿฝ๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

G1 GC

G1 GC๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€์˜ Young ์˜์—ญ๊ณผ Old ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋Š” ์žŠ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ํ•˜๋“œ์›จ์–ด๊ฐ€ ๋ฐœ์ „๋˜๋ฉด์„œ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋„ ์ ์ฐจ ์ผœ์ €๊ฐ”๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด์˜ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค๋กœ๋Š” ํฐ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ข‹์€ ์„ฑ๋Šฅ(์งง์€ STW)์„ ๋‚ด๊ธฐ ํž˜๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ์ดˆ์ ์„ ๋‘” G1 GC๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฆ‰, G1 GC๋Š” ํฐ ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์งง์€ GC ์‹œ๊ฐ„์„ ๋ณด์žฅํ•˜๋Š”๋ฐ ๊ทธ ๋ชฉ์ ์„ ๋‘”๋‹ค.

G1 GC๋Š” ์•ž์„œ ์‚ดํŽด๋ณธ GC์™€๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณด์•˜๋˜ Eden, Survivor, Old ์˜์—ญ์ด ์กด์žฌํ•˜์ง€๋งŒ ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ๊ณ ์ •๋œ ์œ„์น˜์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด์•„๋‹ˆ๋ฉฐ, ์ „์ฒด ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ Region ์ด๋ผ๋Š” ํŠน์ •ํ•œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ ์„œ ๊ฐ Region์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๊ทธ Region์— ์—ญํ• (Eden, Survivor, Old)์ด ๋™์ ์œผ๋กœ ๋ถ€์—ฌ๋˜๋Š” ์ƒํƒœ์ด๋‹ค.

https://mirinae312.github.io/img/jvm_gc/G1Heap.png

G1 GC๊ฐ€ ์ ์šฉ๋œ JVM Heap ๊ตฌ์กฐ

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

AOP ๊ฐœ๋…

ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํˆด : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋ผ ๋‹ค๋ฅธ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง

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

โ†’ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ณด์™„ํ•จ.

  • ์กฐ์ธํฌ์ธํŠธ : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๊ณผ์ • ๋‚ด์— ์žˆ๋Š” ๋ช…ํ™•ํ•œ ์ง€์ . AOP๋ฅผ ์‚ฌ์šฉํ•ด ์ถ”๊ฐ€ ๋กœ์ง์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ์ง€์ 
  • ์–ด๋“œ๋ฐ”์ด์Šค : ํŠน์ • ์กฐ์ธํฌ์ธํŠธ์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋‚ด ๋ฉ”์„œ๋“œ๋กœ ์ •์˜๋จ.
  • ํฌ์ธํŠธ์ปท : ์• ์ŠคํŒฉํŠธ๊ฐ€ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ๊ณณ์„ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์„ ๊ธฐ์ˆ 
  • ์• ์ŠคํŒฉํŠธ : ํด๋ž˜์Šค์— ์บก์Šํ™”๋œ ์–ด๋“œ๋ฐ”์ด์Šค์™€ ํฌ์ธํŠธ์ปท์˜ ์กฐํ•ฉ
  • ์œ„๋น™ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์˜ ์ ์ ˆํ•œ ์œ„์น˜์— ์• ์ŠคํŒฉํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณผ์ •

AOP ์ข…๋ฅ˜

  • ์ •์  AOP

  • ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ณ„๋„ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •. โ†’ ๊ฒฐ๊ณผ๋ฌผ์ด ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ.

  • ์• ์ŠคํŒฉํŠธ๋ฅผ ์กฐ๊ธˆ์ด๋ผ๋„ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ .

  • ์ฆ‰ ์ปดํŒŒ์ผ ์‹œ์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•. AspectJ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

  • ์ž๋ฐ” ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผ ํ•  ๋•Œ, ์•™ใ„น๋งž์€ ์œ„์น˜์— ๊ณตํ†ต ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด, ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ AOP๊ฐ€ ์ ์šฉ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

  • ๋™์  AOP

  • ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ์œ„๋น™ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰๋จ.

  • ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋œ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•ด ํ•„์š”์— ๋”ฐ๋ผ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹.

  • ๋ฉ”์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์•„๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ „์ฒด ์• ์ŠคํŒฉํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ.

  • AOP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” JVM์ด ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์—์ด์ „ํŠธ๋ฅผ ์ œ๊ณต

  • ์ด ์—์ด์ „ํŠธ๋Š” ๋กœ๋”ฉํ•œ ํด๋ž˜์Šค์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์•Œ๋งž์€ ์œ„์น˜์— ๊ณตํ†ต ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•จ. ์ฆ‰ ์›๋ณธ ํด๋ž˜์Šค ํŒŒ์ผ์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ์— JVM์ด ๋ณ€๊ฒฝ๋œ ๋ฐ”์ดํŠธ ใ…—๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ AOP๋ฅผ ์ ์šฉ

ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•œ AOP ๊ตฌํ˜„

์Šคํ”„๋ง์€ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•˜์—ฌ AOP๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง์€ Aspect์˜ ์ ์šฉ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์— ์ ‘๊ทผํ•  ๋•Œ ๋Œ€์ƒ ๊ฐ์ฒด๋กœ ๋ฐ”๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ํ”„๋ก์‹œ๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ ๋’ค ๋Œ€์ƒ ๊ฐ์ฒด์˜ ์‹ค์ œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋Œ€์ƒ๊ฐ์ฒด์˜ ์‹ค์ œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์— ๊ณตํ†ต๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. https://i.imgur.com/63YMS1o.png
๋Œ€์ƒ ํƒ€๊ฒŸ์€ ๊ฒฐ๊ตญ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๋˜๋Š”๋ฐ, ๋Ÿฐํƒ€์ž„์‹œ์— ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ์„ค์ •์— ๋”ฐ๋ผ์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ง€์ •ํ•œ ๋นˆ ๊ฐ์ฒด ๋Œ€ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์›๋ณธ ๋นˆ ๊ฐ์ฒด ๋Œ€์‹ ์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ๋Œ€์ƒ ๊ฐ์ฒด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š๋ƒ ์—†๋Š๋ƒ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. 2๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•˜๋Š”๋ฐ JDK Dynamic Proxy, CGLIB๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.

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

์Šคํ”„๋ง์˜ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์€ AOP๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์Šคํ”„๋ง์€ @Transactional ์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋นˆ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” PlatformTransactionManager๋ฅผ ์ด์šฉํ•ด์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ๋’ค์—, ์‹ค์ œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— PlatformTransactionManager๋ฅผ ์ด์šฉํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค. ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ, AOP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠธ๋žœ์žญ์…˜ ๋ธ”๋ก์„ ์‹œ์ž‘ํ•˜๊ณ , ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋  ๋•Œ, ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋‹ค.

TransactionTemplate์ด ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ํ”„๋ก์‹œ๊ฐ€ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์€ AOP๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ๋นˆ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค. (์˜ˆ: ํŠธ๋žœ์žญ์…˜์„ ์œ„ํ•œ ํ”„๋ก์‹œ์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•œ AOP ํ”„๋ก์‹œ) ์ด ๋•Œ, ํ”„๋ก์‹œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด, ์›ํ•˜๋Š” ์ˆœ์„œ๋กœ ํ”„๋ก์‹œ๊ฐ€ ์ ์šฉ๋˜๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ AOP ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

๊ธฐ์–ตํ•ด์•ผํ•  ์ ์€, ๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ ๋นˆ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฉด, (Service interface ๊ฐ™์€) ๊ธฐ๋ณธ ํ”„๋ก์‹œ ์ „๋žต์€ Java Dynamic Proxy ์ด๋‹ค. ์ด ์˜๋ฏธ๋Š” ์ฆ‰, ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋ถˆ๋ฆฌ๋Š” ์™ธ๋ถ€ ๋ฉ”์†Œ๋“œ ์ฝœ๋งŒ intercept ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ฉด ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ, Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฝœํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” Transactional ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. (Inner-method-call) ๊ทธ๋ฆฌ๊ณ  ์˜ค๋กœ์ง€ public method๋งŒ @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

public class BooksImpl implements Books {
  public void addBooks(List<String> bookNames) {
    bookNames.forEach(bookName -> this.addBook(bookName)); // inner-method call๋กœ ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€์•Š์Œ!
  }
  
  @Transactional
  public void addBook(String bookName) {
    Book book = new Book(bookName);
    bookRepository.save(book);
    book.setFlag(true);
  }
}

public class BooksProxy {
  private final Books books;
  private final TransactonManager manager = TransactionManager.getInstance();
  
  public BooksProxy(Books books) {
    this.books = books;
  }
  
  public void addBook(String bookName) {
    try {
      manager.begin();
      books.addBook(bookName);
      manager.commit();
    } catch (Exception e) {
      manager.rollback();
    }
  }
}

์ถœ์ฒ˜: https://mommoo.tistory.com/92 [๊ฐœ๋ฐœ์ž๋กœ ํ™€๋กœ ์„œ๊ธฐ]

์œ„์˜ Book ์˜ˆ์ œ์—์„œ BooksProxy ๊ฐ€ addBooks ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ž‘๋™๋ฉ๋‹ˆ๋‹ค. BooksProxy::addBooks -> BooksImpl::addBooks โ†’ BooksImpl::addBook ์ฆ‰, BooksImpl ๋‚ด๋ถ€์˜ ์ฝ”๋“œ(addBook) ๊ฐ€ Transaction ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ˆ˜ํ–‰ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ํ”„๋ก์‹œ๋กœ ๊ฐ์‹ธ์ง„ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์—์„œ @Transactonal ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋Šฅ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

@Transactional์˜ ์˜ต์…˜

  • ๊ฒฉ๋ฆฌ ๋ ˆ๋ฒจ (isolation-level) : ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๊ณผ์˜ ๋™์‹œ ์ ‘์† ๋ฐฉ๋ฒ•์„ ์ œ์–ด

  • ISOLATION_DEFAULT : DB์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ (๊ธฐ๋ณธ๊ฐ’)

  • ISOLATION_READ_UNCOMMITTED : ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์•„์ง ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ์ˆ˜์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ ๊ฑฐ์˜ ์ˆ˜ํ–‰ ์•ˆํ•จ.

  • ISOLATION_READ_COMMITTED : ๋Œ€๋ถ€๋ถ„ DB์˜ ๊ธฐ๋ณธ ์ˆ˜์ค€. ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ์ฝ์„ ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ๋Š๋žœ์žญ์…˜์ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ • ๊ฐ€๋Šฅ

  • ISOLATION_REPEATABLE_READ : ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ผ๋‹จ ํ•œ ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋ฉด ๋‹ค์‹œ ์ฝ์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜๋Š” ์žˆ์œผ๋ฉฐ, ์ƒˆ๋กœ ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

  • ISOLATION_SERIALIZABLE : ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ. ๊ฐ€์žฅ ๋น„์šฉ์ด ํฌ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€.

  • ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์˜ต์…˜(propagation)

  • PROPAGATION_REQUIRED : ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉด ์ƒˆ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ (๊ธฐ๋ณธ๊ฐ’)

  • PROPAGATION_SUPPORTS : ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉด ๋น„ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์‹คํ–‰

  • PROPAGATION_MANDATORY : ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๊ณ , ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง.

  • PROPAGATION_REQUIRES_NEW : ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘. ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์€ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จ๋จ.

  • PROPAGATION_NOT_SUPPORTED : ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ ๋ถˆ๊ฐ€. ํ•ญ์ƒ ๋น„ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์„ ์ผ์‹œ ์ค‘๋‹จ

  • PROPAGATION_NEVER : ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋”๋ผ๋„ ํ•ญ์ƒ ๋น„ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง.

  • PROPAGATION_NESTED : ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉดPROPAGATION_REQUIRED๋กœ ์„ค์ •๋จ.

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

  • rollbackFor / noRollbackFor : ํŠธ๋žœ์žญ์…˜์€ UnchekedException ๋ฐœ์ƒ์‹œ ๊ธฐ๋ณธ์œผ๋กœ roll-back ์ฒ˜๋ฆฌํ•จ. ๋งŒ์•ฝ ์ฒดํฌ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋กค๋ฐฑํ•˜๊ณ  ์‹ถ์œผ๋ฉด rollbackFor = IOException.class ์™€ ๊ฐ™์ด ๋ช…์‹œ ๋ฐ˜๋Œ€๋กœ Unchecked Exception์ด ๋ฐœ์ƒํ•ด๋„ ๋กค๋ฐฑ์„ ์•ˆํ•˜๊ณ  ์‹ถ์œผ๋ฉด noRollbackFor = NullPointerException.class์™€ ๊ฐ™์ด ๋ช…์‹œ

  • timeout : (๊ธฐ๋ณธ๊ฐ’์€ ๋ณ„๋„ timeout์ด ์—†์Œ = -1) ์ง€์ •ํ•œ ์‹œ๊ฐ„ ๋‚ด์— ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜์ด ์•Š์€ ๊ฒฝ์šฐ

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

Spring security ์ธ์ฆ๊ด€๋ จ architecture

spring security๋Š” ์„ธ์…˜-์ฟ ํ‚ค๋ฐฉ์‹์œผ๋กœ ์ธ์ฆํ•œ๋‹ค.

  1. ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ (http request)
  2. AuthenticationFilter ์—์„œ๋ถ€ํ„ฐ ์œ„์™€๊ฐ™์ด user DB๊นŒ์ง€ ํƒ€๊ณ  ๋“ค์–ด๊ฐ
  3. DB์— ์žˆ๋Š” ์œ ์ €๋ผ๋ฉด UserDetails ๋กœ ๊บผ๋‚ด์„œ ์œ ์ €์˜ session ์ƒ์„ฑ
  4. spring security์˜ ์ธ๋ฉ”๋ชจ๋ฆฌ ์„ธ์…˜์ €์žฅ์†Œ์ธ SecurityContextHolder ์— ์ €์žฅ
  5. ์œ ์ €์—๊ฒŒ session ID์™€ ํ•จ๊ป˜ ์‘๋‹ต์„ ๋‚ด๋ ค์คŒ
  6. ์ดํ›„ ์š”์ฒญ์—์„œ๋Š” ์š”์ฒญ ์ฟ ํ‚ค์—์„œ JSESSIONID๋ฅผ ๊นŒ๋ด์„œ ๊ฒ€์ฆ ํ›„ ์œ ํšจํ•˜๋ฉด Authentication๋ฅผ ์ฅ์–ด์ค€๋‹ค.

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

๐Ÿ’ก ํžŒํŠธ(Oracle Hint)๋ž€ ๋ฌด์—‡์ผ๊นŒ?

ํžŒํŠธ๋ž€ SQL ํŠœ๋‹์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์œผ๋กœ ์ผ์ข…์˜ ์ง€์‹œ ๊ตฌ๋ฌธ์ด๋‹ค.

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

(ํžŒํŠธ์— ์˜คํƒ€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ํฐ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์ž˜๋ชป ์‚ฌ์šฉ๋œ ํžŒํŠธ๋Š” ๋ฌด์‹œ๋˜์–ด ํžŒํŠธ๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ)

๐Ÿ’กํžŒํŠธ์˜ ์“ฐ์ž„๊ณผ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.์•ก์„ธ์Šค ๊ฒฝ๋กœ, ์กฐ์ธ ์ˆœ์„œ, ๋ณ‘๋ ฌ ๋ฐ ์ง๋ ฌ ์ฒ˜๋ฆฌ, Optimizer์˜ ๋ชฉํ‘œ(Goal)๋ฅผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ •๋ ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํžŒํŠธ์˜ ์‚ฌ์šฉ์ด ํ•„์š”ํ•˜๋‹ค. ์ฐธ๊ณ  ๋งํฌ๐Ÿ‘‰๐Ÿปํด๋ฆญ

๋˜ํ•œ, ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์„ ์ •ํ•˜๊ณ ์ž ํ•  ๋•Œ๋„ ์‚ฌ์šฉ๋œ๋‹ค. ์ฐธ๊ณ  ๋งํฌ๐Ÿ‘‰๐Ÿป ํด๋ฆญ

์ถœ์ฒ˜:

https://devuna.tistory.com/35

[ํŠœ๋‚˜ ๊ฐœ๋ฐœ์ผ๊ธฐ๐Ÿ“š]

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

Redis(Remote Dictionary Storage, ๋ ˆ๋””์Šค)์™€ Memcached(๋งด์บ์‹œ๋“œ)๋Š” ์œ ๋ช…ํ•œ ์˜คํ”ˆ์†Œ์Šค์ธ, ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ณ ์„ฑ๋Šฅ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ฐจ์ด๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งด์บ์‰ฌ๋“œ๋Š” ๋ช…๋ฃŒํ•˜๊ณ  ๋‹จ์ˆœํ•จ์„ ์œ„ํ•˜์—ฌ ๊ฐœ๋ฐœ๋œ ๋ฐ˜๋ฉด, ๋ ˆ๋””์Šค๋Š” ๋‹ค์–‘ํ•œ ์šฉ๋„์— ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ redis๋Š” memcached์˜ ๋‹จ์ ์„ ๋ณด์•ˆํ•˜๊ณ ์ž ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ฐ ์—”์ง„๋“ค์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜๋ฉด, ์„ ํƒ์ด ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ณตํ†ต์ 

  • redis์™€ memcached ๋ชจ๋‘ In-Memory ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์ด๋‹ค.
  • key-value ํ˜•์‹์˜ No-sql์ด๋‹ค.

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

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

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

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

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

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

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

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

Redis

  • ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. String, Set, Sorted Set, Hash List ๋“ฑ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ๋Š” JSON ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„ ์ง€์›ํ•œ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋””์Šคํฌ๋„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—(์Šค๋ƒ…์ƒท ๊ธฐ๋Šฅ) ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ์‹œ ์œ ์šฉํ•˜๋‹ค.
  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Redis๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์—, 1๋ฒˆ์— 1๊ฐœ์˜ ๋ช…๋ น์–ด๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Keys(์ €์žฅ๋œ ๋ชจ๋“ ํ‚ค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น์–ด)๋‚˜ flushall(๋ชจ๋“  ๋ฐ์ดํ„ฐ ์‚ญ์ œ)๋“ฑ์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋งด์บ์‰ฌ๋“œ์˜ ๊ฒฝ์šฐ 1ms์ •๋„ ์†Œ์š”๋˜์ง€๋งŒ, ๋ ˆ๋””์Šค์˜ ๊ฒฝ์šฐ 100๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ ๊ธฐ์ค€ 1์ดˆ๋กœ ์—„์ฒญ๋‚œ ์†๋„ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ Eviction ์ •์ฑ…์„ ๋™์— ์„ธ๋ฐ€ํ•œ Eviction ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

Memcached

  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • Redis ๋ณด๋‹ค ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•œ๋‹ค.
  • Redis์™€ Memcached ์‚ฌ์ด์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์บ์‹ฑํ•˜๋Š” ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. Memcached๋Š” ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์œ ๋ฆฌํ•˜๋‹ค. Redis๋Š” Copy-on-Write ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•œ๋‹ค.

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

๋‹ค์ˆ˜์˜ ํŠธ๋žœ์žญ์…˜์ด ๊ฒฝ์Ÿ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

๋‹ค์ˆ˜์˜ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ƒํ™ฉ์—์„  ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฐฉ์‹์„ ์ข€ ๋” ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ์ค‘์ด๊ณ  ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ทธ ๋ ˆ์ฝ”๋“œ์— ์ ‘๊ทผํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ถ Problem1 - Dirty Read

  • ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์–ด๋–ค ๊ฐ’์„ 1์—์„œ 2๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์•„์ง ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ํŠธ๋žœ์žญ์…˜B๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ์ฝ๋Š” ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ B๋Š” 2๊ฐ€ ์กฐํšŒ ๋œ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜ B๊ฐ€ 2๋ฅผ ์กฐํšŒ ํ•œ ํ›„ ํ˜น์‹œ A๊ฐ€ ๋กค๋ฐฑ๋œ๋ฉด ๊ฒฐ๊ตญ ํŠธ๋žœ์žญ์…˜B๋Š” ์ž˜๋ชป๋œ ๊ฐ’์„ ์ฝ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์•„์ง ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜์ด๋‹ค.

โ–ถ Problem2 - Non-Repeatable Read

  • ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์–ด๋–ค ๊ฐ’ 1์„ ์ฝ์—ˆ๋‹ค. ์ดํ›„ A๋Š” ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋˜ ์‹คํ–‰ํ•  ์˜ˆ์ •์ธ๋ฐ, ๊ทธ ์‚ฌ์ด์— ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ๊ฐ’ 1์„ 2๋กœ ๋ฐ”๊พธ๊ณ  ์ปค๋ฐ‹ํ•ด๋ฒ„๋ฆฌ๋ฉด A๊ฐ€ ๊ฐ™์€ ์ฟผ๋ฆฌ ๋‘๋ฒˆ์„ ๋‚ ๋ฆฌ๋Š” ์‚ฌ์ด ๋‘ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

  • ์ฆ‰, ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‘๋ฒˆ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜์ด๋‹ค.

Dirty Read์— ๋น„ํ•ด์„œ๋Š” ๋ฐœ์ƒ ํ™•๋ฅ ์ด ์ ๋‹ค.

โ–ถ Problem3 - Phantom Read

  • ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์–ด๋–ค ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฒ”์œ„์˜ ๊ฐ’๋“ค[0,1,2,3,4]์„ ์ฝ์—ˆ๋‹ค. ์ดํ›„ A๋Š” ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์˜ˆ์ •์ธ๋ฐ, ๊ทธ ์‚ฌ์ด์— ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ๊ฐ’[5,6,7]์„ ์ถ”๊ฐ€ํ•ด๋ฒ„๋ฆฌ๋ฉด A๊ฐ€ ๊ฐ™์€ ์ฟผ๋ฆฌ ๋‘๋ฒˆ์„ ๋‚ ๋ฆฌ๋Š” ์‚ฌ์ด ๋‘ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

  • ์ฆ‰, ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ผ์ • ๋ฒ”์œ„์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‘๋ฒˆ ์ด์ƒ ์ฝ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜์ด๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ๋ ˆ๋ฒจ (isolation-level) : ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๊ณผ์˜ ๋™์‹œ ์ ‘์† ๋ฐฉ๋ฒ•์„ ์ œ์–ด

  • ISOLATION_DEFAULT : DB์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ (๊ธฐ๋ณธ๊ฐ’)
  • ISOLATION_READ_UNCOMMITTED : ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์•„์ง ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ์ˆ˜์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ ๊ฑฐ์˜ ์ˆ˜ํ–‰ ์•ˆํ•จ. โ†’ Dirty Read ๋ฐœ์ƒ ๊ฐ€๋Šฅ!
  • ISOLATION_READ_COMMITTED : ๋Œ€๋ถ€๋ถ„ DB์˜ ๊ธฐ๋ณธ ์ˆ˜์ค€. ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ์ฝ์„ ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ๋Š๋žœ์žญ์…˜์ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ • ๊ฐ€๋Šฅ โ†’ Dirty Read ๋ฐฉ์ง€.
  • ISOLATION_REPEATABLE_READ : ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ผ๋‹จ ํ•œ ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋ฉด ๋‹ค์‹œ ์ฝ์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜๋Š” ์žˆ์œผ๋ฉฐ, ์ƒˆ๋กœ ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. Non-Repeatable Read ๋ฐฉ์ง€
  • ISOLATION_SERIALIZABLE : ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ. ๊ฐ€์žฅ ๋น„์šฉ์ด ํฌ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€. Phantom Read ๋ฐฉ์ง€
โš ๏ธ **GitHub.com Fallback** โš ๏ธ