"νΈλμμ λμ΄ λΉ μ Έμλ€ => μ νμ±μ μ΄λ‘νλ"λΌλ λ§μ μ£Όλ‘ νΈλμμ (@Transactional) μ²λ¦¬κ° λΉ μ‘μ λ λ°μ΄ν°μ μΌκ΄μ±κ³Ό 무결μ±μ λν μ°λ €λ₯Ό λνλ΄λ ννμ λλ€. μ΄λ₯Ό μ΄ν΄νλ €λ©΄, νΈλμμ μ κ°λ κ³Ό μ μ΄λ₯Ό μ¬μ©νλμ§μ λν λ°°κ²½μ μλ κ²μ΄ μ€μν©λλ€.
- νΈλμμ μ λ°μ΄ν°λ² μ΄μ€ μμ μ νλμ λ Όλ¦¬μ μΈ μμ λ¨μλ‘ λ¬Άλ κ°λ μ λλ€. μ¬λ¬ κ°μ μμ μ΄ νλμ νΈλμμ μμμ μ²λ¦¬λλ©°, λͺ¨λ μμ μ΄ μ±κ³΅ν΄μΌλ§ μ΅μ’ μ μΌλ‘ 컀λ°(commit)λκ³ , νλλΌλ μ€ν¨νλ©΄ λ‘€λ°±(rollback)λμ΄ μμ μ΄ μ·¨μλ©λλ€.
- νΈλμμ μ΄ μ€μν μ΄μ λ **λ°μ΄ν°μ 무결μ±(integrity)**κ³Ό **μΌκ΄μ±(consistency)**μ 보μ₯νκΈ° μν¨μ λλ€.
νΈλμμ μ λ°μ΄ν°λ² μ΄μ€μ ACID μμ±μ ν΅ν΄ λ°μ΄ν° μ νμ±κ³Ό 무결μ±μ 보μ₯ν©λλ€:
- Atomicity (μμμ±): νΈλμμ λ΄μ λͺ¨λ μμ μ μ λΆ μ±κ³΅νκ±°λ, νλλΌλ μ€ν¨νλ©΄ μ λΆ μ·¨μλ©λλ€. μ¦, νΈλμμ μ μμ μ νλμ λ¨μλ‘ μ²λ¦¬λ©λλ€.
- Consistency (μΌκ΄μ±): νΈλμμ μ΄ μ±κ³΅μ μΌλ‘ μλ£λλ©΄, λ°μ΄ν°λ² μ΄μ€λ μΌκ΄λ μνλ‘ μ μ§λ©λλ€. μ¦, νΈλμμ μ νμ λ°μ΄ν° μνλ νμ μΌκ΄μ±μ κ°μ§λλ€.
- Isolation (κ³ λ¦½μ±): λμμ μ€νλλ νΈλμμ μ΄ μλ‘ κ°μνμ§ μλλ‘ λ³΄μ₯ν©λλ€.
- Durability (μ§μμ±): νΈλμμ μ΄ μ±κ³΅μ μΌλ‘ μλ£λλ©΄ κ·Έ κ²°κ³Όλ μꡬμ μΌλ‘ μ μ₯λ©λλ€.
μ€νλ§μμλ λ°μ΄ν°λ² μ΄μ€ νΈλμμ
μ κ΄λ¦¬νκΈ° μν΄ @Transactional
μ΄λ
Έν
μ΄μ
μ μ 곡ν©λλ€. μ΄ μ΄λ
Έν
μ΄μ
μ λ©μλλ ν΄λμ€μ μ μ©λμ΄ ν΄λΉ λ²μμμ νΈλμμ
μ΄ νμ±νλκ³ , λͺ¨λ λ°μ΄ν°λ² μ΄μ€ μμ
μ΄ μ±κ³΅νλ©΄ 컀λ°λλ©°, μ€ν¨ μ λ‘€λ°±λ©λλ€.
μ΄ λ§μ μ½λμμ νΈλμμ
μ μ²λ¦¬νλ @Transactional
μ΄λ
Έν
μ΄μ
μ΄ μ μ©λμ§ μμμ λ, λ€μκ³Ό κ°μ λ¬Έμ λ€μ΄ λ°μν μ μμμ μ°λ €νλ κ²μ
λλ€:
- μμμ± λ³΄μ₯μ΄ μ΄λ €μ: νΈλμμ μ΄ μ μ©λμ§ μμΌλ©΄ μ¬λ¬ κ°μ λ°μ΄ν°λ² μ΄μ€ μμ μ΄ νλμ μμ λ¨μλ‘ μ²λ¦¬λμ§ μμ΅λλ€. κ·Έ κ²°κ³Ό, μ€κ°μ μ€λ₯κ° λ°μν΄λ μ΄μ μ μλ£λ μμ μ λλμκ°μ§ μκ³ λ°μ΄ν°κ° λΆμμ ν μνλ‘ λ¨μ μ μμ΅λλ€. μλ₯Ό λ€μ΄, μν μ‘κΈ μ€μ μ‘κΈμ λμμ§λ§ μΈμΆμ΄ μ€ν¨νλ μν©μ΄ λ°μν μ μμ΅λλ€.
- λ°μ΄ν° μΌκ΄μ± λ¬Έμ : μ¬λ¬ κ°μ μμ μ΄ νλμ νΈλμμ λ΄μμ μ²λ¦¬λμ§ μμΌλ©΄, μΌλΆ μμ μ΄ μλ£λ μνμμ λ€λ₯Έ μμ μ΄ μ€ν¨νλ©΄ λ°μ΄ν°λ² μ΄μ€μ μΌκ΄μ±μ΄ κΉ¨μ§ μ μμ΅λλ€. νΈλμμ μμ΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ‘°μνλ©΄ μμ€ν λ΄μμ λ°μ΄ν°μ λΆμΌμΉκ° μκΈΈ μ μμ΅λλ€.
- λ‘€λ°± λΆκ°: νΈλμμ μμ΄ μμΈκ° λ°μνλ©΄ μ€ν¨ν λΆλΆλ§ 볡ꡬλ μ μκ³ , μ€κ° μνμμ μμ μ΄ λ©μΆ μ μμ΅λλ€. νΈλμμ μ μ€ν¨ μ μ 체 μμ μ λλλ € 무결μ±μ μ μ§νμ§λ§, νΈλμμ μ΄ μλ€λ©΄ μ΄λ₯Ό 보μ₯ν λ°©λ²μ΄ μμ΅λλ€.
- λμμ± λ¬Έμ : νΈλμμ μ΄ μλ€λ©΄ μ¬λ¬ μ¬μ©μκ° λμμ κ°μ λ°μ΄ν°λ₯Ό μ‘°μν λ, μΆ©λμ΄ λ°μνκ±°λ λ°μ΄ν°κ° μμλ μ μμ΅λλ€. νΈλμμ μ λμμ± λ¬Έμ λ₯Ό ν΄κ²°νλλ° νμμ μΈ μν μ ν©λλ€.
public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) {
// μΆκΈ
accountRepository.debit(fromAccountId, amount);
// μ
κΈ
accountRepository.credit(toAccountId, amount);
}
μμ κ°μ λ©μλκ° μλ€κ³ κ°μ ν΄ λ΄
μλ€. μ¬κΈ°μ debit
μ μΆκΈμ, credit
μ μ
κΈμ μ²λ¦¬ν©λλ€. νΈλμμ
μ΄ μλ€λ©΄ λ€μκ³Ό κ°μ μν©μ΄ λ°μν μ μμ΅λλ€:
- μΆκΈ(debit)μ΄ μ±κ³΅νμ§λ§ μ κΈ(credit)μ΄ μ€ν¨νμ λ, λμ΄ ν κ³μ’μμλ§ λΉ μ Έλκ°κ³ λ€λ₯Έ κ³μ’λ‘λ λ€μ΄κ°μ§ μλ λ¬Έμ κ° λ°μν μ μμ΅λλ€. νΈλμμ μ΄ μλ€λ©΄ μ€ν¨ν μμ μ λλ릴 λ°©λ²μ΄ μκΈ° λλ¬Έμ λ°μ΄ν°κ° λΆμμ ν μνλ‘ λ¨κ² λ©λλ€.
μ΄λ₯Ό νΈλμμ μ μ μ©νμ¬ ν΄κ²°ν μ μμ΅λλ€:
@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) {
accountRepository.debit(fromAccountId, amount);
accountRepository.credit(toAccountId, amount);
}
μ΄μ νΈλμμ
μ΄ μ μ©λ κ²½μ°, debit
λλ credit
μ€ νλλΌλ μ€ν¨νλ©΄ μ 체 μμ
μ΄ λ‘€λ°±λκ³ , λ°μ΄ν°μ 무결μ±κ³Ό μΌκ΄μ±μ΄ 보μ₯λ©λλ€.
"νΈλμμ
λμ΄ λΉ μ Έμλ€ => μ νμ±μ μ΄λ‘νλ"λ λ§μ νΈλμμ
μ΄ μλ μν©μμ λ°μ΄ν° μ νμ±κ³Ό 무결μ±μ λν μ°λ €λ₯Ό ννν κ²μ
λλ€. @Transactional
μ΄ μλ€λ©΄, μ¬λ¬ λ°μ΄ν°λ² μ΄μ€ μμ
μ€ νλκ° μ€ν¨ν λ λ‘€λ°±μ΄ μ΄λ£¨μ΄μ§μ§ μμ λ°μ΄ν°κ° λΆμμ νκ±°λ μΌκ΄μ±μ΄ κΉ¨μ§ μνμ΄ μμ΅λλ€. λ°λΌμ νΈλμμ
μ λ°μ΄ν° μ²λ¦¬μ μ νμ±μ 보μ₯νκΈ° μν΄ λ§€μ° μ€μν μν μ νλ©°, νΉν μ€μν λ°μ΄ν°λ² μ΄μ€ μμ
μμλ νμμ μΌλ‘ μ¬μ©λ©λλ€.