2022-07-02 TIL
@Transactional μ¬μ© μ μ£Όμμ¬ν
κΉμνλ μ€νλ§ DB 2νΈ - λ°μ΄ν° μ κ·Ό κΈ°μ νμ© κ°μλ₯Ό κΈ°λ°μΌλ‘ μ 리ν λ΄μ©μ λλ€.
@Transactional
μ μ¬μ©νλ©΄ μ€νλ§ νΈλμμ
AOPκ° μ μ©λλ€. νΈλμμ
AOPλ κΈ°λ³Έμ μΌλ‘ νλ‘μ λ°©μμ AOPλ₯Ό μ¬μ©νλ€. @Transactional
μ μ γ
μ©νλ©΄ νλ‘μ κ°μ²΄κ° μμ²μ λ¨Όμ λ°μμ νΈλμμ
μ λ¨Όμ μ²λ¦¬νκ³ , μ€μ κ°μ²΄λ₯Ό νΈμΆν΄μ€λ€. λ°λΌμ νΈλμμ
μ μ μ©νλ €λ©΄ νμ νλ‘μλ₯Ό ν΅ν΄μ λμ κ°μ²΄(Target)μ νΈμΆν΄μΌ νλ€. μ΄λ κ² ν΄μΌ νλ‘μμμ λ¨Όμ νΈλμμ
μ μ μ©νκ³ , μ΄νμ λμ κ°μ²΄λ₯Ό νΈμΆνκ² λλ€. λ§μ½ νλ‘μλ₯Ό κ±°μΉμ§ μκ³ λμ κ°μ²΄λ₯Ό μ§μ νΈμΆνκ² λλ©΄ AOPκ° μ μ©λμ§ μκ³ λ°λΌμ νΈλμμ
λ μ μ©λμ§ μλλ€.
AOPλ₯Ό μ μ©νλ©΄ μ€νλ§μ λμ κ°μ²΄ λμμ νλ‘μλ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νλ€. λ°λΌμ μ€νλ§μ μμ‘΄κ΄κ³ μ£Όμ
μμ νμ μ€μ κ°μ²΄ λμ μ νλ‘μ κ°μ²΄λ₯Ό μ£Όμ
νλ€. νλ‘μ κ°μ²΄κ° μ£Όμ
λκΈ° λλ¬Έμ λμ κ°μ²΄λ₯Ό μ§μ νΈμΆνλ λ¬Έμ λ μΌλ°μ μΌλ‘ λ°μνμ§ μλλ€. νμ§λ§ λμ κ°μ²΄μ λ΄λΆμμλ λ©μλ νΈμΆμ΄ λ°μνλ©΄ νλ‘μλ₯Ό κ±°μΉμ§ μκ³ λμ κ°μ²΄λ₯Ό μ§μ νΈμΆνλ λ¬Έμ κ° λ°μνλ€. μ΄λ κ² λλ©΄ @Transactional
μ΄ μμ΄λ νΈλμμ
μ΄ μ μ©λμ§ μλλ€.
@Service
@Slf4j
class TxTest {
@Transactional
public void internalCall() {
}
public void externalCall() {
internalCall();
}
}
...
@Autowired
TxTest txTest;
txTest.internalCall(); // νΈλμμ
μ μ©λ¨
txTest.externalCall(); // externalCallμμ λ΄λΆμμ νΈμΆνλ internalCall() νΈλμμ
μ μ© μ λ¨
txTest.internalCall()
txTest.internalCall()
μ νΈμΆνλλ°, μ¬κΈ°μtxTest
λ νΈλμμ νλ‘μμ΄λ€.txTest
μ νΈλμμ νλ‘μκ° νΈμΆλλ€.internalCall
λ©μλμ@Transactional
μ΄ λΆμ΄ μμΌλ―λ‘ νλ‘μλ νΈλμμ μ μ μ©νλ€.- νΈλμμ
μ μ© νμ μ€μ
txTest
κ°μ²΄ μΈμ€ν΄μ€μinternalCall()
νΈμΆ - μ€μ
txTest
κ° μ²λ¦¬λ₯Ό μλ£νλ©΄ μλ΅μ΄ νΈλμμ νλ‘μλ‘ λμμ€κ³ , νΈλμμ νλ‘μλ νΈλμμ μ μλ£νλ€.
txTest.externalCall()
txTest.externalCall()
μ νΈμΆνλλ°, μ¬κΈ°μtxTest
λ νΈλμμ νλ‘μμ΄λ€.txTest
μ νΈλμμ νλ‘μκ° νΈμΆλλ€.externalCall
λ©μλμ@Transactional
μ΄ μλ―λ―λ‘ νΈλμμ νλ‘μλ νΈλμμ μ μ μ©νμ§ μλλ€.- νΈλμμ
μ μ μ©νμ§ μκ³ , μ€μ
txTest
κ°μ²΄ μΈμ€ν΄μ€μexternalCall()
μ νΈμΆνλ€. externalCall()
λ΄λΆμμinternalCall()
λ©μλλ₯Ό νΈμΆνμ§λ§ μ΄internalCall()
λ©μλλ₯Ό νΈμΆν΄λ νΈλμμ μ μ μ©λμ§ μλλ€. ν°μΌλ¬λ€.
λ¬Έμ μ μμΈ
externalCall()
μμλ internalCall()
μ νΈμΆνλ€. μλ°μμλ λ©μλ μμ λ³λμ μ°Έμ‘°κ° μμΌλ©΄ this
λΌλ λ»μΌλ‘ μκΈ° μμ μ μΈμ€ν΄μ€ μ£Όμλ₯Ό κ°λ¦¬ν¨λ€. κ²°κ³Όμ μΌλ‘ μκΈ° μμ μ λ΄λΆ λ©μλλ₯Ό νΈμΆνλ this.internalCall()
μ΄ λλλ° this
λ μκΈ° μμ μ κ°λ¦¬ν€λ―λ‘ μ€μ κ°μ²΄(target)μ λ»νλ€. κ²°κ³Όμ μΌλ‘ μ΄λ¬ν λ΄λΆ νΈμΆμ νλ‘μλ₯Ό κ±°μΉμ§ μκΈ° λλ¬Έμ νΈλμμ
μμ μ μ©λ μ μλ€.
λκΈλ¨κΈ°κΈ°