Server๐Ÿงค/JPA

[JPA] ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ - ๋น„๊ด€์  ๋ฝ VS ๋‚™๊ด€์  ๋ฝ

yujindonut 2023. 10. 10. 13:53
728x90

์ด์Šˆ ์ƒํ™ฉ

์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— '๋๋ง์ž‡๊ธฐ' ๊ธฐ๋Šฅ์„ ์ œ๊ณต์ค‘์ด๋‹ค.

์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ๋‘๊ฐœ์˜ ๋‹จ์–ด๊ฐ€ ๋™์‹œ์— ์‚ฝ์ž…๋˜์—ˆ๋‹ค! 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

์šฐ์„  Chatgpt๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๋‹น ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด์•˜๋‹ค.

 

1. ๊ฒฉ๋ฆฌ์ˆ˜์ค€ ์„ค์ •์„ ๊ณ ๋ ค -> ํƒˆ๋ฝ

์šฐ์„  PostgreSQL์—์„œ๋Š” 4๊ฐ€์ง€์˜ Transaction ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋๋ง์ž‡๊ธฐ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ดค์„๋•Œ, ํ•˜๋‚˜์˜ transaction์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„๋•Œ, ๋‹ค๋ฅธ transaction์—์„œ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋„ ์ฝ์–ด์•ผํ•จ. 

Postgresql์€ Read Uncommited๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค! ๊ฒฐ๋ก ์ ์œผ๋กœ DirtyRead๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

2. ๋‚™๊ด€์  ๋ฝ๊ณผ ๋น„๊ด€์  ๋ฝ ๊ณ ๋ คํ•˜๊ธฐ (์˜ค ๊ดœ์ฐฎ๋‹ค!)

๋‚™๊ด€์ ๋ฝ๊ณผ ๋น„๊ด€์ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ค€์€ "๋™์‹œ์— ์ˆ˜์ •์„ ํ•˜๋Š”์ผ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š”๊ฐ€ ?"

๋”๋ณด๊ธฐ

๋น„๊ด€์  ๋ฝ(Pessimistic Lock)

๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์‹œ์ ์—์„œ ๋ฝ(Lock)์„ ๊ฑธ๊ณ , ์กฐํšŒ ๋˜๋Š” ๊ฐฑ์‹  ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. SELECT...FOR UPDATE๋กœ ์กฐํšŒ๋œ ํ•ด๋‹น ๋กœ์šฐ๋Š” ์ž ๊ธˆ์„ ํš๋“ํ•˜์—ฌ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

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

 

๋‚™๊ด€์  ๋ฝ(Optimistic Lock)

์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ๋ฝ์„ ๊ฑธ์ง€ ์•Š๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฝ์„ ๊ฑธ์–ด๋†“์€ ๊ฒฝ์šฐ์—๋Š” ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ ๋ฝ์ด ํ’€๋ฆฌ๋ฉด ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

 

 

์‹ค๋ฌด์—์„œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋ฅผ ๋“ค๋ฉด, ๋‚™๊ด€์  ๋ฝ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ ๋น„์œจ์ด ๋†’์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์‹œ๊ธ€์„ ์ฝ๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‹ค์ˆ˜ ์กด์žฌํ•˜๊ณ , ์“ฐ๊ธฐ ์ž‘์—…์€ ๋น„๊ต์  ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‚™๊ด€์  ๋ฝ์ด ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, ์“ฐ๊ธฐ ์ž‘์—…์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋น„๊ด€์  ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

3. ๋ถ„์‚ฐ ๋ฝ ์‚ฌ์šฉ -> ํƒˆ๋ฝ

๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ„์— ๊ณต์œ ์ž์›์— ๋Œ€ํ•œ ๋™์‹œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์‚ฐ ๋ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. 

๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋Š” ๋ถ„์‚ฐ์‹œ์Šคํ…œ์ด ์•„๋‹ˆ๊ณ  ๋‹จ์ผ ์„œ๋ฒ„์ด๊ธฐ์— ํƒˆ๋ฝ.

 

4. ์บ์‹œ ์‚ฌ์šฉ -> ๋ณด๋ฅ˜

์บ์‹œ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ค‘๋ณต๋‹จ์–ด๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. DB์กฐํšŒ๋ฅผ ์ค„์ด๊ณ , ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•.

HashMap ๋˜๋Š” Redis์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์บ์‹œ๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด๊ธฐ์— Redis์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ๊ณ ๋ ค๋จ. ์บ์‹œ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด์„œ ํ•ด๊ฒฐ์ด ๋  ๋ฌธ์ œ์ธ๊ฐ€?! ์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์šฐ์„  ๋ณด๋ฅ˜

 

๋ฝ(Locking)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation Level) ์„ค์ •์˜ ์žฅ๋‹จ์ 

์ธก๋ฉด ๋ฝ(Locking) ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์„ค์ •
์ œ์–ด ์ •๋„ ๋†’์Œ ๋‚ฎ์Œ
๋ณต์žก์„ฑ ๋†’์Œ ๋‚ฎ์Œ
์„ฑ๋Šฅ ์˜ํ–ฅ ๋†’์Œ (Lock Contention ๊ฐ€๋Šฅ) ๋‚ฎ์Œ
๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ณด์žฅ ๊ฐ€๋Šฅ ๋ณด์žฅ (์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)
๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ (์ ์ ˆํ•œ ๊ด€๋ฆฌ ํ•„์š”) ๋‚ฎ์Œ (์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ์Šคํ…œ์ด ์ฒ˜๋ฆฌ)
๋™์‹œ์„ฑ ์ œ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ์ฒ˜๋ฆฌ
์œ ์—ฐ์„ฑ ๋†’์Œ (ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ) ๋‚ฎ์Œ (์ผ๋ฐ˜์ ์œผ๋กœ ์„ค์ • ๋ณ€๊ฒฝ์œผ๋กœ ์‚ฌ์šฉ)
728x90