νΈλμμ μ λ°μ΄ν°λ² μ΄μ€μ μνλ₯Ό λ³νμν€λ μμ μ λ¨μλ₯Ό μλ―Έν©λλ€.
μ½κ² λ§ν΄μ λ°λ‘ μ΄μ μ»€λ° μ΄νμ μμ λΆν°, μ΄λ°μ λ° μμ ν μ΅μ’ μ μΌλ‘ 컀λ°μ λ 리기κΉμ§μ μ£ΌκΈ°μ΄λ€.
μ¦, μ¬λ¬ μμ μ΄ νλμ λ Όλ¦¬μ λ¨μλ‘ λ¬Άμ¬μ λͺ¨λ μ±κ³΅νκ±°λ λͺ¨λ μ€ν¨νλλ‘ λ³΄μ₯νλ κ²μ λλ€.
μ¨λΌμΈ μΌνλͺ°μ κ²°μ ν λ, λκ°μ§ μμ μ κ±°μ³μΌνλ€.
μ λ μμ μ΄ ν νΈλμμ μ΄λΌκ³ νμ.
1) νΈλμμ μ체λ₯Ό μ μ©νμ§ μμ κ²½μ°
@Autowired
private Buyer buyer
@Autowired
private Seller seller;
public void buy() {
buyer.send();
seller.receive();
}
μ΄λ¬ν κ²½μ° λ¬Έμ κ° μκΈΈ μ μλ λΆλΆμ΄
receive() λ©μλ μ체μ λ¬Έμ κ° μμ΄μ νμ send() κΉμ§λ λ§€λ² μ€νμ΄ λκ³ receive() λ©μλλ μ€νμ΄ λμ§ μμ κ²½μ°
ꡬ맀μλ λμ 보λ΄μ DBμμ κΈμ‘μ΄ μ€μ΄λ€μλλ°, νλ§€μλ μ κΈμ΄ λμ§ μμ DBμμ κΈμ‘ λ³λμ΄ μλ κ²½μ°μ΄λ€.
λ°λΌμ λ°λμ transactionμ κ±Έμ΄μ, receive() κ° μ€νλμ§ λͺ»νκ³ μλ¬κ° λ κ²½μ° λ°λμ send() λν λ‘€λ°±λμ΄ μμ볡ꡬ μμΌμ£Όμ΄μΌ νλ€.
2) @Transactional λμ try-catchλ‘ κ΅¬νν κ²½μ°
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private Buyer buyer
@Autowired
private Seller seller;
public void buy() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
buyer.send();
seller.receive();
transactionManager.commit(status);
} catch(Exception e) {
transactionManager.rollback(status);
}
}
TransactionManagerλ‘ μ§μ 컀λ°κ³Ό λ‘€λ°±μ μμΌμ£Όμλ€.
κ·Έλ¬λ 쿼리λ₯Ό μ¬μ©νλ λ©μλμ λ§€λ² μ€λ³΅λλ μ½λλ₯Ό μμ±ν΄ μ£Όμ΄μΌ νλ λΆνΈν¨μ΄ μλ€.
3) @Transactionalμ μ¬μ©ν κ²½μ°
@Autowired
private Buyer buyer
@Autowired
private Seller seller;
@Transactional
public void buy() {
buyer.send();
seller.receive();
}
μ¬μ©λ λ©μλ μμ @Transactional μ΄λ Έν μ΄μ λ§ λΆμ¬μ£Όλ©΄, μμ try-catchλ¬Έμ μμ±νμ§ μμλ λλ€.
4) λͺ¨λ λ©μλμ @Transactional μ¬μ©νκ³ μΆμ λ
@Transactional
public class AllQuery {
public void selectOne() { }
public int allCount() { }
public List<User> allUser() { }
/* μλμ λμΌνλ€
@Transactional
public void selectOne() { }
@Transactional
public int allCount() { }
@Transactional
public List<User> allUser() { }
*/
}
λ§μ½ μμ κ°μ΄ ν΄λμ€μ μνλ λͺ¨λ λ©μλμ @Transactional μ΄λ Έν μ΄μ μ μ μ©νκ³ μΆλ€λ©΄, μ΄λ Έν μ΄μ μ ν΄λμ€ μμ λΆμ¬μ€λ€.
ν΄λμ€ μμ @Transactionalμ΄ λΆμ΄μμΌλ©΄, ν΄λμ€μ μν λͺ¨λ λ©μλμ κ°κ° @Transactionalμ΄ λΆμ΄μλ€κ³ μκ°νλ©΄ λλ€.
νΈλμμ
μ νμ λ°μ΄ν° μνλ μΌκ΄μ±μ μ μ§ν΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄, μν κ³μ’ μ΄μ²΄μμ μ‘κΈν κΈμ‘κ³Ό λ°μ κΈμ‘μ νμ κ°μμΌ ν©λλ€. (ex: DBμ λ¬΄κ²°μ± μ μ½ μ‘°κ±΄ νμ λ§μ‘±)
μ¬λ¬ νΈλμμ μ΄ λμμ μ€νλλλΌλ μλ‘ κ°μνμ§ μλλ‘ λ³΄μ₯ν©λλ€. (ex: λμμ κ°μ λ°μ΄ν° μμ X)
λΉμ¦λμ€ λ‘μ§κ³Ό νΈλμμ μ²λ¦¬ λ‘μ§μ΄ λμμ μ‘΄μ¬νλ€λ©΄ μ½λμ μ€λ³΅μ΄ λ°μν μλ μκ³ , λΉμ¦λμ€ λ‘μ§μλ§ μ§μ€λ μ½λλ₯Ό μμ±νκΈ° μ΄λ ΅λ€. μ΄λ κ² λΉμ¦λμ€ λ‘μ§μλ§ μ§μ€νκΈ° μν΄ Springμ ν¬κ² 2κ°μ§ νΈλμμ κΈ°μ μ μ§μνλ€.
- μ€νλ§μ AOPλ₯Ό μ κ·Ήμ μΌλ‘ 체κ°κ°λ₯
- xmlμμ AOP μ€μ μΌλ‘ νΈλμμ
μ μ μΈνλ λ°©λ²
- μ΄λ
Έν
μ΄μ
μ¬μ©λ°©λ²(@Transactional)
μ ν리μΌμ΄μ κΈ°λ₯μ ν¬κ² ν΅μ¬ κΈ°λ₯κ³Ό λΆκ° κΈ°λ₯μΌλ‘ λλ μ μλ€.
ν΅μ¬ κΈ°λ₯: ν΄λΉ κ°μ²΄κ° μ 곡νλ κ³ μ ν κΈ°λ₯(λΉμ¦λμ€ λ‘μ§)(ex: UserService - μ μ κ΄λ ¨ λ‘μ§)
λΆκ° κΈ°λ₯: ν΅μ¬ κΈ°λ₯μ 보쑰νλ κΈ°λ₯(ex: λ‘κ·Έ μΆμ , νΈλμμ
μ²λ¦¬
λ±)
λΆκ° κΈ°λ₯λ€μ μ¬λ¬ μ½λμμ μ¬μ¬μ©λλ κ²½μ°κ° λ§λ€. μλ₯Όλ€μ΄ TransactionManagerλ₯Ό μ΄μ©ν΄ νΈλμμ μ²λ¦¬λ₯Ό ν΄μ€λ€λ©΄ νλ²μ μ²λ¦¬λμ΄μΌ νλ μμ λ€μ΄ μλ λͺ¨λ λΉμ¦λμ€ λ‘μ§μ commit ν΄μ£Όκ³ rollbackν΄μ£Όλ μ½λλ₯Ό λ°λ³΅ν΄μ μμ±ν΄μ£Όμ΄μΌνλ€.
-> μ΄λ¬ν λΆκ° κΈ°λ₯λ€μ λΆλ¦¬νκ³ μ΄λμ μ μ©ν μ§ μ ννλ κΈ°λ₯μ ν©μ³ νλμ λͺ¨λλ‘ λ§λ κ²μ΄ Aspectμ΄λ€.
-> μ ν리μΌμ΄μ
μ λ°λΌλ³Ό λ ν΅μ¬ κΈ°λ₯μ μ§μ€ν μ μλλ‘ λμμ£Όλ λͺ¨λμ΄λΌκ³ μ΄ν΄νλ©΄ μ’λ€.
=> @Transactionalμ AOPλ₯Ό μ§ν₯ν μ μλλ‘ μ€νλ§μμ μ§μν΄μ£Όλ μ΄λ
Έν
μ΄μ
μ΄λ€.
@Transactional μ΄λ Έν μ΄μ μ, ν΄λΉ μ΄λ Έν μ΄μ μ΄ μ μ©λλ λ©μλλ₯Ό νλμ νΈλμμ μΌλ‘ λ¬Άμ΄μ£Όλ μν μ νλ€.
μ€νλ§μ νΈλμμ AOPλ @Transactionalμ μΈμνμ¬ νΈλμμ νλ‘μλ₯Ό μ μ©.
νλ‘μλ 'λ리μΈ'μ΄λΌλ λ»μΌλ‘ Aspectμ @Transactionalμ μ μ©ν ν΄λμ€ / λ©μλμΈ Targetμ μ°κ²°ν΄μ£Όλ μν
ν΄λΌμ΄μΈνΈκ° API νΈμΆ
νλ‘μ μ€ν
νΈλμμ μ½λ μ€ν
λΉμ¦λμ€ λ‘μ§ μ€ν
νΈλμμ μ½λ μ€ν(commit / rollback)
μμ: νΈλμμ μ μμν©λλ€.
μμ μν: λ°μ΄ν°λ² μ΄μ€μ νμν μμ μ μνν©λλ€.
컀λ°: λͺ¨λ μμ μ΄ μ±κ³΅νλ©΄ νΈλμμ κ²°κ³Όλ₯Ό λ°μν©λλ€.
λ‘€λ°±: μμ μ€ νλλΌλ μ€ν¨νλ©΄ μ΄μ μνλ‘ λλ립λλ€.
μΆμ²