Spring AOP - Hot-stock/backend GitHub Wiki
Spring AOP κ°μ
1. Spring AOPλ?
AOP(Aspect-Oriented Programming, κ΄μ μ§ν₯ νλ‘κ·Έλλ°)λ **ν‘λ¨ κ΄μ¬μ¬(Cross-Cutting Concerns)**λ₯Ό λΉμ¦λμ€ λ‘μ§κ³Ό λΆλ¦¬νμ¬ λͺ¨λννλ νλ‘κ·Έλλ° ν¨λ¬λ€μμ λλ€. ν‘λ¨ κ΄μ¬μ¬λ λ‘κΉ , 보μ, νΈλμμ κ΄λ¦¬μ²λΌ μ¬λ¬ λͺ¨λμμ 곡ν΅μΌλ‘ μ¬μ©λλ κΈ°λ₯μ μλ―Έν©λλ€. Spring AOPλ μ΄λ€ κ΄μ¬μ¬λ₯Ό ν΅μ¬ λΉμ¦λμ€ λ‘μ§κ³Ό λΆλ¦¬νμ¬ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλλ‘ λμ΅λλ€.
λνμ μΈ AOP μ μ© μ¬λ‘λ @Transactional μ΄λ Έν μ΄μ μ λλ€. μ΄ μ΄λ Έν μ΄μ μ μ¬λ¬ λΉμ¦λμ€ λ‘μ§μ νΈλμμ κ΄λ¦¬ κΈ°λ₯μ μ μ©νμ¬ μΌκ΄μ± μκ² λͺ¨λνλ ννλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
2. Spring AOPλ₯Ό μ¬μ©νλ μ΄μ
- λͺ¨λν: μ¬λ¬ λͺ¨λμ κ±Έμ³ κ³΅ν΅μ μΌλ‘ μ¬μ©λλ κΈ°λ₯μ μ€μμμ κ΄λ¦¬ν μ μμ΄ μ½λ μ€λ³΅μ μ€μ΄κ³ , μ μ§λ³΄μμ±μ ν₯μμν¬ μ μμ΅λλ€.
- μ μ°ν κ΄λ¦¬: λ‘κΉ , 보μ, νΈλμμ κ΄λ¦¬μ κ°μ ν‘λ¨ κ΄μ¬μ¬λ₯Ό ν΅μ¬ λΉμ¦λμ€ λ‘μ§κ³Ό λ 립μ μΌλ‘ μ²λ¦¬νμ¬ νμ₯μ±μ λμΌ μ μμ΅λλ€.
3. Spring AOPμ μ£Όμ μ©μ΄
3.1 PointCut
PointCutμ AOPκ° μ μ©λ μ§μ μ΄λ μμ μ μ μν©λλ€. Spring AOPμμλ μ£Όλ‘ λ©μλ νΈμΆ μ§μ μ λμμΌλ‘ νλ©°, νΉμ 쑰건μ λ§λ λ©μλλ ν΄λμ€μ AOPλ₯Ό μ μ©ν μ μμ΅λλ€. λ¨, private λ©μλμλ AOPκ° μ μ©λμ§ μμ΅λλ€.
3.2 JoinPoint
JoinPointλ AOPμμ λΆκ°κΈ°λ₯(Advice)μ΄ μ μ©λ μ μλ μ§μ μ μλ―Ένλ©°, Spring AOPμμλ μ£Όλ‘ λ©μλ μ€ν μ§μ μ JoinPointλ‘ μ¬μ©ν©λλ€.
3.3 Advice
Adviceλ AOPμμ μ€μ λ‘ μνν λΆκ°κΈ°λ₯μ μ μν©λλ€. λνμ μΈ μ’ λ₯λ λ€μκ³Ό κ°μ΅λλ€:
- Before: λ©μλ μ€ν μ λμ
- After: λ©μλ μ€ν ν λμ
- AfterReturning: λ©μλκ° μ±κ³΅μ μΌλ‘ λ°νλ ν λμ
- AfterThrowing: λ©μλ μ€ν μ€ μμΈκ° λ°μνμ λ λμ
- Around: λ©μλ μ€ν μ ν λͺ¨λ λμνλ©°, μ€ν νλ¦μ μ μ΄ν μ μμ΅λλ€.
3.4 Aspect
Aspectλ Adviceμ PointCutμ νλμ λͺ¨λλ‘ κ²°ν©ν κ²μ λλ€. νΈλμμ κ΄λ¦¬λ λ‘κΉ κ°μ κ΄μ¬μ¬λ₯Ό λͺ¨λννμ¬ κ΄λ¦¬ν μ μμ΅λλ€.
3.5 Weaving
Weavingμ **Aspect(ν‘λ¨ κ΄μ¬μ¬)**λ₯Ό λμ κ°μ²΄μ μ μ©νλ κ³Όμ μ λλ€. Weavingμ μ»΄νμΌ νμ, λ‘λ νμ, λ°νμμ λ°μν μ μμΌλ©°, Spring AOPλ μ£Όλ‘ λ°νμμ λμ νλ‘μλ₯Ό μ¬μ©ν΄ Weavingμ μ²λ¦¬ν©λλ€.
4. Spring AOPμ λμ λ°©μ
Spring AOPλ **νλ‘μ κ°μ²΄(Proxy)**λ₯Ό μ¬μ©νμ¬ λμν©λλ€. Spring IoC 컨ν μ΄λκ° λΉ(Bean) κ°μ²΄λ₯Ό μμ±ν λ, AOPκ° μ μ©λ κ°μ²΄λ νλ‘μλ‘ κ°μΈμ Έ λ±λ‘λ©λλ€. μ΄ν ν΄λΉ λΉμ λ©μλκ° νΈμΆλλ©΄, νλ‘μ κ°μ²΄κ° λ¨Όμ **λΆκ°κΈ°λ₯(Advice)**μ μ€νν ν μλ³Έ λΉμ¦λμ€ λ‘μ§μ μνν©λλ€.
νλ‘μλ λ κ°μ§ λ°©μμΌλ‘ μμ±λ©λλ€:
- JDK λμ νλ‘μ: λΉμ΄ μΈν°νμ΄μ€λ₯Ό ꡬννκ³ μμΌλ©΄ JDK λμ νλ‘μκ° μ¬μ©λ©λλ€.
- CGLIB νλ‘μ: μΈν°νμ΄μ€κ° μλ ν΄λμ€ κΈ°λ° λΉμ CGLIB νλ‘μκ° μ¬μ©λ©λλ€.
5. Spring AOP μ μ© μμ
Spring AOPλ λ°νμ μμ μ μ μ©λ©λλ€. νλ‘μ κ°μ²΄κ° λ°νμμ μμ±λμ΄ λ©μλ νΈμΆ μ AOPλ₯Ό μ μ©ν μ μμ΅λλ€. Spring AOPλ μ£Όλ‘ λμ νλ‘μ λ°©μμ μ¬μ©νμ¬, νμν λλ§λ€ λΆκ°κΈ°λ₯μ λμ μΌλ‘ μ²λ¦¬ν©λλ€.
flowchart TD
A[Spring AOP νλ‘μ μμ± μμ²] --> B{μΈν°νμ΄μ€ ꡬν μ¬λΆ νμΈ}
B -->|μΈν°νμ΄μ€ μμ| C[JDK λμ νλ‘μ μμ±]
B -->|μΈν°νμ΄μ€ μμ| D[CGLIB νλ‘μ μμ±]
C --> E[νλ‘μ κ°μ²΄ μμ± μλ£]
D --> E[νλ‘μ κ°μ²΄ μμ± μλ£]
E --> F[νλ‘μ κ°μ²΄λ₯Ό IoC 컨ν
μ΄λμ λ±λ‘]
6. Spring AOPμ Spring μΈν°μ ν°μ μ°¨μ΄μ
- Spring AOPλ μ£Όλ‘ λΉμ¦λμ€ λ‘μ§μ λν ν‘λ¨ κ΄μ¬μ¬λ₯Ό μ²λ¦¬νλ©°, λ©μλ λ 벨μμ λμν©λλ€. μλ₯Ό λ€μ΄, λ©μλ μ€ν μ νλ μμΈ λ°μ μμ λΆκ°κΈ°λ₯μ μ μ©ν μ μμ΅λλ€.
- Spring μΈν°μ ν°λ HTTP μμ²/μλ΅ μ²λ¦¬μ μ΄μ μ λ§μΆλ©°, μΉ λ μ΄μ΄μμ λμν©λλ€. μΈν°μ ν°λ 컨νΈλ‘€λ¬μ λλ¬νκΈ° μ μμ²μ κ°λ‘μ±κ±°λ, μλ΅μ ν΄λΌμ΄μΈνΈμκ² λ°ννκΈ° μ μ μλ΅μ κ°λ‘μ±λ μν μ μνν©λλ€.
7. AOP μ μ© μ μ±λ₯μ λ―ΈμΉλ μν₯
- AOP μ μ© μ νλ‘μ κ°μ²΄ μμ±κ³Ό **λΆκ°κΈ°λ₯(Advice)**μ μ€νμ΄ μΆκ°λκΈ° λλ¬Έμ μ±λ₯ μ€λ²ν€λκ° λ°μν μ μμ΅λλ€.
- νΉν, CGLIB νλ‘μλ ν΄λμ€ μμμ ν΅ν΄ νλ‘μλ₯Ό μμ±νλ―λ‘, JDK λμ νλ‘μλ³΄λ€ μ€λ²ν€λκ° λ ν΄ μ μμ΅λλ€.
- λ€λ§, μΌλ°μ μΈ μ ν리μΌμ΄μ μμλ μ±λ₯ μ€λ²ν€λλ ν¬μ§ μμΌλ©°, AOPλ‘ μ»λ μ μ§λ³΄μμ±κ³Ό μ½λ μ¬μ¬μ©μ±μ΄ μ±λ₯ μμ€μ μμν μ μμ΅λλ€.
8. AOP μ μ© μ μ£Όμμ¬ν
- νλ‘μμ νκ³: Spring AOPλ privateμ΄λ final λ©μλμ μ μ©λμ§ μμΌλ©°, λΉ μ€μ½νμμλ§ λμν©λλ€.
- μ±λ₯ κ³ λ €: AOPκ° κ³Όλνκ² μ μ©λ κ²½μ° μ±λ₯ λ¬Έμ κ° λ°μν μ μμΌλ―λ‘, νμν κ³³μλ§ μ μ€νκ² μ μ©ν΄μΌ ν©λλ€.