๐ ๋ฐฐ์ด ๊ฒ
DB ํธ๋์ญ์ ์ ๋ํ์ฌ
์ฝ๋ ์ค์ฟผ๋ ํธ๋ ์ค์ ๋ง์คํฐ ์๊ฐ์ DB ํธ๋์ญ์ ์ ๋ํด ๋ฐฐ์ ๋ค. ๋ฌด์ฒ ๊ฐ์ง ์๊ฐ์ด์๋ค.
Jim Gray ์๊ฐ
Jim Gray๋ DB ๋ฐ์ ์ ํฐ ๊ธฐ์ฌ๋ฅผ ํ๋ค. ์ธ๊ณ ์ต์ด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ System-R์ ๊ฐ๋ฐํ๋ค. ํธ๋์ญ์ , 2 Phase Locking, Granularity Locking ๊ฐ๋ ์ ์ ์ํ๊ณ 1992๋ ๋ช ์ "ํธ๋์ญ์ ์ฒ๋ฆฌ: ๊ฐ๋ ๊ณผ ๊ธฐ๋ฒ(Transaction Processing: Concepts and Techniques)" ๋ฅผ ์ผ๋ค.
ํธ๋์ญ์ ์ ์ฑ์ง
A: Atomicity(์์์ฑ) : all or nothing
C: Consistency
I: Isolation
D: Durability
ํธ๋์ญ์ ์ด๋
ํธ๋์ญ์ ์ ์์ ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ค. ์ฌ๋ฌ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ํ๋๋ก ๋ฌถ์ด DB์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋จ์๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์๊ฐ ์ฒ๋ฆฌ ์ฑ๊ณต ๋จ์์ด๊ณ , ์ฒ๋ฆฌํ์ง ๋ชปํ ๊ฒฝ์ฐ ์์ํ๋ก ๋ณต๊ตฌํด ์์ ์ผ๋ถ๋ง ์ ์ฉ๋๋ ํ์์ ๋ง์์ค๋ค. ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅํ๋ค. ํธ๋์ญ์ ์ ๋ฒ์๋ ์ปค๋ฅ์ ๊ธฐ์ค์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
ํธ๋์ญ์ ๊ณผ Serial Schedule
๊ฐ์ฅ ์ฝ๊ฒ ACID ์ฑ์ง์ ์ง์ํ๋ ๋ฐฉ๋ฒ์ ํ ๋ฒ์ ํ๋์ฉ ํธ๋์ญ์ ์คํํ๊ฒ ๋ง๋ ๋ค. ๋ค์ ๋งํด ํ ๋ช ์ ์ ์ ๊ฐ DB๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ ์ฒด DB๋ฅผ ์ ๊ฐ ์๋ฌด๋ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํ๋ค. ํ์ง๋ง ์ฑ๋ฅ์ ๋จ์ด์ง๋ค.
์ ๊ธ(Lock) ์ด๋
๋์์ฑ์ ์ ์ดํ๋ ๊ธฐ๋ฅ์ด๋ค. ์ฌ๋ฌ ์ปค๋ฅ์ ์ด ๋์์ ๋์ผํ ์์์ ์์ฒญํ ๊ฒฝ์ฐ ์์๋๋ก ํ ์์ ์ ํ๋์ ์ปค๋ฅ์ ๋ง ์์์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๋ค. MySQL์ ์๋ก ์ ๊ธ์ MySQL ์์ง ๋ ๋ฒจ(๊ธ๋ก๋ฒ ๋ฝ, ํ ์ด๋ธ ๋ฝ, ๋ค์๋ ๋ฝ), ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ(๋ ์ฝ๋ ๋ฝ, ๊ฐญ ๋ฝ, ๋ฅ์คํธ ํค ๋ฝ ...)์ ์ ๊ธ์ด ์๋ค. ๋ค์ ๋งํด Lock์ ๋ฒ์๋ DB ์ ์ฒด๋ฅผ Lock ํ๊ฑฐ๋ ํ ์ด๋ธ ๋จ์, ๋ ์ฝ๋ ๋จ์๋ก๋ Lock ํ ์ ์๋ค.
Lock ์์ด ํธ๋์ญ์ ์ด ๊ฐ๋ฅํ ๊น?
๊ฐ๋ฅํ๋ค. ๋ง์ฝ ๋ชจ๋ ์ปค๋ฅ์ ์ด ๋ค๋ฅธ ์ปค๋ฅ์ ์ด ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ฉด Lock ์์ด ํธ๋์ญ์ ์ ํ ์ ์๋ค.
Optimistic Concurrency Control(๋๊ด์ ๋์์ฑ ์ ์ด) ๋ฐฉ์์ผ๋ก ํธ๋์ญ์ ์ ๊ตฌ์ฑํ๋ค๋ฉด, ์ฒ์์ ์ ๊ธ ํ์ง ์๋ค๊ฐ ๋์์ฑ ์ ๊ทผ์ ๊ฐ์งํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ ์๊ณ Lock ํ ์ ์๋ค. ๋ฐ๋๋ก Pessimistic Lock(๋น๊ด์ ๋ฝ)์ ํธ๋์ญ์ ์ด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ผ๋จ ๋ฝ์ ๊ฑฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
Race Condition(๊ฒฝ์ ์ํ)
์ฌ๋ฌ ํด๋ผ์ด์ธํธ(์ปค๋ฅ์ )์ด ๊ฐ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ค. ์ด ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ๊ฐ์ฅ ๋จ์ํ๊ฒ ํธ๋์ญ์ ์ ์์๋๋ก ์คํํ์ฌ ๋์์ฑ ์ ๊ทผ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํค์ง ์์ผ๋ฉด ๋๋ค. ํ์ง๋ง ์ฑ๋ฅ์ด ์ข์ง ๋ชปํ๋ค. ๋ฉํฐ ์ ์ ๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ค์ ํด๊ฒฐํด์ผ ํ๋ค.
Transaction์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ค
- Lost Update Problem : ๋ ๊ฐ์ ํธ๋์ญ์ ์ด ๋์์ ํ ์์ดํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ ๋ ๋ฐ์ํ๋ ๋ฌธ์
- Dirty Read Problem : ํ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ ๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ์ ๋ ๋ฐ์ํ๋ ๋ฌธ์
- Non-repeatable Read Problem : ํ ํธ๋์ญ์ ์์ ๊ฐ์ ๊ฐ์ ๋ ๋ฒ ์ฝ์์ ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์ด ์ฝ์ด ๋ฐ์ํ๋ ๋ฌธ์
- Phantom Read Problem : ์ฃผ๋ก ํต๊ณ๋ ๋ถ์, aggregation function ๋ฑ์ ์ํํ๋ ์ฟผ๋ฆฌ์์ ์๋ชป๋ ๊ฐ์ด ๋ฐ์ํ๋ ๋ฌธ์
Transaction Isolation Level
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(isolation level)์ด๋ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์ฒ๋ฆฌ๋ ๋ ํธ๋ ์ญ์ ์ ๊ฒฉ๋ฆฌํ์ฌ ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํฅ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ํ ์ด๋ธ์ ๋ณผ ์ ์๊ฒ ํ์ฉํ ์ง ๋ง์ง ๊ฒฐ์ ํ๋ ์์ค์ด๋ค. ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋๋ค.
- Read Uncommitted : ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ฐ๊พผ ๊ฐ์ด ํธ๋์ญ์ ์ค๊ฐ์๋ ๋ฐ์๋๋ค.
- Read Committed : ์ปค๋ฐ๋ ์์ดํ ๋ง ์ฝ๋๋ค. ์ปค๋ฐ๋์ง ์์ ๊ฐ์ ์ฝ์ ์ ์๋ค. ๊ฐ์ ํธ๋์ญ์ ์์๋ ์ต๊ทผ์ ์ค๋ ์ท์ ์ฝ๋๋ค.
- Repeatable Read : MySQL์ ๊ธฐ๋ณธ ๋์ ๋ชจ๋๋ก ์ฒซ ๋ฒ์งธ ์ฝ๊ธฐ์ ์ค๋ ์ท์ ์์ฑํ๊ณ unique index, seconday index์ ์ ๋ฌด์ ๋ฐ๋ผ ์ ๊ธ ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ง๋ค.
- Serializable : MySQL์์๋ ๋ชจ๋ SELECT๋ฌธ์ ๋ฝ์ด ๊ฑธ๋ฆฐ๋ค.
์ด๋ค ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
์ ๋ต์ด ์๋ค.
ํ์ฌ ์ฃผ์ด์ง ์ํฉ์ ๋ง๊ฒ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ์ ์ฌ์ฉํด์ผ ํ๋ค. DBMS๊ฐ ์ง์ํ๋ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ด ๋ค๋ฅผ ๊ฒ์ด๊ณ ๋น์ฆ๋์ค ๋ชจ๋ธ๋ง๋ค ๋ค๋ฅผ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์ํ ํฐ์ผ ์๋งคํ๋ ๋๋ฉ์ธ์ด ์์ ๋ Repeatable Read๋ก ํ๋ค๋ฉด ์ค๋ณต ํฐ์ผ(์ค๋ฒ๋ถํน)์ด ๋ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ Read Uncommitted๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์ ์๋ค. ๋ํ ํต๊ณ ๊ณ์ฐ์ด ์ค์ํ ๋ก์ง์๋ Serializable์ด ์ข์ ์๋ ์๋ค. ๊ฐ ์ํฉ์ ๊ณ ๋ คํ์ฌ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ํํ์.
JPA๋ฅผ ๋ฐฐ์ฐ๊ธฐ๊น์ง
๊ทธ ๋์ ์ฝ๋ ์ค์ฟผ๋์์ DB ์ ๊ทผ ๊ธฐ์ ์ ์(?) JDBC ๋ถํฐ -> JDBC Template -> Data JDBC -> JPA ์์ผ๋ก ํ์ตํ๊ณ ํ๋ก์ ํธ์ ์ ์ฉํ๊ณ ์๋ค.
JDBC๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์๋ค. ํ์ง๋ง ๋ฐ๋ณต๋ ์ปค๋ฅ์ ๊ด๋ฆฌ์ ๋งคํผ ์์ฑ, ์ฟผ๋ฆฌ์ ๋ถํธํจ์ ๋๋ผ์๋ค.
JDBC Template๋ฅผ ์ฌ์ฉํ๋ฉฐ JDBC์ ๋ฐ๋ณต ์์ (์ปค๋ฅ์ ๊ด๋ฆฌ, ๋งคํผ)์ ๋ณด๋ค ์์ฝ๊ฒ ์ฌ์ฉํ ์ ์์๋ค. ํ์ง๋ง ํ ์ด๋ธ, ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ๋ค ๋ณด๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ด๋ ค์ ๊ณ ์ฌ์ ํ ๋ฐ๋ณต๋ ์ฟผ๋ฆฌ๊ฐ ์ง์๋์๋ค.(๋จ์ ์กฐํ, ์ ๋ฐ์ดํธ)
Data JDBC๋ฅผ ์ฌ์ฉ์ด ๊ฐ์ฅ ์ฌ๋ฏธ์์๋ค. DDD์ aggregate ๊ฐ๋ ์ ๋์ ํ์ฌ ๋๋ฉ์ธ ๋จ์๋ก ์์์ฑ์ ๊ด๋ฆฌํ ์ ์์๋ค. JPA๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์ Data JDBC๋ฅผ ๋ฐฐ์ด ๊ฒ์ ํ์ด์ด์๋ค. ์ฐ๊ด ๊ด๊ณ์ ๋ํด ์๊ฐํด๋ณผ ์ ์์๊ณ N+1 query์ ๋ฌธ์ ์ ๋ค์ ์ ์ ์์๋ค.
JPA : ๋๋์ด ์์ (?)ํ ORM์ด๋ผ๊ณ ํ ์ ์๋ JPA๋ฅผ ๊ณต๋ถํ๊ณ ์๋ค. ๊ทธ๋์ ํ๋ ๊ธฐ์ ๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด ๋ง๋ค. ๊ฐ์ฒด์ ๊ด๊ณํ DB ๋งคํ๊ณผ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ค์ฌ์ผ๋ก ํ์ตํ๋ ค ํ๋ค. ํธํ ๊ธฐ์ ์ธ ๋งํผ ๋ด๋ถ๋ฅผ ์๊ธฐ ์ด๋ ต๊ณ ์๋ชป ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ๋๋น ์ง ์ ์๋ค๋ ๊ฒ์ ์์ง ๋ง์. DB์ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์ ์์์ฑ ์ปจํ ์คํธ ๊ณ์ธต์ ๋ ๊ฒ์ ์ ๋ง ๋๋ผ์ด ์ผ์ด๋ค.
๐ Keep
- ๋ฝ๋ชจ๋๋ก 1์๊ฐ 8ํ์์ผ๋ก ์ง์ค ์๊ฐ์ ๋๋ฆฌ๊ณ ์๋ค.
๐ฅProblem
- ํ๋์ ๋ด์ฉ์ ์ง์คํ๋ค ๋ณด๋ฉด ์ ์ฒด๋ฅผ ๋ณด์ง ๋ชปํ ๋๊ฐ ์๋ค.
๐ Try
- ํด๋น ๊ธฐ์ ์ ์ ์จ์ผํ๋์ง ๋น์์ฑ์ ์ ๊ฒํ๊ณ ์ฒ๊ณผ ๋๋ฌด๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋ณด์.
- ํ ๊ฐ์ง๋ง ํ์ง ๋ง๊ณ ์ปจํ ์คํธ ์ค์์นญํ๋ฉฐ ๊ณต๋ถํ์(DB -> ๋คํธ์ํฌ -> Spring ์ด๋ฐ ์์ผ๋ก)
Reference
ํธ๋ ์ค ๋ง์คํฐ ํด๋์ค : DB ํธ๋์ญ์
์ต๋ฒ๊ท ๋ ์ ํ๋ธ : ํ๋ก๊ทธ๋๋ฐ ์ด์ DB ํธ๋์ญ์ ์กฐ๊ธ ์ดํดํ๊ธฐ
๋๊ธ2