πŸ“š CS [ComputerScience]/πŸ“š CS λ©΄μ ‘

πŸ“š [CSλ©΄μ ‘] μ›Ή λ©΄μ ‘ 질문 [7] [@Transactional / AOP]

Dbswnstjd 2024. 2. 27. 23:19

@Transactional κ³Ό AOP의 관계 + Proxy 객체

spring κ°œλ°œμ„ μ§„ν–‰ν•˜λ©΄ νŠΈλžœμž­μ…˜ 처리λ₯Ό ν•΄λ³Έ κ²½ν—˜μ΄ μžˆμ„ 것이닀. μ‹€μ œλ‘œ @Transactional λ§Œ μ‚¬μš©ν•΄λ³΄κ³  λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œ 잘 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κ³  μžˆμ—ˆλ‹€.  λ©΄μ ‘ μ€€λΉ„λ₯Ό ν•˜λ©΄μ„œ aop에 λŒ€ν•΄ κ³΅λΆ€ν•˜λ‹€ νŠΈλžœμž­μ…˜ 처리, λ‘œκΉ… 등을 aop둜 μ²˜λ¦¬ν•œλ‹€λŠ”λ° λ‘œκΉ…μ„ μ²˜λ¦¬ν•˜λŠ” 것은 ν–ˆμ–΄λ„ νŠΈλžœμž­μ…˜μ€ λ”°λ‘œ κ΅¬ν˜„ν•œ 적이 μ—†μ—ˆλ‹€. κ·Έλž˜μ„œ 쑰금 더 μžμ„Ένžˆ μ•Œμ•„λ³΄κ³  λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ•Œμ•„λ³΄λ €κ³  ν•œλ‹€. 

 

 

1.  Transaction [ νŠΈλžœμž­μ…˜ ] / AOP [ 관점지ν–₯ν”„λ‘œκ·Έλž˜λ° ]

λ¨Όμ € νŠΈλžœμž­μ…˜μ΄λž€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚€κΈ° μœ„ν•΄ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ˜ λ‹¨μœ„λ₯Ό λœ»ν•œλ‹€. 

λ‹¨μˆœνžˆ λͺ…λ Ήμ–΄ λ‹¨μœ„κ°€ μ•„λ‹Œ μž‘μ—…μ˜ λ‹¨μœ„μΈ 것을 잘 이해해야 ν•œλ‹€. 

AλŠ” Bμ—κ²Œ 10,000을 μž…κΈˆν–ˆλ‹€.
A의 톡μž₯μ—μ„œ 10,000이 λΉ μ Έλ‚˜κ°€κ³  B의 톡μž₯에 10,000이 μž…κΈˆλ˜μ—ˆλ‹€.

 

이 과정을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ³΄λŠ” 것이 νŠΈλžœμž­μ…˜μ΄λ‹€.

이 λ•Œ A의 톡μž₯μ—μ„œ 돈이 λΉ μ Έλ‚˜κ°€μ§€ μ•Šκ±°λ‚˜ B의 톡μž₯에 돈이 λ“€μ–΄μ˜€μ§€ μ•ŠμœΌλ©΄ 이 μž‘μ—…μ€ μˆ˜ν–‰λ˜μ–΄μ„œλŠ” μ•ˆλœλ‹€. 

 

νŠΈλžœμž­μ…˜ ACID 

  • Atomicity [μ›μžμ„±]
    • All or Nothing, 즉 νŠΈλžœμž­μ…˜μ΄ μ™„μ „νžˆ 성곡 λ˜λŠ” μ‹€νŒ¨ν•˜λŠ” 단일 λ‹¨μœ„λ‘œ μ²˜λ¦¬ν•˜λ„λ‘ 보μž₯
  • Consistency [일관성]
    • νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ‘œ μœ μ§€
  • Isolation [독립성]
    • νŠΈλžœμž­μ…˜ μˆ˜ν–‰ μ‹œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ μ—°μ‚° μž‘μ—…μ΄ 끼어듀지 λͺ»ν•˜λ„둝 보μž₯
  • Durability [지속성]
    • μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœ νŠΈλžœμž­μ…˜μ€ μ˜μ›νžˆ 반영

μŠ€ν”„λ§μ—μ„œλŠ” νŠΈλžœμž­μ…˜ 처리λ₯Ό μœ„ν•΄ @Transactional 을 μ΄μš©ν•œλ‹€. @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ€ AOPλ₯Ό 톡해 Target이 μƒμ†ν•˜κ³  μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” Target 객체λ₯Ό μƒμ†ν•œ Proxy 객체가 μƒμ„±λ˜λ©°, Proxy 객체의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ Target λ©”μ„œλ“œ μ „, ν›„λ‘œ νŠΈλžœμž­μ…˜ 처리λ₯Ό μˆ˜ν–‰ν•œλ‹€. 

 

AOPλž€ λ¬΄μ—‡μΌκΉŒ ?

흩어진 관심사λ₯Ό λ³„λ„μ˜ 클래슀둜 λͺ¨λ“ˆν™”ν•˜μ—¬ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜κ³ , 결과적으둜 OOPλ₯Ό λ”μš± 잘 지킬 수 μžˆλ„λ‘ 도움을 μ£ΌλŠ” 것이 AOP이닀.

 

Proxy νŒ¨ν„΄μ΄λž€ ?

μ–΄λ–€ 객체λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•  λ•Œ, 객체λ₯Ό μ§μ ‘μ μœΌλ‘œ μ°Έμ‘° ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•΄λ‹Ή 객체λ₯Ό λŒ€ν–‰ν•˜λŠ” 객체λ₯Ό 톡해 λŒ€μƒκ°μ²΄μ— μ ‘κ·Όν•˜λŠ” 방식을 λœ»ν•œλ‹€. Spring AOPλŠ” ν”„λ‘μ‹œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. 

 

https://velog.io/@ann0905/AOP%EC%99%80-Transactional%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC

정말 이 그림을 보고 이해가 μž˜λλ‹€. 

ν΄λž˜μŠ€μ— @Transactional μ²˜λ¦¬κ°€ λ˜μ–΄ μžˆλŠ” λΆ€λΆ„(A, C λ©”μ„œλ“œ)이 μžˆλ‹€λ©΄, Spring은 ν•΄λ‹Ή 뢀뢄에 νŠΈλžœμž­μ…˜ 처리λ₯Ό μΆ”κ°€ν•œ ν”„λ‘μ‹œλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•œλ‹€. 그리고 μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•˜λ©΄, μ›λž˜ ν΄λž˜μŠ€κ°€ μ•„λ‹Œ ν”„λ‘μ‹œκ°€ λŒ€μ‹  ν˜ΈμΆœλœλ‹€.

 

β‘  C λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄, TestServiceκ°€ μ•„λ‹Œ TestService의 ν”„λ‘μ‹œμ— κ΅¬ν˜„λœ C λ©”μ„œλ“œκ°€ λŒ€μ‹  ν˜ΈμΆœλœλ‹€. λ”°λΌμ„œ C와 Cμ—μ„œ ν˜ΈμΆœν•˜λŠ” A λͺ¨λ‘ ν”„λ‘μ‹œ κ°μ²΄μ—μ„œ νŠΈλžœμž­μ…˜ 처리λ₯Ό ν•΄μ€€λ‹€.

β‘‘ ν•˜μ§€λ§Œ B λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것은 νŠΈλžœμž­μ…˜ μ²˜λ¦¬κ°€ λ˜μ–΄ μžˆμ§€ μ•Šμ€ 순수 B λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것과 κ°™λ‹€. μ΄λ•Œ Bμ—μ„œ ν˜ΈμΆœν•˜λŠ” A μ—­μ‹œ νŠΈλžœμž­μ…˜ μ²˜λ¦¬κ°€ λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

결과적으둜 νŠΈλžœμž­μ…˜μ€ κ°μ²΄ μ™ΈλΆ€μ—μ„œ 처음 μ§„μž…ν•˜λŠ” λ©”μ„œλ“œλ₯Ό κΈ°μ€€μœΌλ‘œ λ™μž‘ν•œλ‹€λŠ” 사싀을 μ•Œ 수 μžˆλ‹€.

 

 

1. Spring AOPλŠ” ν”„λ‘μ‹œ 객체λ₯Ό μžλ™μœΌλ‘œ 생성해주어, Aspect/Advice에 μ§μ ‘μ μœΌλ‘œ μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ ν•΄μ€€λ‹€.

2. @Transactional λ„ Spring AOP 쀑 ν•˜λ‚˜λ‘œ ν”„λ‘μ‹œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

  • 원본 클래슀/μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속 λ°›μ•„ ν”„λ‘μ‹œλ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— μ ‘κ·Ό μ œμ–΄κ°€ private으둜 λ˜μ–΄ 있으면 μ•ˆλœλ‹€.
  • 객체 μ™ΈλΆ€μ—μ„œ 처음으둜 μ§„μž…ν•˜λŠ” λ©”μ„œλ“œμ— νŠΈλžœμž­μ…˜ μ²˜λ¦¬κ°€ λ˜μ–΄ μžˆμ–΄μ•Ό, ν•΄λ‹Ή μš”μ²­μ„ ν”„λ‘μ‹œ 객체가 λŒ€μ‹  μ²˜λ¦¬ν•  수 μžˆλ‹€. λ”°λΌμ„œ νŠΈλžœμž­μ…˜μ€ 객체 μ™ΈλΆ€μ—μ„œ 처음 μ§„μž…ν•˜λŠ” λ©”μ„œλ“œλ₯Ό κΈ°μ€€μœΌλ‘œ λ™μž‘ν•œλ‹€.

 

 

좜처

https://velog.io/@ann0905/AOP%EC%99%80-Transactional%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC