๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ํšŒ๊ณ /โœ… 22๋…„ ํšŒ๊ณ 

[์ผ์ผ ํšŒ๊ณ ] 22.05.18 - "DB ํŠธ๋žœ์žญ์…˜, JPA๋ฅผ ๋ฐฐ์šฐ๊ธฐ๊นŒ์ง€"

by kukim 2022. 5. 19.

๐Ÿ“š ๋ฐฐ์šด ๊ฒƒ

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 ํŠธ๋žœ์žญ์…˜ ์กฐ๊ธˆ ์ดํ•ดํ•˜๊ธฐ

์ฑ… Real Mysql : Ch5 ํŠธ๋žœ์žญ์…˜

๋Œ“๊ธ€2