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
์ ํ๋ํ ์ฐ๋ ๋๋ ์๊ณ ์์ญ ๋ด์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ํํ๊ณ ๋ฒ์ด๋์ loc
k์ ๋ฐ๋ฉํด์ผ๋ง ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๋ฐ๋ฉ๋ lock
์ ํ๋ํ์ฌ ์๊ณ์์ญ์ ์ฝ๋๋ฅผ ์ํํ ์ ์๊ฒ ํ ์ ์๋ค.
์ด์ฒ๋ผ ํ ์ฐ๋ ๋๊ฐ ์งํ ์ค์ธ ์์ ์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๊ฐ์ญํ์ง ๋ชปํ๊ฒ ๋ง๋ ๊ฒ์ ๋๊ธฐํ๋ผ๊ณ ํ๋ค.
์ค๋ ๋๋ฅผ ๋๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ synchronized
๋ฅผ ์ด์ฉํด์ ์๊ณ์์ญ์ ์ค์ ํ๋ ๊ฒ์ด๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ๋๊ธฐํ ๋ฐฉ๋ฒ์ด๋ฉฐ, ์ด ํค์๋๋ ์๊ณ ์์ญ์ ์ค์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. ๋ฉ์๋ ์ ์ฒด๋ฅผ ์๊ณ ์์ญ์ผ๋ก ์ค์ ํ๊ฑฐ๋, ํน์ ์์ญ์ ์๊ณ ์์ญ์ผ๋ก ์ง์ ํ ์ ์๋ค.
public synchronized void calcSum() {
...
}
synchronized(๊ฐ์ฒด์ ์ฐธ์กฐ๋ณ์) {
...
}
-
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ฉ์๋ ๋ด์ ์ฝ๋ ์ผ๋ถ๋ฅผ ๋ธ๋ญ์ผ๋ก ๊ฐ์ธ๊ณ ๋ธ๋ญ ์์
synchronized(์ฐธ์กฐ๋ณ์)
๋ฅผ ๋ถ์ด๋ ๊ฒ์ด๋ค. ์ด๋ ์ฐธ์กฐ๋ณ์๋ ๋ฝ์ ๊ฑธ๊ณ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด์ด์ผ ํ๋ค. -
์ด ๋ธ๋ญ์
synchronized ๋ธ๋ญ
์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด ๋ธ๋ญ์ ์์ญ ์์ผ๋ก ๋ค์ด๊ฐ๋ฉด์๋ถํฐ ์ฐ๋ ๋๋ ์ง์ ๋ ๊ฐ์ฒด์ lock์ ์ป๊ฒ ๋๊ณ , ์ด ๋ธ๋ญ์ ๋ฒ์ด๋๋ฉด lock์ ๋ฐ๋ฉํ๋ค. -
๋ ๋ฐฉ๋ฒ ๋ชจ๋ lock์ ํ๋๋ ๋ฐ๋ฉ์ด ์๋์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฏ๋ก ์๊ณ ์์ญ๋ง ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
-
๋ชจ๋ ๊ฐ์ฒด๋
lock
์ ํ๋์ฉ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํด๋น ๊ฐ์ฒด์ lock์ ๊ฐ์ง๊ณ ์๋ ์ฐ๋ ๋๋ง ์๊ณ ์์ญ์ ์ฝ๋๋ฅผ ์ํํ ์ ์๋ค.
hashCode() ๊ฐ์ด ๋ชจ๋ ๊ฐ๋ค๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์? hashcode()์ 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()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ์ ๋น๊ตํ๋ค.
๊ฐ์ฒด ํด์์ฝ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ํ๋์ ์ ์๊ฐ
์ ๋งํ๋ค. Object์ hashCode() ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ง๋ฅผ ์ด์ฉํด์ ํด์์ฝ๋๋ฅผ ๋ง๋ค์ด ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ๋ง๋ค ๋ค๋ฅธ ๊ฐ
์ ๊ฐ์ง๊ณ ์๋ค. ๊ฐ์ฒด์ ๊ฐ์ ๋๋ฑ์ฑ ๋น๊ต์ hashCode()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ํ์์ฑ์ด ์๋๋ฐ, ์ปฌ๋ ์
ํ๋ ์์ํฌ์์ HashSet, HashMap, HashTable
์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ ๊ฐ์ฒด๊ฐ ๋๋ฑํ์ง ๋น๊ตํ๋ค.
์ฐ์ hashCode()
๋ฉ์๋๋ฅผ ์คํํด์ ๋ฆฌํด๋ ํด์์ฝ๋ ๊ฐ์ด ๊ฐ์์ง๋ฅผ ๋ณธ๋ค. ํด์ ์ฝ๋๊ฐ์ด ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด๋ก ํ๋จํ๊ณ , ํด์ ์ฝ๋๊ฐ์ด ๊ฐ์ผ๋ฉด equals()
๋ฉ์๋๋ก ๋ค์ ๋น๊ตํ๋ค. ์ด ๋ ๊ฐ๊ฐ ๋ชจ๋ ๋ง์์ผ ๋๋ฑ ๊ฐ์ฒด๋ก ํ๋จํ๋ค.
์ฆ, ํด์์ฝ๋ ๊ฐ์ด ๋คf๋ฅธ ์ํธ๋ฆฌ๋ผ๋ฆฌ๋ ๋์น์ฑ ๋น๊ต๋ฅผ ์๋์กฐ์ฐจ ํ์ง ์๋๋ค.
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()๊ฐ false) null์ ๋ฆฌํดํ๋ค.
์ ๊ทธ๋ฆผ์์ ์ธ ๊ฐ์ฒด (Entry<K1,V1>, Entry<K2,V2>, Entry<K3,V3>)
๋ ์๋ก ๊ฐ์ ํด์๊ฐ์ ๊ฐ๋๋ค. ๋ฐ๋ผ์ hashcode() ๋ฉ์๋๋ ๊ฐ์ ๊ฐ์ ๋ฆฌํดํ๋ค. ํ์ง๋ง ์๋ก ๊ฐ์ด ๋ค๋ฅธ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ equals() ๋ฉ์๋๋ false๋ฅผ ๋ฆฌํดํ๋ค.
๋ง์ฝ equals()
์ hashcode()
์ค ํ๋๋ง ์ฌ์ ์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ ์์์๋ ๋ดค๋ฏ์ด hashcode()
๋ฅผ ์ฌ์ ์ ํ์ง ์์ผ๋ฉด ๊ฐ์ ๊ฐ ๊ฐ์ฒด๋ผ๋ ํด์๊ฐ์ด ๋ค๋ฅผ ์ ์๋ค. ๋ฐ๋ผ์ HashTable์์ ํด๋น ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฒํท์ ์ฐพ์ ์ ์๋ค.
๋ฐ๋๋ก equals()
๋ฅผ ์ฌ์ ์ํ์ง ์์ผ๋ฉด hashcode()
๊ฐ ๋ง๋ ํด์๊ฐ์ ์ด์ฉํด ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฒํท์ ์ฐพ์ ์๋ ์์ง๋ง ํด๋น ๊ฐ์ฒด๊ฐ ์์ ๊ณผ ๊ฐ์ ๊ฐ์ฒด์ธ์ง ๊ฐ์ ๋น๊ตํ ์ ์๊ธฐ ๋๋ฌธ์ null์ ๋ฆฌํดํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ญ์ ์ํ๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์๋ค.
์ด๋ฌํ ์ด์ ๋ก ๊ฐ์ฒด์ ์ ํํ ๋๋ฑ ๋น๊ต๋ฅผ ์ํด์๋ (ํนํ Hash ๊ด๋ จ ์ปฌ๋ ์
ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋!) Object์ equals()
๋ฉ์๋๋ง ์ฌ์ ์ํ์ง ๋ง๊ณ hashCode()
๋ฉ์๋๋ ์ฌ์ ์ํด์ ๋
ผ๋ฆฌ์ ๋๋ฑ ๊ฐ์ฒด์ผ๊ฒฝ์ฐ ๋์ผํ ํด์์ฝ๋๊ฐ ๋ฆฌํด๋๋๋ก ํด์ผํ๋ค.
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์ ๋์คํฌ ์กฐ๊ฐ ๋ชจ์์ ์๊ฐํ๋ฉด ์ข์ ๊ฒ์ด๋ค.
Serial GC๊ฐ ์์ฐจ์ ์ผ๋ก ๋์ํ ์ ๋ฐ์ ์๋ ์ด์ ๋ GC๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๊ฐ ํ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค.
Parallel GC ์ ์ฉ์ ์ํ JVM ์ต์ : -XX:+UseParallelGC, -XX:ParallelGCThreads (Minor GC ์ค๋ ๋ ๊ฐ์)
์์ ์ดํด๋ณธ Serial GC์ ์ฌ์ฉํ๋ ์์ ๋ณด๋ค PC์ ์ฑ๋ฅ์ด ์ข์์ก๋ค๊ณ ์๊ฐํด๋ณด์. ๋ฉ๋ชจ๋ฆฌ๋ ๋๋ํด์ก๊ณ CPU Core ๋ ์ข ๋ ๋ง์์ก๋ค. ์ด๋ฐ ์ํฉ์ด๋ผ๋ฉด ํ๋์ ์ค๋ ๋๋ก ๋์ํ๋ Serial GC๋ฅผ ๋ฉํฐ์ค๋ ๋๋ก ์คํํ๊ณ ์ถ์ด์ง ๊ฒ์ด๋ค. Parallel GC๋ Serial GC์ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ง๋ง, Minor GC๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๋ฅผ ์ฌ๋ฌ๊ฐ๋ก ๋๋ ค ์ข ๋ ๋น ๋ฅธ ๋์์ด ๊ฐ๋ฅํ๊ฒํ ๋ฐฉ์์ด๋ค.
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๋ฅผ ์ดํดํ๋ ค๋ฉด ์ง๊ธ๊น์ง์ Young ์์ญ๊ณผ Old ์์ญ์ ๋ํด์๋ ์๋ ๊ฒ์ด ์ข๋ค.
ํ๋์จ์ด๊ฐ ๋ฐ์ ๋๋ฉด์ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ ์ ์ฐจ ์ผ์ ๊ฐ๋ค. ํ์ง๋ง ๊ธฐ์กด์ GC ์๊ณ ๋ฆฌ์ฆ๋ค๋ก๋ ํฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ข์ ์ฑ๋ฅ(์งง์ STW)์ ๋ด๊ธฐ ํ๋ค์๊ธฐ ๋๋ฌธ์ ์ด์ ์ด์ ์ ๋ G1 GC๊ฐ ๋ฑ์ฅํ๊ฒ ๋์๋ค.
์ฆ, G1 GC๋ ํฐ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์งง์ GC ์๊ฐ์ ๋ณด์ฅํ๋๋ฐ ๊ทธ ๋ชฉ์ ์ ๋๋ค.
G1 GC๋ ์์ ์ดํด๋ณธ GC์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค. ์์ ์ดํด๋ณด์๋ Eden, Survivor, Old ์์ญ์ด ์กด์ฌํ์ง๋ง ๊ณ ์ ๋ ํฌ๊ธฐ๋ก ๊ณ ์ ๋ ์์น์ ์กด์ฌํ๋ ๊ฒ์ด์๋๋ฉฐ, ์ ์ฒด ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ Region ์ด๋ผ๋ ํน์ ํ ํฌ๊ธฐ๋ก ๋๋ ์ ๊ฐ Region์ ์ํ์ ๋ฐ๋ผ ๊ทธ Region์ ์ญํ (Eden, Survivor, Old)์ด ๋์ ์ผ๋ก ๋ถ์ฌ๋๋ ์ํ์ด๋ค.
G1 GC๊ฐ ์ ์ฉ๋ JVM Heap ๊ตฌ์กฐ
Spring์ AOP์ ํน์ง๊ณผ ์ด๋๋ฐ์ด์ค ์ข ๋ฅ์ ์ฌ์ฉ๋ proxy ํจํด์ ๋ํด ์ค๋ช ํด๋ณด์ธ์.
ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๊ตฌํํ๋ ํด : ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๋๊ฐ ์ค๋ณต๋๊ณ ๊ฐ๋ ฅํ๊ฒ ๊ฒฐํฉ๋ผ ๋ค๋ฅธ ๋ก์ง๊ณผ ๋ถ๋ฆฌํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง
AOP๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํต์ฌ ๊ด์ฌ ์ฌํญ๊ณผ ์ ์ฒด์ ์ ์ฉ๋๋ ๊ณตํต ๋ชจ๋ ์ฌํญ์ ๊ธฐ์ค์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ํจ์ผ๋ก์จ ๊ณตํต ๋ชจ๋์ ์ฌ๋ฌ ์ฝ๋์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. AOP๋ฅผ ๊ตฌํํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ณตํต ๊ด์ฌ ์ฌํญ ์ฝ๋๋ฅผ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ ์ฝ๋์์ ์ฝ์ ํ๋ ๊ฒ์ ๋๋ค.
โ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ณด์ํจ.
- ์กฐ์ธํฌ์ธํธ : ์ดํ๋ฆฌ์ผ์ด์ ์คํ ๊ณผ์ ๋ด์ ์๋ ๋ช ํํ ์ง์ . AOP๋ฅผ ์ฌ์ฉํด ์ถ๊ฐ ๋ก์ง์ ์ฝ์ ํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์ง์
- ์ด๋๋ฐ์ด์ค : ํน์ ์กฐ์ธํฌ์ธํธ์ ์คํ๋๋ ์ฝ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค ๋ด ๋ฉ์๋๋ก ์ ์๋จ.
- ํฌ์ธํธ์ปท : ์ ์คํฉํธ๊ฐ ์ ์ฉ๋์ด์ผ ํ๋ ๊ณณ์ ํ๋ณํ ์ ์๋ ํจํด์ ๊ธฐ์
- ์ ์คํฉํธ : ํด๋์ค์ ์บก์ํ๋ ์ด๋๋ฐ์ด์ค์ ํฌ์ธํธ์ปท์ ์กฐํฉ
- ์๋น : ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ์ ์ ํ ์์น์ ์ ์คํฉํธ๋ฅผ ์ฝ์ ํ๋ ๊ณผ์
-
์ ์ AOP
-
๋น๋ ํ๋ก์ธ์ค์์ ๋ณ๋ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง.
-
์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์์ . โ ๊ฒฐ๊ณผ๋ฌผ์ด ์๋ฐ ๋ฐ์ดํธ์ฝ๋.
-
์ ์คํฉํธ๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ์์ ํ๊ฒ ๋๋ฉด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์ปดํ์ผํด์ผ ํ๋ค๋ ์ .
-
์ฆ ์ปดํ์ผ ์์ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ. AspectJ์์ ์ฌ์ฉํ๋ ๋ฐฉ์
-
์๋ฐ ์์ค๋ฅผ ์ปดํ์ผ ํ ๋, ์ใน๋ง์ ์์น์ ๊ณตํต ์ฝ๋๋ฅผ ์ฝ์ ํ๋ฉด, ์ปดํ์ผ ๊ฒฐ๊ณผ AOP๊ฐ ์ ์ฉ๋ ํด๋์ค ํ์ผ์ด ์์ฑ๋๋ค.
-
๋์ AOP
-
๋ฐํ์์ ๋์ ์ผ๋ก ์๋น ํ๋ก์ธ์ค๊ฐ ์ํ๋จ.
-
์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ๋ชจ๋ ๊ฐ์ฒด์ ๋ํ ํ๋ก์๋ฅผ ์์ฑํด ํ์์ ๋ฐ๋ผ ์ด๋๋ฐ์ด์ค๋ฅผ ํธ์ถํ ์ ์๋๋ก ํ๋ ๋ฐฉ์.
-
๋ฉ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์ปดํ์ผ ํ์ง ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฒด ์ ์คํฉํธ๋ฅผ ์ฝ๊ฒ ์์ ํ ์ ์์.
-
AOP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ JVM์ด ํด๋์ค๋ฅผ ๋ก๋ฉํ ๋ ํด๋์ค ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์์ด์ ํธ๋ฅผ ์ ๊ณต
-
์ด ์์ด์ ํธ๋ ๋ก๋ฉํ ํด๋์ค์ ๋ฐ์ด๋๋ฆฌ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ์ฌ ์๋ง์ ์์น์ ๊ณตํต ์ฝ๋๋ฅผ ์ฝ์ ํ ์๋ก์ด ํด๋์ค ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๋ก ํจ. ์ฆ ์๋ณธ ํด๋์ค ํ์ผ์ ๋ณ๊ฒฝํ์ง ์๊ณ ํด๋์ค๋ฅผ ๋ก๋ฉํ ๋์ JVM์ด ๋ณ๊ฒฝ๋ ๋ฐ์ดํธ ใ ๋๋ฅผ ์ฌ์ฉํ๋๋ก ํจ์ผ๋ก์จ AOP๋ฅผ ์ ์ฉ
์คํ๋ง์ ํ๋ก์๋ฅผ ์ด์ฉํ์ฌ AOP๋ฅผ ๊ตฌํํฉ๋๋ค. ์คํ๋ง์ Aspect
์ ์ ์ฉ๋์์ด ๋๋ ๊ฐ์ฒด์ ๋ํ ํ๋ก์๋ฅผ ๋ง๋ค์ด ์ ๊ณตํฉ๋๋ค. ๋น์ง๋์ค ๋ก์ง์ ์ ๊ทผํ ๋ ๋์ ๊ฐ์ฒด๋ก ๋ฐ๋ก ์ ๊ทผํ๋ ๊ฒ ์๋ ํ๋ก์๋ฅผ ํตํด์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ๊ฒ ๋ฉ๋๋ค.
์ด ๊ณผ์ ์์ ํ๋ก์๋ ๊ณตํต ๊ธฐ๋ฅ์ ์คํํ ๋ค ๋์ ๊ฐ์ฒด์ ์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋๋ ๋์๊ฐ์ฒด์ ์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ ํ์ ๊ณตํต๊ธฐ๋ฅ์ ์คํํฉ๋๋ค.
๋์ ํ๊ฒ์ ๊ฒฐ๊ตญ ๋น ๊ฐ์ฒด๊ฐ ์์ฑ ๋๋๋ฐ, ๋ฐํ์์์ ์ค๋ธ์ ํธ ์์ฑ ์ค์ ์ ๋ฐ๋ผ์ ์คํ๋ง ์ปจํ
์ด๋๊ฐ ์ง์ ํ ๋น ๊ฐ์ฒด ๋ํ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์๋ณธ ๋น ๊ฐ์ฒด ๋์ ์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ํฉ๋๋ค.
ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ๋์ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋๋ ์๋๋ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. 2๊ฐ์ง ๋ฐฉ์์ด ์กด์ฌํ๋๋ฐ JDK Dynamic Proxy, CGLIB
๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด ์๋ค.
์คํ๋ง์ ์ ์ธ์ ํธ๋์ญ์
์ 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
์ด๋
ธํ
์ด์
๊ธฐ๋ฅ์ด ์ํ๋์ง ์๋๋ค.
-
๊ฒฉ๋ฆฌ ๋ ๋ฒจ (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) ์ง์ ํ ์๊ฐ ๋ด์ ํด๋น ๋ฉ์๋ ์ํ์ด ์๋ฃ๋์ด ์์ ๊ฒฝ์ฐ
- ์ ์ ๊ฐ ๋ก๊ทธ์ธ์ ์๋ (http request)
-
AuthenticationFilter
์์๋ถํฐ ์์๊ฐ์ด user DB๊น์ง ํ๊ณ ๋ค์ด๊ฐ - DB์ ์๋ ์ ์ ๋ผ๋ฉด
UserDetails
๋ก ๊บผ๋ด์ ์ ์ ์ session ์์ฑ - spring security์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์
์ ์ฅ์์ธ
SecurityContextHolder
์ ์ ์ฅ - ์ ์ ์๊ฒ
session ID
์ ํจ๊ป ์๋ต์ ๋ด๋ ค์ค - ์ดํ ์์ฒญ์์๋ ์์ฒญ ์ฟ ํค์์
JSESSIONID
๋ฅผ ๊น๋ด์ ๊ฒ์ฆ ํ ์ ํจํ๋ฉดAuthentication
๋ฅผ ์ฅ์ด์ค๋ค.
ํํธ๋ SQL ํ๋์ ํต์ฌ ๋ถ๋ถ์ผ๋ก ์ผ์ข ์ ์ง์ ๊ตฌ๋ฌธ์ด๋ค.
์ฆ, ์ค๋ผํด ์ตํฐ๋ง์ด์ (Optimizer)์๊ฒ SQL๋ฌธ ์คํ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค์บ๋ํ๋ ๊ฒฝ๋ก, ์กฐ์ธํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ์๋ ค์ฃผ๊ธฐ ์ํด SQL์ฌ์ฉ์๊ฐ SQL ๊ตฌ๋ฌธ์ ์์ฑํ๋ ๊ฒ์ ๋ปํ๋ค. ์ค๋ผํด์ด ํญ์ ์ต์ ์ ์คํ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค์ด ๋ด๊ธฐ๋ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ง์ ์ต์ ์ ์คํ ๊ฒฝ๋ก๋ฅผ ์์ฑํด ์ฃผ๋ ๊ฒ์ด๋ค. ์ฌ์ฉ์๊ฐ ํน์ SQL ๋ฌธ์ฅ์์ ์ด๋ค ์ธ๋ฑ์ค๊ฐ ์ ํ๋๊ฐ ๋์์ง ์๊ณ ์๋ ๊ฒฝ์ฐ Optimizer์ ์์กดํ ์คํ ๊ณํ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ธ ์คํ ๊ณํ์ ๊ตฌ์ฌํ ์ ์๋ค.๋จ, ํํธ, ์ธ๋ฑ์ค, ์กฐ์ธ์ ๊ฐ๋ ์ ์ ํํ ์๊ณ ์ฌ์ฉํ์ง ์์ ๋ฌด๋ถ๋ณํ ํํธ์ ์ฌ์ฉ์ ์ฑ๋ฅ์ ์ ํ๋ฅผ ์ด๋ํ๊ธฐ ๋๋ฌธ์ ์ ์๊ณ ์ต์ ์ ์คํ ๊ฒฝ๋ก๋ฅผ ์๊ณ ์์ ๊ฒฝ์ฐ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.
(ํํธ์ ์คํ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ํฐ ๊ด๊ณ๊ฐ ์๋ค. ์๋ํ๋ฉด, ์๋ชป ์ฌ์ฉ๋ ํํธ๋ ๋ฌด์๋์ด ํํธ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๊ธฐ ๋๋ฌธ)
ํํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ ๊ฒ๋ค์ ํ ์ ์๋ค.์ก์ธ์ค ๊ฒฝ๋ก, ์กฐ์ธ ์์, ๋ณ๋ ฌ ๋ฐ ์ง๋ ฌ ์ฒ๋ฆฌ, Optimizer์ ๋ชฉํ(Goal)๋ฅผ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
๋ฐ์ดํฐ ๊ฐ์ ์ ๋ ฌํด์ผ ํ๋ ๊ฒฝ์ฐ, ํํธ์ ์ฌ์ฉ์ด ํ์ํ๋ค. ์ฐธ๊ณ ๋งํฌ๐๐ปํด๋ฆญ
๋ํ, ๋๋ผ์ด๋น ํ ์ด๋ธ์ ์ํ๋ ๋๋ก ์ ์ ํ๊ณ ์ ํ ๋๋ ์ฌ์ฉ๋๋ค. ์ฐธ๊ณ ๋งํฌ๐๐ป ํด๋ฆญ
์ถ์ฒ:
[ํ๋ ๊ฐ๋ฐ์ผ๊ธฐ๐]
Redis(Remote Dictionary Storage, ๋ ๋์ค)
์ Memcached(๋งด์บ์๋)
๋ ์ ๋ช
ํ ์คํ์์ค์ธ, ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ์ ์ฅ์์
๋๋ค.
๋ ๋ชจ๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ๊ณ ์ฑ๋ฅ์ ์๋ํฉ๋๋ค. ํ์ง๋ง, ์์ง์ผ๋ก ์ฌ์ฉํ ๋ ์ฐจ์ด๋ฅผ ๋ฐ๋์ ๊ณ ๋ คํด์ผํฉ๋๋ค. ๋งด์บ์ฌ๋๋ ๋ช
๋ฃํ๊ณ ๋จ์ํจ์ ์ํ์ฌ ๊ฐ๋ฐ๋ ๋ฐ๋ฉด, ๋ ๋์ค๋ ๋ค์ํ ์ฉ๋์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ง์ ํน์ง์ ๊ฐ์ง๊ณ ๊ฐ๋ฐ๋์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก redis
๋ memcached
์ ๋จ์ ์ ๋ณด์ํ๊ณ ์ ๋ง๋ค์ด์ก์ต๋๋ค.
๊ฐ ์์ง๋ค์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ํ์ํ ์ํฉ์ ๊ณ ๋ คํ๋ฉด, ์ ํ์ด ์ด๋ ต์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
- redis์ memcached ๋ชจ๋ In-Memory ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ด๋ค.
- key-value ํ์์ No-sql์ด๋ค.
1ms ์ดํ์ ์๋ต์๊ฐ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ๋์คํฌ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
๋ฌธ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ๊ฐ๋ฐ์ฝ๋ ์ ๋ํ ์ ์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐํ์ฌ ์ ์ฅ์ํฌ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์๊ฐ ์ฆ๊ฐํ ๋ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ์ฌ ์ค์ผ์ผ์์์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฌ๋ฌ ๊ฐ๋ฐ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฐ, ํ์ด์ฌ, C, C++, C#, JavaScript, Node.Js, Ruby, Go ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ธ์ด๋ค์ ์ง์ํฉ๋๋ค.
- ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ค์ํฉ๋๋ค.
String, Set, Sorted Set, Hash List
๋ฑ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. - ํ์ฌ๋
JSON
ํ์ ์ ๋ํด์๋ ์ง์ํ๋ค. - ๋ฉ๋ชจ๋ฆฌ ๋ฟ๋ง ์๋๋ผ ๋์คํฌ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์(์ค๋ ์ท ๊ธฐ๋ฅ) ๋ฐ์ดํฐ ๋ณต๊ตฌ์ ์ ์ฉํ๋ค.
-
์ฑ๊ธ ์ค๋ ๋
๋ฅผ ์ฌ์ฉํ๋ค. Redis๋ ์ฑ๊ธ ์ฐ๋ ๋์ด๊ธฐ ๋๋ฌธ์, 1๋ฒ์ 1๊ฐ์ ๋ช ๋ น์ด๋ง ์คํํ ์ ์์ต๋๋ค. Keys(์ ์ฅ๋ ๋ชจ๋ ํค๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ช ๋ น์ด)๋ flushall(๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ )๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ๋, ๋งด์บ์ฌ๋์ ๊ฒฝ์ฐ 1ms์ ๋ ์์๋์ง๋ง, ๋ ๋์ค์ ๊ฒฝ์ฐ 100๋ง๊ฑด์ ๋ฐ์ดํฐ ๊ธฐ์ค 1์ด๋ก ์์ฒญ๋ ์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. - ๋ค์ํ Eviction ์ ์ฑ ์ ๋์ ์ธ๋ฐํ Eviction ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค
-
๋ฉํฐ์ค๋ ๋ ์ํคํ ์ฒ
๋ฅผ ์ง์ํ๋ค. - Redis ๋ณด๋ค ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํ๋ค.
- Redis์ Memcached ์ฌ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์บ์ฑํ๋ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์๋ ๊ฒ ๊ฐ๋ค. Memcached๋ ์ ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ์ ์ ๋ฆฌํ๋ค. Redis๋ Copy-on-Write ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํ๋ค.
๋ค์์ ํธ๋์ญ์ ์ด ๊ฒฝ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์
๋ค์์ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋๋ ์ํฉ์์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฐฉ์์ ์ข ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์๋ฅผ๋ค์ด ํน์ ํธ๋์ญ์ ์ด ์ฒ๋ฆฌ์ค์ด๊ณ ์์ง ์ปค๋ฐ๋์ง ์์๋๋ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ทธ ๋ ์ฝ๋์ ์ ๊ทผํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โถ 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 ๋ฐฉ์ง