Spring Data JPA


<aside> πŸ’‘ * Transaction 은 DB μ—μ„œ μƒνƒœλ₯Ό λ³€ν™˜μ‹œν‚€λŠ” μž‘μ—…μ˜ μͺΌκ°€ 수 μ—†λŠ”(Atomicity) 논리적 λ‹¨μœ„μ΄λ©° ν•˜λ‚˜μ˜ transaction 은 commit λ˜λŠ” rollback λœλ‹€.

</aside>

Transaction(ACID)

이둠적으둜 Database μ‹œμŠ€ν…œμ€ 각각의 Transaction 에 λŒ€ν•΄

Atomicity(μ›μžμ„±), Consistency(일관성), Isolation(고립성), Durability(μ˜κ΅¬μ„±)을 보μž₯ν•œλ‹€.

  1. Atomicity : λ‚΄(-10)κ°€ λˆ„κ΅°κ°€(+10)μ—κ²Œ μ†‘κΈˆμ„ ν–ˆμ„ 경우 이 μ€‘μ—μ„œ -10 λ˜λŠ” +10 λ‘˜μ€‘ ν•˜λ‚˜λ§Œ μ²˜λ¦¬λœλ‹€λ©΄ Atomicity μœ„λ°˜μ΄λ‹€.
  2. Consistency: κΈ°μ‘΄ database κ°€ correct state() 라면 transaction 을 μˆ˜ν–‰ν•˜κ³  λ‚œ 후도 correct stateμ—¬μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄, λ§Œμ•½ μ΅œλŒ€ length κ°€ 255 일 경우, transaction 은 이λ₯Ό λ§Œμ‘±ν•΄μ•Ό ν•˜λ©°, 이λ₯Ό μœ„λ°˜ν•˜λŠ” transaction 이 μžˆλ‹€λ©΄ κ±°λΆ€ν•΄μ•Όν•œλ‹€.
  3. Isolation: ν•˜λ‚˜μ˜ transaction 이 μˆ˜ν–‰λ˜λŠ” λ™μ•ˆ 쀑간 κ²°κ³Όλ₯Ό λ‹€λ₯Έ transaction 이 μ ‘κ·Όν•  수 μ—†λ‹€(Locking)
  4. Durability: commit 된 transaction 은 database 에 영ꡬ적으둜 λ³΄μ‘΄λ˜μ–΄μ•Ό ν•œλ‹€. 쀑간에 exception 이 λ°œμƒ ν•  경우, Atomicity 원칙에 따라 Rollback λœλ‹€.

Dirty checking

JPA 의 EntityManager κ°€ ν™œμ„±ν™”λœ μƒνƒœ(Spring Data JPA λŠ” default κ°’μž„)둜 Transaction μ•ˆμ—μ„œ DB 의 데이터λ₯Ό κ°€μ Έμ˜€λ©΄ 이 λ°μ΄ν„°λŠ” Persistence(μ˜μ†μ„±)이 μœ μ§€λœ μƒνƒœκ°€ λœλ‹€.(Persistence μƒνƒœκ°€ λœλ‹€κ³  ν•΄μ„œ λ°”λ‘œ Commit 이 λ˜λŠ”κ±΄ μ•„λ‹ˆλ‹€.)

이 μƒνƒœμ—μ„œ ν•΄λ‹Ή λ°μ΄ν„°μ˜ 값을 λ³€κ²½ν•˜λ©΄ JPA 에 Persistence context 에 값이 μ—…λ°μ΄νŠΈ 되고 transaction 이 λλ‚˜λŠ” μ‹œμ μ— 에 λ³€κ²½λœ 사항을 Commit ν•œλ‹€.

Entity object 의 κ°’λ§Œ λ³€κ²½ν•œλ‹€λ©΄ Update query λ₯Ό 보내지 μ•Šμ•„λ„ λœλ‹€.

@Transactional

@Transactional 은 Exception 이 λ°œμƒν•˜λ©΄ rollback 을 μ‹œν‚€κ³ , 잘 μž‘λ™ν•œ 경우 commit 을 ν•œλ‹€.

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ μ •ν™•ν•˜κ²Œ 짚고 λ„˜μ–΄κ°€λ©΄ λͺ¨λ“  Exception νƒ€μž…μ΄ μ•„λ‹ŒΒ UnCheckedException만 rollback을 μ‹œν‚¨λ‹€.