๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JPA

ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ฑŒ๋ฆฐ์ง€ 7์ผ์ฐจ - ํŠธ๋žœ์žญ์…˜ @Transactional

๐Ÿ“Œ ํŠธ๋žœ์žญ์…˜

โœ”๏ธ ACID

  • [A] Atomicity ์›์ž์„ฑ
  • [C] Consistency ์ผ๊ด€์„ฑ
  • [I] Isolation ๋…๋ฆฝ์„ฑ
  • [D] Durability ์ง€์†์„ฑ

โœ”๏ธ Transactional

  • ๋ฉ”์„œ๋“œ or ํด๋ž˜์Šค์— ์„ค์ •์‹œ ๋ฉ”์„œ๋“œ์˜ ์‹œ์ž‘๊ณผ ๋์ด ํŠธ๋žœ์žญ์…˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋œ๋‹ค.
  • ๋ฉ”์„œ๋“œ ๋‚ด DML๋ช…๋ น ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ๋“ค์„ ํ•œ ๊ฐœ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์–ด์ค€๋‹ค.

โœ”๏ธ CheckedException, UncheckedException

CheckedException (์ปดํŒŒ์ผ์—๋Ÿฌ)

  • Exception, IOException, FileNotFoundException ...
  • ํŠธ๋žœ์žญ์…˜ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ๋„ ๋กค๋ฐฑํ•˜์ง€ ์•Š์Œ (์ปค๋ฐ‹๊นŒ์ง€ ๋ชจ๋‘ ์ˆ˜ํ–‰)
  • ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ•„์š”
    (try-catch or throw or throws)

UncheckedException (๋Ÿฐํƒ€์ž„์—๋Ÿฌ)

  • RunTimeException, NullPointerException, IndexOutOf~
  • ํŠธ๋žœ์žญ์…˜ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ๋กค๋ฐฑ ์ˆ˜ํ–‰

โœ”๏ธ CheckedException์— ๋Œ€ํ•ด ๋ช…์‹œ์  Rollback ์ˆ˜ํ–‰

@Transactional - rollbackFor()

ex)
@Transactional(rollbackFor = Exception.class)

  • ๋ช…์‹œ์ ์œผ๋กœ CheckException์ธ Exception์— ๋Œ€ํ•ด ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •

โœ”๏ธ private ๋ฉ”์„œ๋“œ์—์„œ @Transactional ์‚ฌ์šฉ

private์œผ๋กœ ์ง€์ •๋œ ๋ฉ”์„œ๋“œ์—์„œ @Transactional ์‚ฌ์šฉ์‹œ UncheckedException์ด ๋ฐœ์ƒํ•˜์—ฌ๋„ ๋กค๋ฐฑ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
(๋งˆ์น˜ @Transactional์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Œ)

public void call() {
    this.realMethod();
}

@Transactional
private void realMethod() {

    // ...ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ... //
    throw new RuntimeException();
}
  • ๋ช…์‹œ์ ์œผ๋กœ UncheckedException์„ ๋ฐฉ์ƒ์‹œ์ผฐ์ง€๋งŒ ๋กค๋ฐฑ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ
  • call()์—์„œ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์˜ ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ฌด์‹œ๋จ
  • public์ด์—ฌ๋„ ๋ฌด์‹œ๋จ
  • ์‹ค์ˆ˜์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์กฐ์‹ฌ
  • @Transactional ์–ด๋…ธํ…Œ์ด์…˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์–ด๋…ธํ…Œ์ด์…˜์— ์ ์šฉ๋จ

โœ”๏ธ @Transactional - isiolation

  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€
  • default: DEFAULT (DB์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ ๋”ฐ๋ผ๊ฐ)
    MySQL์˜ ๊ฒฝ์šฐ default: REPEATABLE_READ

READ_UNCOMMITTED (Level 1)

  • ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์„ ํ—ˆ์šฉ
  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์—…๋ฐ์ดํŠธ ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ปค๋ฐ‹ ์ „์ด์–ด๋„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์—…๋ฐ์ดํŠธ ๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ปค๋ฐ‹์ „ ์—…๋ฐ์ดํ„ฐ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ํ•ด๋‹น ์—…๋ฐ์ดํŠธ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐธ๋œ๋‹ค๋ฉด ์—…๋ฐ์ดํŠธ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ํŠธ๋žœ์žญ์…˜์€ ๋กค๋ฐฑ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง (update์˜ค๋ฅ˜)
  • insert์—์„œ๋„ ๋™์ผํ•œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    ๐Ÿ‘ฟ Dirty Read

READ_COMMITTED (Level 2)

  • ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์กฐํšŒ๋ฅผ ํ—ˆ์šฉ
  • AํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹ ์—ฌ๋ถ€์— ๋”ฐ๋ผ BํŠธ๋žœ์žญ์…˜์ด ์ฝ๋Š” ๊ฐ’์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
    ์ฆ‰, BํŠธ๋žœ์žญ์…˜ ๋™์•ˆ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ
    ๐Ÿ‘ฟ Non-repeatable Read ๋ฐœ์ƒ ๊ฐ€๋Šฅ

REPEATABLE_READ (Level 3)

  • ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ํ›„ ํ•œ ๋ฒˆ ์กฐํšŒ๋œ ๊ฐ’์ด ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์กฐํšŒ๋œ๋‹ค.
    ์ฆ‰, ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ „ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ
  • ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ์‹œ ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜ ๋™์•ˆ์€ ์Šค๋ƒ…์ƒท๋งŒ์„ ์‚ฌ์šฉ
    ๐Ÿ‘ฟ Phantom Read ๋ฐœ์ƒ ๊ฐ€๋Šฅ

SERIALIZABLE (Level 4)

  • ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์กฐํšŒ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•œ ์ˆ˜์ •/์‚ญ์ œ/์‚ฝ์ž…์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ ˆ๋ฒจ์ด ๋†’์•„์งˆ์ˆ˜๋ก ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๐Ÿ‘†, ๋™์‹œ์„ฑ ๐Ÿ‘‡

โœ”๏ธ @Transactional - propagation

  • ํŠธ๋žœ์žญ์…˜์˜ ์ „ํŒŒ

REQUIRED (default)

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉ
    ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑ

REQUIRES_NEW

  • ๊ฐ๊ฐ ์ž์‹ ์˜ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉ. ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์žˆ์–ด๋„ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑ

NESTED

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋“ฑ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉ
  • but, ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋กค๋ฐฑ๋˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์€ ๊ทธ๋Œ€๋กœ ์ปค๋ฐ‹๋จ
     ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ๊นŒ์ง€ ๋กค๋ฐฑ๋จ  

SUPPORTS

  • ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์˜ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ (์žฌํ™œ์šฉ)
  • ํŠธ๋žœ์žญ์…˜์ด ์—†๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์ˆ˜ํ–‰

NOT_SUPPORTED

  • ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์˜ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ๋ฉˆ์ถ”๊ณ  ํ˜ธ์ถœ๋œ
    ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ (ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ˆ˜ํ–‰)

MANDATORY

  • ํŠธ๋žœ์žญ์…˜์„ ํ•„์ˆ˜๋กœ ์š”๊ตฌ
  • ํŠธ๋žœ์žญ์…˜์ด ์—†๋‹ค๋ฉด ์˜ค๋ฅ˜ (ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ)

NEVER

  • ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์•ˆ๋จ
  • ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๋ฉด ์˜ค๋ฅ˜

๐Ÿ‘  ์ˆ˜๊ฐ•์ธ์ฆ

 

 

 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.