week 2 jonghun - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
JAVA
์๋ฐ์์ ์ฐ๋ ๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ๋๊ธฐํ๋๋ ๊ณผ์ ์ ์ค๋ช ํ์์ค.
Thread ํด๋์ค๋ฅผ ์์ํ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํ์ฉ
- Thread class๋ฅผ ์์
- run()์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๊ตฌํ
- start()๋ก run() ๋ฉ์๋๋ฅผ ํธ์ถ
Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํ์ฉ
- Runnable ์ธํฐํ์ด์ค ๊ตฌํ
- run()์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๊ตฌํ
- Thread(Runnable) ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด start()๋ก run() ๋ฉ์๋๋ฅผ ํธ์ถ
์ฐ๋ ๋๋ฅผ ๋๊ธฐํํ๋ ๊ณผ์ synchronized๋ฅผ ์ด์ฉํด์ ์๊ณ์์ญ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ
-
synchronized ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค. ex) public synchronized void ๋ฉ์๋(){} -> ๋ฌธ์ ์ : ํจ์ ์ ์ฒด์ lock ์ด ๊ฑธ๋ฆฐ๋ค. ํจ์์ synchronized๋ฅผ ๊ฑธ๋ฉด ๊ทธ ํจ์๊ฐ ํฌํจ๋ ํด๋น ๊ฐ์ฒด์ lock์ ๊ฑฐ๋๊ฒ๊ณผ ๊ฐ๋ค.
-
synchronized block์ ์ฌ์ฉํ๋ค. ex) synchronized(this) { ๋๊ธฐํ ํ์ํ ๋ถ๋ถ } -> ํ์ํ block์์๋ง ๋ฝ์ด ๊ฑธ๋ฆฐ๋ค.
hashCode() ๊ฐ์ด ๋ชจ๋ ๊ฐ๋ค๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์? hashcode()์ equls()๋ ์ธ์ ์ฌ์ฉํ๊ณ ์ ์ฌ์ฉํ๋์ง?
-> ์ผ๋ฐ์ ์ผ๋ก hashcode๋ฅผ ์ด์ฉํ์ฌ map์ด๋ set์ ์ ์ฅ๋ ๊ฐ์ ๋น ๋ฅด๊ฒ ๋ถ๋ฌ์ค๋๋ฐ ๊ฐ์ด ๋ชจ๋ ๊ฐ๋ค๋ฉด ์๋ฏธ๊ฐ ์์ด์ง๋ฏ๋ก ์ํ๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์ ๋ค.
hashCode() ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๊ฐ์ฒด์ธ์ง ํ์ธํ๋ Method hashcode()๋ฉ์๋(์ ํํ ๋งํ๋ฉด, Objectํด๋์ค์ hashcode๋ฉ์๋)๋ ๊ฐ ๊ฐ์ฒด์ ๋์๋๋ ๊ณ ์ ํ ์ ์๊ฐ(int)์ ๋ฆฌํดํ๋ค. ์์ธ) String ์ hashcode๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ง๋ฉด hashcode์ ๊ฐ์ด ๊ฐ๋ค.
equals() ๋ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๊ฐ์์ง ํ์ธํ๋ Method
์ผ๋ฐ์ ์ผ๋ก hashcode ์ equals ๋ ์ค๋ฒ๋ผ์ด๋ฉ ํ๊ธฐ ์ ๊น์ง Object ํด๋์ค์์ ์ ์๋ ๊ฒ์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ํด๋์ค๋ฅผ ์๋ก ์ ์ํ์ฌ ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ hashcode ๋ฅผ ์ฌ์ ์ ํด์ฃผ์ด ๊ฐ์ฒด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋น๊ตํ ์ ์๋๋ก ํด์ผํ๋ค.
์๋ฐ์ hashcode ๊ท์ฝ equals(Object)๋ฉ์๋๊ฐ true์ด๋ฉด ๋ ๊ฐ์ฒด์ hashCode ๊ฐ์ ๊ฐ์์ผ ํ๋ค. equals(Object)๋ฉ์๋๊ฐ false์ด๋ฉด ๋ ๊ฐ์ฒด์ hashCode๊ฐ ๊ผญ ๋ค๋ฅผ ํ์๋ ์๋ค. ํ์ง๋ง ์๋ก ๋ค๋ฅธ hashCode ๊ฐ์ด ๋์ค๋ฉด ํด์ ํ ์ด๋ธ(hash table)์ ์ฑ๋ฅ์ด ํฅ์๋ ์ ์๋ค๋ ์ ์ ์ดํดํ๊ณ ์์ด์ผ ํ๋ค.
ํจ๋ฌ๋ดGC, G1GC์ ์ฐจ์ด์ ์ค๋ช ํด์ฃผ์ธ์
SPRING
์คํ๋ง์์ @Transactional์ ์ด๋ป๊ฒ ๋์ํ๋ฉฐ ์ด๋ค ์ต์ ์ด ์๋๊ฐ?
- ์คํ๋ง์์ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
์คํ๋ง์์๋ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋๋ฐ ๊ทธ์ค ์ด๋ ธํ ์ด์ ๋ฐฉ์์ผ๋ก @Transactional์ ์ ์ธํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ, ์ ์ธ์ ํธ๋์ญ์ ์ด๋ผ ๋ถ๋ฅธ๋ค.
ํด๋์ค, ๋ฉ์๋์์ @Transactional ์ด ์ถ๊ฐ๋๋ฉด, ์ด ํด๋์ค์ ํธ๋์ญ์ ๊ธฐ๋ฅ์ด ์ ์ฉ๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
์ด ํ๋ก์ ๊ฐ์ฒด๋ @Transactional์ด ํฌํจ๋ ๋ฉ์๋๊ฐ ํธ์ถ ๋ ๊ฒฝ์ฐ, PlatformTransactionManager๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์์ํ๊ณ , ์ ์ ์ฌ๋ถ์ ๋ฐ๋ผ Commit ๋๋ Rollback ํ๋ค.
๋ค์์ ํธ๋์ญ์ ์ด ๊ฒฝ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์
๋ค์์ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋๋ ์ํฉ์์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฐฉ์์ ์ข ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์๋ฅผ๋ค์ด ํน์ ํธ๋์ญ์ ์ด ์ฒ๋ฆฌ์ค์ด๊ณ ์์ง ์ปค๋ฐ๋์ง ์์๋๋ฐ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ทธ ๋ ์ฝ๋์ ์ ๊ทผํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โถ 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๊ฐ ๊ฐ์ ์ฟผ๋ฆฌ ๋๋ฒ์ ๋ ๋ฆฌ๋ ์ฌ์ด ๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์ด ๋ฒ๋ฆฐ๋ค.
- ์ฆ, ํ ํธ๋์ญ์ ์์ ์ผ์ ๋ฒ์์ ๋ ์ฝ๋๋ฅผ ๋๋ฒ ์ด์ ์ฝ์ ๋ ๋ฐ์ํ๋ ๋ฐ์ดํฐ ๋ถ์ผ์น์ด๋ค.
- ์คํ๋ง ํธ๋์ญ์ ์์ฑ
[ 1. isolation (๊ฒฉ๋ฆฌ์์ค) ]
- ํธ๋์ญ์ ์์ ์ผ๊ด์ฑ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋๋ก ํ๋ ์์ค์ ๋งํ๋ค.
โถ DEFAULT
๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค(๊ธฐ๋ณธ์ค์ , DB์ Isolation Level์ ๋ฐ๋ฆ)
โถ READ_UNCOMMITTED (level 0)
-
์ปค๋ฐ๋์ง ์๋(ํธ๋์ญ์ ์ฒ๋ฆฌ์ค์ธ) ๋ฐ์ดํฐ์ ๋ํ ์ฝ๊ธฐ๋ฅผ ํ์ฉ
-
์ฆ ์ด๋ค ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ B๋ผ๋ ์์ง ์๋ฃ๋์ง ์์(Uncommitted ํน์ Dirty) ๋ฐ์ดํฐ B๋ฅผ ์ฝ์ ์ ์๋ค.
-
Problem1 - Dirty Read ๋ฐ์ ๋ฆฌ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ํด๋น Transaction ๋ ๋ฒจ์ ํ์ฉํ์ง ์์ [ READ_COMMITTED์ SERIALIZABLE๋ง์ด ์ ํฉํ ํธ๋์ญ์ ๋ ๋ฒจ์ ๋๋ค ] ๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๋ค๋ฅธ ์ต์ ๋ค์ ๋ฌธ์ ๋ฐ์ํ์ง ์์.
โถ READ_COMMITTED (level 1)
-
ํธ๋์ญ์ ์ด ์ปค๋ฐ ๋ ํ์ ๋ฐ์ดํฐ๋ง ์ฝ๊ธฐ ํ์ฉ
-
์ด๋ ํ ์ฌ์ฉ์๊ฐ A๋ผ๋ ๋ฐ์ดํฐ๋ฅผ B๋ผ๋ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๋ ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
-
Problem1 - Dirty Read ๋ฐฉ์ง
โถ REPEATABLE_READ (level 2)
-
ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ shared lock์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๋ค๋ฅธ ์ฌ์ฉ์๋ ๊ทธ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
-
์ ํ ํธ๋์ญ์ ์ด ์ฝ์ ๋ฐ์ดํฐ๋ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋ ๋๊น์ง ํํ ํธ๋์ญ์ ์ด ๊ฐฑ์ ํ๊ฑฐ๋ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅ ํ๊ธฐ๋๋ฌธ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์ฟผ๋ฆฌํ์ ๋ ์ผ๊ด์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.
-
Problem2 - Non-Repeatable Read ๋ฐฉ์ง
โถ SERIALIZABLE (level 3)
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ๋ฐ ๋์์ฑ์ ์ํด MVCC(Multi Version Concurrency Control)์ ์ฌ์ฉํ์ง ์์
(MVCC๋ ๋ค์ค ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ํ ๊ธฐ์ ๋ก ๋ฐ์ดํฐ ์กฐํ ์ LOCK์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ์ดํฐ์ ๋ฒ์ ์ ๊ด๋ฆฌํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ๋ฐ ๋์์ฑ์ ๋์ด๋ ๊ธฐ์ )
-
ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ shared lock์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๋ค๋ฅธ ์ฌ์ฉ์๋ ๊ทธ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ฐ ์ ๋ ฅ์ด ๋ถ๊ฐ๋ฅํ๋ค.
-
Problem3 - Phantom Read ๋ฐฉ์ง
(โป ๊ฒฉ๋ฆฌ ์์ค์ด ์ฌ๋ผ๊ฐ ์๋ก ์ฑ๋ฅ ์ ํ์ ์ฐ๋ ค๊ฐ ์์)
์ฌ์ฉ ์)
@Transactional(isolation=Isolation.DEFAULT) public void something (int a) { โฆ }
[ 2. propagation (์ ํ์ต์ ) ]
ํธ๋์ญ์ ๋์ ๋์ค ๋ค๋ฅธ ํธ๋์ญ์ ์ ํธ์ถ(์คํ)ํ๋ ์ํฉ์ด์ ์ ํํ ์ ์๋ ์ต์ ์ด๋ค.
@Transactional์ propagation ์์ฑ์ ํตํด ํผํธ์ถ ํธ๋์ญ์ ์ ์ ์ฅ์์๋ ํธ์ถํ ์ชฝ์ ํธ๋์ญ์ ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์๋ ์๊ณ , ์๋กญ๊ฒ ํธ๋์ญ์ ์ ์์ฑํ ์๋ ์๋ค.
โถ REQUIRED
- ๋ํดํธ ์์ฑ, ๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํํ๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์ ์ด ์์ ๊ฒฝ์ฐ ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ๋ค.
โถ SUPPORTS
- ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ํธ๋์ญ์ ์์ด ์งํํ๊ฒ ๋ง๋ ๋ค.
โถ REQUIRES_NEW
- ๋ถ๋ชจ ํธ๋์ญ์ ์ ๋ฌด์ํ๊ณ ๋ฌด์กฐ๊ฑด ์๋ก์ด ํธ๋์ญ์ ์ด ์์ฑ
โถ MANDATORY
-
REQUIRED์ ๋น์ทํ๊ฒ ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌํ๋ค.
-
๋ฐ๋ฉด์ ํธ๋์ญ์ ์ด ์์๋ ๊ฒ์ด ์์ผ๋ฉด ์๋ก ์์ํ๋ ๋์ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
-
ํผ์์๋ ๋ ๋ฆฝ์ ์ผ๋ก ํธ๋์ญ์ ์ ์งํํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
โถ REQUIRES_NEW
-
ํญ์ ์๋ก์ด ํธ๋์ญ์ ์ ์์ํ๋ค.
-
์ด๋ฏธ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ํธ๋์ญ์ ์ ์ ์ ๋ณด๋ฅ์ํจ๋ค.
โถ NOT_SUPPORTED
-
ํธ๋์ญ์ ์ ์ฌ์ฉํ์ง ์๊ฒ ํ๋ค.
-
์ด๋ฏธ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ๋ณด๋ฅ์ํจ๋ค.
โถ NEVER
- ํธ๋์ญ์ ์ ์ฌ์ฉํ์ง ์๋๋ก ๊ฐ์ ํ๋ค.
-0 ์ด๋ฏธ ์งํ ์ค์ธ ํธ๋์ญ์ ๋ ์กด์ฌํ๋ฉด ์๋๋ค ์๋ค๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
โถ NESTED
-
์ด๋ฏธ ์งํ์ค์ธ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ค์ฒฉ ํธ๋์ญ์ ์ ์์ํ๋ค.
-
์ค์ฒฉ ํธ๋์ญ์ ์ ํธ๋์ญ์ ์์ ๋ค์ ํธ๋์ญ์ ์ ๋ง๋๋ ๊ฒ์ด๋ค.
-
ํ์ง๋ง ๋ ๋ฆฝ์ ์ธ ํธ๋์ญ์ ์ ๋ง๋๋ REQUIRES_NEW์๋ ๋ค๋ฅด๋ค.
์ค์ฒฉ๋ ํธ๋์ญ์ ์ ๋จผ์ ์์๋ ๋ถ๋ชจ ํธ๋์ญ์ ์ ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ์๋ ์ํฅ์ ๋ฐ์ง๋ง ์์ ์ ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ์ ๋ถ๋ชจ ํธ๋๊ฐ์ ์๊ฒ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์ด๋ค ์์ ์ ์งํํ๋ ์ค ๋ก๊ทธ๋ ๊ผญ DB์ ์ ์ฅํด์ผ ํ ๋
์ด ๋ก๊ทธ๋ฅผ ์ ์ฅํ๋ ์์ ์ด ์คํจํ๋ค๊ณ ๋ฉ์ธ ์์ ์ ํธ๋์ญ์ ๊น์ง๋ ๋กค๋ฐฑ๋๋ฒ๋ฆฐ๋ค๋ฉด ํนํ ์ผํ๋ชฐ์์ ๊ณ ๊ฐ ์ฃผ๋ฌธ์์ ๋ฑ์ ๊ฒฝ์ฐ ๋งค์ถ ํ๋ฝ๊น์ง๋ ๋ฐ์ํ ์ ์๋ ์ค์ํ ๋ฌธ์ ์ด๋ค.
๋ฐ๋๋ก ๋ก๊ทธ๋ฅผ ๋จ๊ธด ํ ๋ฉ์ธ ์์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋๋ ์ ์ฅํ ๋ก๊ทธ๋ ๋กค๋ฐฑ ๋์ด์ผ ํ๋๊ฒ ๋ง๋ค.
์ด๋ด ๋ ๋ก๊ทธ ์์ ์ ๋ฉ์ธ ํธ๋์ญ์ ์์ ๋ถ๋ฆฌํด์ ์ค์ฒฉ ํธ๋์ญ์ ์ผ๋ก ๋ง๋ค์ด ๋๋ฉด ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ฌธ์ ๋์ฑ ๋ Business ๋ก์ง์ ์ ์ง์ค์ผ ํ ๊ฒ์ด๋ค.
์ค์ฒฉ ํธ๋์ญ์ ์ JDBC 3.0 ์คํ์ ์ ์ฅํฌ์ธํธ(savepoint) (ํด๋ฆญ์ ์์ธํ ๋ด์ฉ๋งํฌ) ๋ฅผ ์ง์ํ๋ ๋๋ผ์ด๋ฒ์ DataSourceTransactionManager ๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ์ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
[ 3. readOnly ์์ฑ ]
-
ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ ์ ์๋ค.
-
์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ฌ์ฉํ ์๋ ์๊ณ ํน์ ํธ๋์ญ์ ์์ ์์์ ์ฐ๊ธฐ ์์ ์ด ์ผ์ด๋๋ ๊ฒ์ ์๋์ ์ผ๋ก ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ ์๋ ์๋ค.
-
์ผ๋ถ ํธ๋์ญ์ ๋งค๋์ ์ ๊ฒฝ์ฐ ์ฝ๊ธฐ์ ์ฉ ์์ฑ์ ๋ฌด์ํ๊ณ ์ฐ๊ธฐ ์์ ์ ํ์ฉํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํ๋ค.
-
์ผ๋ฐ์ ์ผ๋ก ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ด ์์๋ ์ดํ INSERT, UPDATE, DELETE ๊ฐ์ ์ฐ๊ธฐ ์์ ์ด ์งํ๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.
-
aop/tx ์คํค๋ง๋ก ํธ๋์ญ์ ์ ์ธ์ ํ ๋๋ ์ด๋ฆ ํจํด์ ์ด์ฉํด ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ผ๋ก ๋ง๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ณดํต get์ด๋ find ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฝ๊ธฐ์ ์ฉ์ผ๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๋ค.
-
@Transactional ์ ๊ฒฝ์ฐ๋ ๊ฐ ๋ฉ์๋์ ์ผ์ผ์ด ์ฝ๊ธฐ ์ ์ฉ ์ง์ ์ ํด์ค์ผ ํ๋ค.
read-only ์ ํธ๋ฆฌ๋ทฐํธ ๋๋ readOnly ์จ๋ฆฌ๋จผํธ๋ก ์ง์ ํ๋ค.
true์ธ ๊ฒฝ์ฐ insert, update, delete ์คํ ์ ์์ธ ๋ฐ์, ๊ธฐ๋ณธ ์ค์ ์ false
ex)
@Transactional(readOnly = true)
[ 4. ํธ๋์ญ์ ๋กค๋ฐฑ ์์ธ
(rollback-for, rollbackFor, rollbackForClassName) ]
=
-
์ ์ธ์ ํธ๋์ญ์ ์์๋ ๋ฐํ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑํ๋ค.
-
๋ฐ๋ฉด์ ์์ธ๊ฐ ์ ํ ๋ฐ์ํ์ง ์๊ฑฐ๋ ์ฒดํฌ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ปค๋ฐํ๋ค.
์ฒดํฌ ์์ธ๋ฅผ ์ปค๋ฐ ๋์์ผ๋ก ์ผ์ ์ด์ ๋ ์ฒดํฌ ์์ธ๊ฐ ์์ธ์ ์ธ ์ํฉ์์ ์ฌ์ฉ๋๊ธฐ๋ณด๋ค๋ ๋ฆฌํด ๊ฐ์ ๋์ ํด์ ๋น์ฆ๋์ค์ ์ธ ์๋ฏธ๋ฅผ ๋ด์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋ ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค.
-
์คํ๋ง์์๋ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ ์์ธ๋ ๋ฐํ์ ์์ธ๋ก ์ ํ๋ผ์ ๋์ ธ์ง๋ฏ๋ก ๋ฐํ์ ์์ธ๋ง ๋กค๋ฐฑ ๋์์ผ๋ก ์ผ์ ๊ฒ์ด๋ค.
-
ํ์ง๋ง ๊ธฐ๋ณธ ๋์๋ฐฉ์์ ๋ฐ๊ฟ ์๋ ์๋ค.
ex ) ์ฒดํฌ ์์ธ์ง๋ง ๋กค๋ฐฑ ๋์์ผ๋ก ์ผ์์ผ ํ๋ ๊ฒ์ด ์๋ค๋ฉด XML์ rolback-for ์ ํธ๋ฆฌ๋ทฐํธ๋ ์ ๋ ธํ ์ด์ ์ rollbackFor ๋๋ rollbackForClassName ์จ๋ฆฌ๋จผํธ๋ฅผ ์ด์ฉํด์ ์์ธ๋ฅผ ์ง์ ํ๋ฉด ๋๋ค.
rollback-for ๋ rollbackForClassName ์ ์์ธ ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ๋๊ณ , rollbackFor ๋ ์์ธ ํด๋์ค๋ฅผ ์ง์ ๋ฃ๋๋ค.
- @Transactional ์์๋ ๋ค์๊ณผ ๊ฐ์ด ํด๋์ค ์ด๋ฆ ๋์ ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํด๋ ๋๋ค.
@Transactional(readOnly=true, rollbackFor=NoSuchMemberException.class)
โถ rollbackFor ์์ฑ
ํน์ ์์ธ๊ฐ ๋ฐ์ ์ ๊ฐ์ ๋ก Rollback
์ค์ ์: @Transactional(rollbackFor=Exception.class)
โถ noRollbackFor ์์ฑ
ํน์ ์์ธ์ ๋ฐ์ ์ Rollback ์ฒ๋ฆฌ๋์ง ์์
์ค์ ์: @Transactional(noRollbackFor=Exception.class)
[ 5. timeout ์์ฑ ]
์ง์ ํ ์๊ฐ ๋ด์ ํด๋น ๋ฉ์๋ ์ํ์ด ์๋ฃ๋์ด ์์ ๊ฒฝ์ฐ rollback ์ํ. -1์ผ ๊ฒฝ์ฐ no timeout(Default=-1)
ex) @Transactional(timeout=10)
์ถ์ฒ: https://goddaehee.tistory.com/167 [๊ฐ๋ํฌ์ ์์๊ณต๊ฐ]
์คํ๋ง์์ ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ํด ์ค๋ช ํด๋ณด์ธ์.
-
์ธ์ฆ(Authentication) : ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋์์ ๋ํด ์ด ์ ์ ๊ฐ ๋๊ตฌ์ธ์ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์ํํด๋ ๋๋ ์ฃผ์ฒด์ธ์ง ํ์ธํ๋ ๊ณผ์ (ex. Form ๊ธฐ๋ฐ Login)
-
์ธ๊ฐ(Authorize) : ํด๋น ๋ฆฌ์์ค์ ๋ํด ์ ๊ทผ ๊ฐ๋ฅํ ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ๋ ๊ณผ์ (After Authentication, ์ธ์ฆ ์ดํ)
์คํ๋ง ์ํ๋ฆฌํฐ๋? (๊ณต๋ถํ์!!!) ์คํ๋ง ์ํ๋ฆฌํฐ๋ ์คํ๋ง ๊ธฐ๋ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ณด์(์ธ์ฆ๊ณผ ๊ถํ)์ ๋ด๋นํ๋ ํ๋ ์์ํฌ์ด๋ค. ๋ง์ฝ ์คํ๋ง์ํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ง ์์๋ค๋ฉด, ์์ฒด์ ์ผ๋ก ์ธ์ ์ ์ฒดํฌํ๊ณ redirect ๋ฑ์ ํด์ผํ ๊ฒ์ด๋ค. ์คํ๋ง ์ํ๋ฆฌํฐ๋ ๋ณด์๊ณผ ๊ด๋ จํด์ ์ฒด๊ณ์ ์ผ๋ก ๋ง์ ์ต์ ๋ค๋ก ์ด๋ฅผ ์ง์ํด์ค๋ค. spring security๋ filter ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ spring MVC ์ ๋ถ๋ฆฌ๋์ด ๊ด๋ฆฌ ๋ฐ ๋์ํ๋ค. ์ฐธ๊ณ ๋ก security 3.2๋ถํฐ๋ XML๋ก ์ค์ ํ์ง ์๊ณ ๋ ์๋ฐ bean ์ค์ ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ค์ ํ ์ ์๋๋ก ์ง์ํ๋ค.
์๋ฃ์ฐธ๊ณ : ์คํ๋ง ์ํ๋ฆฌํฐ -> https://sjh836.tistory.com/165
Database / SQL
SQL์ HINT๋ฅผ ์ค๋ช ํด์ฃผ์ธ์.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์์ ๋ค์ํ SQL ๊ตฌํ์ฒด๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ฟผ๋ฆฌ ์คํ ๋ฐฉ๋ฒ์ ์ง์ํ๋ SQL ํ์ค์ ์ถ๊ฐ๋ถ์ผ๋ก์ ํํธ(hint)๋ฅผ ์ฌ์ฉํ๋ค. SQL ํ๋์์ ๋ง์ด ์ฌ์ฉ๋๋ค.
์ฌ์ฉ์์ -> SQL>SELECT /*+ hint ๋ด์ฉ */
ํํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ๊ฒฝ๋ก, ์กฐ์ธ ์์, ๋ณ๋ ฌ ๋ฐ ์ง๋ ฌ ์ฒ๋ฆฌ, Optimizer์ ๋ชฉํ(Goal)๋ฅผ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค. ๋ฐ์ดํฐ ๊ฐ์ ์ ๋ ฌํด์ผ ํ๋ ๊ฒฝ์ฐ, ํํธ์ ์ฌ์ฉ์ด ํ์ํ๋ค. ๋ํ, ๋๋ผ์ด๋น ํ ์ด๋ธ์ ์ํ๋ ๋๋ก ์ ์ ํ๊ณ ์ ํ ๋๋ ์ฌ์ฉ๋๋ค.
memcached๋ณด๋ค redis์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์ ์?
Redis(Remote Dictionary Storage, ๋ ๋์ค)์ Memcached(๋งด์บ์๋)๋ ์ ๋ช ํ ์คํ์์ค์ธ, ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ์ ์ฅ์์ด๋ค. ๋งด์บ์ฌ๋๋ ๋ช ๋ฃํ๊ณ ๋จ์ํจ์ ์ํ์ฌ ๊ฐ๋ฐ๋ ๋ฐ๋ฉด, ๋ ๋์ค๋ ๋ค์ํ ์ฉ๋์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ง์ ํน์ง์ ๊ฐ์ง๊ณ ๊ฐ๋ฐ๋์๋ค.
๊ณตํต์
- 1ms ์ดํ์ ์๋ต๋๊ธฐ์๊ฐ 1ms ์ดํ์ ์๋ต์๊ฐ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ๋์คํฌ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. 2.๊ฐ๋ฐ์ ์ฉ์ด์ฑ ๋ฌธ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ๊ฐ๋ฐ์ฝ๋ ์ ๋ํ ์ ์ต๋๋ค.
- ๋ฐ์ดํฐ ํํฐ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐํ์ฌ ์ ์ฅ์ํฌ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์๊ฐ ์ฆ๊ฐํ ๋ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ์ฌ ์ค์ผ์ผ์์์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ง์ ์ฌ๋ฌ ๊ฐ๋ฐ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฐ, ํ์ด์ฌ, C, C++, C#, JavaScript, Node.Js, Ruby, Go ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ธ์ด๋ค์ ์ง์ํฉ๋๋ค.
Memcached๋ง ์ ํน์ง
๋ฉํฐ์ค๋ ๋๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์, ๋ฉํฐํ๋ก์ธ์ค์ฝ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ์ค์ผ์ผ์ ์ ํตํ์ฌ ๋์ฑ ๋ง์ ์์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
Redis๋ง ์ ํน์ง
- ๋์ฑ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฌธ์์ด ๋ฟ๋ง ์๋๋ผ List, Set, ์ ๋ ฌ๋ Set, Hash, Bit ๋ฐฐ์ด, hyperloglogs (๋งค์ฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์งํฉ์ ๊ฐ์๋ฅผ ์ถ์ ํ ์ ์๋ ๋ฐฉ๋ฒ)์ ์ง์ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์์ ์์ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Sorted Set์ ํ์ฉํ์ฌ ๊ฒ์์ ์ ์ ์์๋ญํฌ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ ๊ณตํ ์ ์์ต๋๋ค.
- Snapshots ๋ ๋์ค๋ ํน์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅํ์ฌ ํ์ผ ๋ณด๊ด์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ํ, ์ฅ์ ์ํฉ์ ๋ณต๊ตฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ณต์ Master โ Salves ๊ตฌ์กฐ๋ก, ์ฌ๋ฌ๊ฐ์ ๋ณต์ ๋ณธ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ๊ธฐ๋ฅผ ํ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ๊ฐ์ฉ์ฑ(์ค๋ ์๊ฐ๋์ ๊ณ ์ฅ๋์ง ์์) ํด๋ฌ์คํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค
- ํธ๋์ ์ ํธ๋ ์ ์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ์์ ๋จ์๋ฅผ ์๋ฏธํ๊ณ , ์์์ฑ, ์ผ๊ด์ฑ, ๋ ๋ฆฝ์ฑ, ์ง์์ฑ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Redis๋ ์ด๋ฌํ ํน์ง์ ์ง์ํฉ๋๋ค.
- Pub / Sub messaging Publish(๋ฐํ)๊ณผ Sub(๊ตฌ๋ )๋ฐฉ์์ ๋ฉ์์ง๋ฅผ ํจํด ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ ์ฑ๋ฅ์ ์๊ตฌํ๋ ์ฑํ , ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ, SNS ํผ๋ ๊ทธ๋ฆฌ๊ณ ์๋ฒ์ํธํต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฃจ์ ์คํฌ๋ฆฝํธ ์ง์ ๋งค์ฐ ๊ฒฝ๋ํ๋ ์ ์ฐจ์คํฌ๋ฆฝํธ ์ธ์ด์ธ ๋ฃจ์๋ฅผ ์ง์ํฉ๋๋ค. eval ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจ์์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํฌ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ํ๋ก๊ทธ๋จ์ ๋ช ๋ฃํ๊ฒํ๊ณ ์ฑ๋ฅ์ ๋์ผ ์ ์์ต๋๋ค.
- ์์น๊ธฐ๋ฐ ๋ฐ์ดํฐ ํ์ ์ง์ Redis๋ ์ค์๊ฐ ์์น๊ธฐ๋ฐ๋ฐ์ดํฐ๋ฅผ ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์, ๋ ์์น์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๊ฑฐ๋, ์ฌ์ด์ ์๋ ์์ ์ฐพ๊ธฐ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ๋ง์ง, ๊ธธ์ฐพ๊ธฐ ๊ทธ๋ฆฌ๊ณ ์ง๋๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ฃผ์์ ์์ ํน์ง๋ง ๋ณด๋ฉด, ๋ชจ๋ ์ํฉ์์ Redis๋ฅผ ์ ํํด์ผํ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง, Redis๋ ์ฑ๊ธ ์ฐ๋ ๋์ด๊ธฐ ๋๋ฌธ์, 1๋ฒ์ 1๊ฐ์ ๋ช ๋ น์ด๋ง ์คํํ ์ ์์ต๋๋ค. Keys(์ ์ฅ๋ ๋ชจ๋ ํค๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ช ๋ น์ด)๋ flushall(๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ )๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ๋, ๋งด์บ์ฌ๋์ ๊ฒฝ์ฐ 1ms์ ๋ ์์๋์ง๋ง, ๋ ๋์ค์ ๊ฒฝ์ฐ 100๋ง๊ฑด์ ๋ฐ์ดํฐ ๊ธฐ์ค 1์ด๋ก ์์ฒญ๋ ์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ํ, RDB ์์ (ํน์ ๊ฐ๊ฒฉ๋ง๋ค ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅ)์ด ๋งค์ฐ ์ค๋๊ฑธ๋ฆฝ๋๋ค. AWS, 60๊ธฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ์ค์ผ๋ก 10๋ถ์ด๋ ์์๋ฉ๋๋ค. Redis ์ฅ์ ์ ์์ธ์ ๋๋ถ๋ถ์ด ํด๋น ๊ธฐ๋ฅ ๋๋ฌธ์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผํฉ๋๋ค.
์ฐธ๊ณ : https://medium.com/@chrisjune_13837/redis-vs-memcached-10e796ddd717
์ถ๊ฐ - Spring์ด Redis๋ฅผ ์ ํํ ์ด์ : https://deveric.tistory.com/65
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค (Isolation Level) ์ ๋ํด์ ์ค๋ช ํ์ธ์.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค(isolation level)์ด๋ ๋์์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ฒ๋ฆฌ๋ ๋, ํธ๋์ญ์ ๋ผ๋ฆฌ ์ผ๋ง๋ ์๋ก ๊ณ ๋ฆฝ๋์ด ์๋์ง๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด๋ค.
๊ฒฉ๋ฆฌ์์ค์ ํฌ๊ฒ ์๋์ 4๊ฐ๋ก ๋๋๋ค.
- READ UNCOMMITTED
๊ฐ ํธ๋์ญ์ ์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT์ด๋ ROLLBACK ์ฌ๋ถ์ ์๊ด ์์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๊ฐ์ ์ฝ์ ์ ์๋ค. ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง์ ๊ฒฉ๋ฆฌ ์์ค์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๊ถ์ฅํ๋ค. DIRTY READํ์ ๋ฐ์ ํธ๋์ญ์ ์ด ์์ ์ด ์๋ฃ๋์ง ์์๋๋ฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๊ฒ ๋๋ ํ์
- READ COMMITTED
RDB์์ ๋๋ถ๋ถ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. Dirty Read์ ๊ฐ์ ํ์์ ๋ฐ์ํ์ง ์๋๋ค. ์ค์ ํ ์ด๋ธ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ Undo ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋๊ฐ์ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ REPEATABLE READ์ ์ ํฉ์ฑ์ ์ด๊ธ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ์ฃผ๋ก ์ ๊ธ, ์ถ๊ธ ์ฒ๋ฆฌ๊ฐ ์งํ๋๋ ๊ธ์ ์ ์ธ ์ฒ๋ฆฌ์์ ์ฃผ๋ก ๋ฐ์ํ๋ค. ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ๊นจ์ง๊ณ , ๋ฒ๊ทธ๋ ์ฐพ๊ธฐ ์ด๋ ค์ ์ง๋ค.
- REPEATABLE READ
MySQL์์๋ ํธ๋์ญ์ ๋ง๋ค ํธ๋์ญ์ ID๋ฅผ ๋ถ์ฌํ์ฌ ํธ๋์ญ์ ID๋ณด๋ค ์์ ํธ๋์ญ์ ๋ฒํธ์์ ๋ณ๊ฒฝํ ๊ฒ๋ง ์ฝ๊ฒ ๋๋ค. Undo ๊ณต๊ฐ์ ๋ฐฑ์ ํด๋๊ณ ์ค์ ๋ ์ฝ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ค. ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ ๋ถํ์ํ๋ค๊ณ ํ๋จํ๋ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํ๋ค. Undo์ ๋ฐฑ์ ๋ ๋ ์ฝ๋๊ฐ ๋ง์์ง๋ฉด MySQL ์๋ฒ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ๋ฐฉ์์ MVCC(Multi Version Concurrency Control)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
PHANTOM READ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํํ ๋ณ๊ฒฝ ์์ ์ ์ํด ๋ ์ฝ๋๊ฐ ๋ณด์๋ค๊ฐ ์ ๋ณด์๋ค๊ฐ ํ๋ ํ์ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ฐ๊ธฐ ์ ๊ธ์ ๊ฑธ์ด์ผ ํ๋ค.
- SERIALIZABLE
๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ ์์ค์ด์ง๋ง ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค ์ฑ๋ฅ ์ธก๋ฉด์์๋ ๋์ ์ฒ๋ฆฌ์ฑ๋ฅ์ด ๊ฐ์ฅ ๋ฎ๋ค. SERIALIZABLE์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.ํ์ง๋ง.. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋๋ค.