week 2 jonghun - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

JAVA

์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋™๊ธฐํ™”๋˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉ

  1. Thread class๋ฅผ ์ƒ์†
  2. run()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ตฌํ˜„
  3. start()๋กœ run() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ

Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉ

  1. Runnable ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
  2. run()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ตฌํ˜„
  3. Thread(Runnable) ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด start()๋กœ run() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ

์“ฐ๋ ˆ๋“œ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ • synchronized๋ฅผ ์ด์šฉํ•ด์„œ ์ž„๊ณ„์˜์—ญ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. synchronized ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค. ex) public synchronized void ๋ฉ”์†Œ๋“œ(){} -> ๋ฌธ์ œ์  : ํ•จ์ˆ˜ ์ „์ฒด์— lock ์ด ๊ฑธ๋ฆฐ๋‹ค. ํ•จ์ˆ˜์— synchronized๋ฅผ ๊ฑธ๋ฉด ๊ทธ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ํ•ด๋‹น ๊ฐ์ฒด์— lock์„ ๊ฑฐ๋Š”๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

  2. 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์™€๋Š” ๋‹ค๋ฅด๋‹ค.

์ค‘์ฒฉ๋œ ํŠธ๋žœ์žญ์…˜์€ ๋จผ์ € ์‹œ์ž‘๋œ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹๊ณผ ๋กค๋ฐฑ์—๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ ์ž์‹ ์˜ ์ปค๋ฐ‹๊ณผ ๋กค๋ฐฑ์€ ๋ถ€๋ชจ ํŠธ๋ž๊ฐœ์…˜์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

  1. ์–ด๋–ค ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ์ค‘ ๋กœ๊ทธ๋Š” ๊ผญ 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(๋งด์บ์‹œ๋“œ)๋Š” ์œ ๋ช…ํ•œ ์˜คํ”ˆ์†Œ์Šค์ธ, ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ด๋‹ค. ๋งด์บ์‰ฌ๋“œ๋Š” ๋ช…๋ฃŒํ•˜๊ณ  ๋‹จ์ˆœํ•จ์„ ์œ„ํ•˜์—ฌ ๊ฐœ๋ฐœ๋œ ๋ฐ˜๋ฉด, ๋ ˆ๋””์Šค๋Š” ๋‹ค์–‘ํ•œ ์šฉ๋„์— ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

๊ณตํ†ต์ 

  1. 1ms ์ดํ•˜์˜ ์‘๋‹ต๋Œ€๊ธฐ์‹œ๊ฐ„ 1ms ์ดํ•˜์˜ ์‘๋‹ต์‹œ๊ฐ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋””์Šคํฌ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2.๊ฐœ๋ฐœ์˜ ์šฉ์ด์„ฑ ๋ฌธ๋ฒ•์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐœ๋ฐœ์ฝ”๋“œ ์–‘ ๋˜ํ•œ ์ ์Šต๋‹ˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…”๋‹ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜์š”๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์Šค์ผ€์ผ์•„์›ƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ง€์› ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”, ํŒŒ์ด์ฌ, C, C++, C#, JavaScript, Node.Js, Ruby, Go ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Memcached๋งŒ ์˜ ํŠน์ง•

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์Šค์ผ€์ผ์—…์„ ํ†ตํ•˜์—ฌ ๋”์šฑ ๋งŽ์€ ์ž‘์—…์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Redis๋งŒ ์˜ ํŠน์ง•

  1. ๋”์šฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฌธ์ž์—ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ List, Set, ์ •๋ ฌ๋œ Set, Hash, Bit ๋ฐฐ์—ด, hyperloglogs (๋งค์šฐ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•)์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—์„œ ์œ„์˜ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Sorted Set์„ ํ™œ์šฉํ•˜์—ฌ ๊ฒŒ์ž„์œ ์ €์˜ ์ƒ์œ„๋žญํฌ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Snapshots ๋ ˆ๋””์Šค๋Š” ํŠน์ •์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜์—ฌ ํŒŒ์ผ ๋ณด๊ด€์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์žฅ์• ์ƒํ™ฉ์‹œ ๋ณต๊ตฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ณต์ œ Master โ€” Salves ๊ตฌ์กฐ๋กœ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฝ๊ธฐ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋†’์€ ๊ฐ€์šฉ์„ฑ(์˜ค๋žœ ์‹œ๊ฐ„๋™์•ˆ ๊ณ ์žฅ๋‚˜์ง€ ์•Š์Œ) ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
  4. ํŠธ๋žœ์ ์…˜ ํŠธ๋ Œ์ ์…˜์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•˜๊ณ , ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๋…๋ฆฝ์„ฑ, ์ง€์†์„ฑ์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Redis๋Š” ์ด๋Ÿฌํ•œ ํŠน์ง•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  5. Pub / Sub messaging Publish(๋ฐœํ–‰)๊ณผ Sub(๊ตฌ๋…)๋ฐฉ์‹์˜ ๋ฉ”์‹œ์ง€๋ฅผ ํŒจํ„ด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋†’์€ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ์ฑ„ํŒ…, ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, SNS ํ”ผ๋“œ ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์ƒํ˜ธํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ ์ง€์› ๋งค์šฐ ๊ฒฝ๋Ÿ‰ํ™”๋œ ์ ˆ์ฐจ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ธ ๋ฃจ์•„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. eval ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจ์•„์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…๋ฃŒํ•˜๊ฒŒํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. ์œ„์น˜๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ง€์› 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๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.ํ•˜์ง€๋งŒ.. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.