νΈλμμ
κ΄λ¦¬λ λ°μ΄ν°λ² μ΄μ€μ μΌκ΄μ±μ μ μ§νκΈ° μν΄ νμμ μΈ κ³Όμ μ
λλ€. νΉν, Spring Frameworkμ κ°μ νλμ μΈ μ ν리μΌμ΄μ
κ°λ° νκ²½μμλ νΈλμμ
μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ λ€μν λꡬμ μ΄λ
Έν
μ΄μ
μ μ 곡ν©λλ€. μ΄λ² κΈμμλ νΈλμμ
μ κΈ°λ³Έ κ°λ
κ³Ό Springμμ @Transactional
μ΄λ
Έν
μ΄μ
μ μ¬μ©ν μΌλ°μ μΈ μμ λ₯Ό λ€λ£Ήλλ€.
νΈλμμ μ΄λ?
νΈλμμ μ λ°μ΄ν°λ² μ΄μ€μ μνλ₯Ό λ³νμν€λ νλ μ΄μμ μ°μ°μ νλμ μμ λ¨μλ‘ λ¬Άλ κ²μ μλ―Έν©λλ€. μ΄λ λͺ¨λ μ°μ°μ΄ μ±κ³΅μ μΌλ‘ μλ£λκ±°λ, νλλΌλ μ€ν¨ν κ²½μ° λͺ¨λ λ³κ²½μ¬νμ΄ μ·¨μλμ΄μΌ ν¨μ 보μ₯ν©λλ€(All or Nothing). μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°μ μΌκ΄μ±κ³Ό μ νμ±μ μ μ§ν μ μμ΅λλ€.
Springμ @Transactional
Spring Frameworkμμλ @Transactional
μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ μ μΈμ νΈλμμ
κ΄λ¦¬λ₯Ό ν μ μμ΅λλ€. μ΄ μ΄λ
Έν
μ΄μ
μ λ©μλλ ν΄λμ€μ μ μ©νλ©΄, Springμ ν΄λΉ λ©μλμ μ€νμ νΈλμμ
μ λ²μ μμμ κ΄λ¦¬ν©λλ€. μ¦, λ©μλ μ€ν μ μ νΈλμμ
μ μμνκ³ , μ€ν νμλ μ±κ³΅ μ¬λΆμ λ°λΌ νΈλμμ
μ 컀λ°νκ±°λ λ‘€λ°±ν©λλ€.
JPAμ @Transactional
Java Persistence API(JPA)λ μλ° ORM κΈ°μ μ λν API νμ€μ
λλ€. JPAλ₯Ό μ¬μ©ν λ, κΈ°λ³Έμ μΌλ‘ λͺ¨λ λ°μ΄ν°λ² μ΄μ€ μ°μ°μ νΈλμμ
μμμ μ΄λ£¨μ΄μ ΈμΌ ν©λλ€. λ§μ JPA ꡬν체(μ: Hibernate)λ λ΄λΆμ μΌλ‘ λ©μλμ @Transactional
μ΄ μ μ©λμ΄ μμ΄, λ¨μΌ μ°μ°μ λν΄μλ λ³λλ‘ μ μΈν νμκ° μμ΅λλ€. κ·Έλ¬λ μ¬λ¬ μ°μ°μ νλμ νΈλμμ
μΌλ‘ λ¬Άμ΄ κ΄λ¦¬ν΄μΌ ν λλ κ°λ°μκ° λͺ
μμ μΌλ‘ @Transactional
μ μ μΈν΄μΌ ν©λλ€.
μ¬μ© μμ
λ€μμ @Transactional
μ μ¬μ© μμμ
λλ€. test()
λ©μλμμλ λ κ°μ λ°μ΄ν°λ² μ΄μ€ μ μ₯ μμ
μ νλμ νΈλμμ
μΌλ‘ λ¬Άμ΅λλ€. saveSuccess()
λ μ μμ μΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νμ§λ§, saveFail()
μμ μμΈκ° λ°μνμ¬ λ μ°μ° λͺ¨λ λ‘€λ°±λ©λλ€. μ΄λ @Transactional
μ΄ μ μΈλμ΄ μκΈ° λλ¬Έμ κ°λ₯ν λμμ
λλ€.
@Transactional
public void test() {
saveSuccess();
saveFail(); // μ΄ λ©μλμμ μμΈ λ°μ
}
public void saveSuccess() {
// λ°μ΄ν°λ² μ΄μ€μ λ°μ΄ν° μ μ₯
}
public void saveFail() {
// λ°μ΄ν°λ² μ΄μ€μ λ°μ΄ν° μ μ₯ μλ, μμΈ λ°μ
throw new RuntimeException("μ μ₯ μ€ν¨");
}
λ§μ½ @Transactional
μ μ μΈνμ§ μμλ€λ©΄, saveFail()
μ μ€ν¨μ 무κ΄νκ² saveSuccess()
λ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ©λλ€. μ΄λ νΈλμμ
μ΄ κ°λ³ μμ
μΌλ‘ κ΄λ¦¬λκΈ° λλ¬Έμ λ°μνλ νμμ
λλ€.
κ²°λ‘
@Transactional
μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄, μ¬λ¬ λ°μ΄ν°λ² μ΄μ€ μ°μ°μ νλμ νΈλμμ
μΌλ‘ λ¬Άμ΄ μΌκ΄μ±μ μ μ§νκ³ , μμΈ λ°μ μ λͺ¨λ λ³κ²½μ¬νμ λ‘€λ°±νμ¬ λ°μ΄ν°μ μμ μ±μ 보μ₯
ν μ μμ΅λλ€. Springκ³Ό JPAλ₯Ό μ¬μ©νλ νλμ μΈ μ ν리μΌμ΄μ
κ°λ°μμ νΈλμμ
κ΄λ¦¬λ λ§€μ° μ€μνλ©°, @Transactional
μ μ΄λ₯Ό μμ½κ² ꡬνν μ μλλ‘ λμμ€λλ€.