π± [Spring] AOP(Aspect Oriented Programming) λ체 λκΉ? π§
κ°μ #
νκ΅ λ΄ λ§λ€μ΄μ§ νμ€ Lifestyleμ΄λΌλ νμ΄ μλ€. λ κ·Έκ³³μ 리λλ‘μ μ¨λΌμΈ μ€ν°λλΌλκ±Έ μ§ννλ€.
λ¬Όλ‘ μ°Έμ¬μλ λλͺ λΏμ΄μμ§λ§.. μ²μμ΄λκΉ λ κ°λ³κ² νμλ λ§μΈλλ‘
μ΄μ¨λ μ¨λΌμΈ μ€ν°λμ λ©μ»€λμ¦μ μ΄λ λ€.
μ°Έμ¬ν μΈμμ μλ§νΌ μ€ν°λ μ£Όμ λ₯Ό μ νλ€. -> μΈμλ§λ€ νλμ© μ£Όμ λ₯Ό λ°°μ λ°λλ€ -> 1μκ° μ€ν°λ ν λ°ν
κ·Έλμ λλ μ΄λ²μ AOPλΌλ μ£Όμ λ₯Ό λ°κ²λμκ³ μ 리ν΄λ³΄λ € νλ€.
AOP(Aspect Oriented Programming) #
AOPλ Aspect Oriented Programmingμ μ½μλ‘Β κ΄μ μ§ν₯ νλ‘κ·Έλλ°μ΄λΌκ³ λΆλ¦°λ€.
κ³΅ν΅ κ΄μ¬ κΈ°λ₯μ λΆλ¦¬ν΄ λ°λ³΅λλ λΆλΆμ μΆμΆν΄ ν΅μ¬ λ‘μ§μ μν₯μ λ―ΈμΉμ§ μκ³ μμ€μ μ€λ³΅μ μ€μ΄λ κΈ°λ²μΌλ‘
κΈ°μ‘΄ OOPμμ κ³΅ν΅ κ΄μ¬ κΈ°λ₯μ μ¬λ¬ λͺ¨λμ μ μ©ν΄ λ°μνλ μ€λ³΅λ μ½λ μμ°μ νκ³λ₯Ό 극볡νκΈ° μν΄ λμ€κ² λμμ΅λλ€.
κ·Έ κ΄μ μ§ν₯μ μ½κ² λ§ν΄ μ΄λ€ κΈ°λ₯μ κΈ°μ€μΌλ‘ ν΅μ¬μ μΈ κ΄μ κ³Ό λΆκ°μ μΈ κ΄μ μΌλ‘ λλμ΄μ 보κ³
κ·Έ κ΄μ μ κΈ°μ€μΌλ‘ κ°κ° λͺ¨λν νκ² λ€λ κ²μ΄λ€.
μ.. λ μ½κ² λ§νλ©΄ ν΅μ¬ λ‘μ§μ μ§μ€ν μ μλλ‘,
νμνμ§λ§ μ€λ³΅ν΄μ μμ±ν΄μΌ νλ ν΅μ¬ λ‘μ§ μ΄μΈμ μ½λλ€μ μΈλΆλ‘ λΉΌλλ κ²μ΄λ€.

μμ μ΄λ―Έμ§μ²λΌ ν ν΄λμ€μ μ¬λ¬κ°μ κ΄μ μ΄ μλ κ²μ΄ μλλΌ μ λΆ λͺ¨λν νμ¬
κ°κ°μ νμν ν΄λμ€κ° κ°μ Έλ€ μ¬μ©νκ² λ§λ λ€.
(μμ)
μμλ₯Ό λ€μ΄λ³΄κ² λ€. λ΄κ° λ§μ½ ν©ν 리μΌμ ꡬνλ νλ‘κ·Έλ¨μ λ§λ€μλ€. κ·Έλ¬λ©΄ ν©ν 리μΌμ μ λ ₯λ°μ κ°μ 리ν΄νλ
ν΄λμ€λ₯Ό μ¬κ·ν¨μλ₯Ό μ΄μ©ν΄ λ§λ€μλ€. κ·Έλ¦¬κ³ μꡬμ¬νμ΄ μΆκ°λμλ€. κ³μ°μ μμνλ μμ κ³Ό μ’ λ£λλ μμ μ
μκ°μ λ°λ¦¬μΈμ»¨λμ΄λ‘ ꡬν΄λ¬λΌλ μꡬμ¬νμ΄μλ€. κ·Έλ κ² ν©ν 리μΌμ κ³μ°νλ μ½λμ μμμκ°κ³Ό μ’ λ£μκ°μ μΈ‘μ νλ
κΈ°λ₯μ ꡬννλ€. κ·Έλ¦¬κ³ μ¬κΈ°μ λ μꡬμ¬νμ΄ μΆκ°λμλ€. μ΄λ²μλ λ°λ³΅λ¬ΈμΌλ‘ ν©ν 리μΌμ ꡬνλ νλ‘κ·Έλ¨μ
μμ μκ° μ’ λ£ μκ°μ μΈ‘μ νλ κΈ°λ₯μ λ£μ΄λ¬λΌκ³ νλ€. λλ€μ κ·Έ ν΄λμ€λ€μ μμ±νλ€.
κ·Έλ¦¬κ³ μ΄λ²μλ λ€λ₯Έ κ³μ°λ‘μ§λ€μ μ¬λ¬κ° λ°μ μμμ΄ μ’ λ£μ΄μ λν λ‘μ§μ ꡬννλ€.
κ·Έλ κ² 1000κ°μ κ³μ°νλ‘κ·Έλ¨μ λ§λ€μλ€κ³ ν΄λ³΄μ. κ·Έλ λ°λ¦¬μΈμ»¨λλ‘ κ΅¬νλΌνλ μκ°μ λ§μ΄ν¬λ‘μΈμ»¨μΌλ‘ μμ νλΌλ
μκ΅¬κ° λ€μ΄μλ€. κ·Έλ¬λ©΄ 1000κ°μ κ³μ° νλ‘κ·Έλ¨μ λ€ μμ ν΄μΌνλ€.
λΆλͺ ν΅μ¬ λ‘μ§μ κ³μ°μΌ κ²μΈλ° λ€λ₯Έ λ‘μ§λλ¬Έμ 골머리λ₯Ό μκ² λ κ²μ΄λ€.
κ·Έλ λ€ κ΄μ μ§ν₯ νλ‘κ·Έλλ°μ κ΄μ μ κ΄μ¬μ¬λ‘λ λ³Ό μ μλ€.
**ν΅μ¬μ μΈ κ΄μ (κ΄μ¬μ¬), λΆκ°μ μΈ κ΄μ (κ΄μ¬μ¬)**λ‘ λλμ΄ λ³Έλ€λ κ²λ μ¬κΈ°μ μ μ μλ€.
μμ μμμμ ν΅μ¬μ μΈ κ΄μ μ κ³μ°λ‘μ§μ΄κ³ λΆκ°μ μΈ κ΄μ μ μκ°μ ꡬνλ λ‘μ§μ΄λ€.
κ·Έλ κ² κ³μ°λ‘μ§κ³Ό μκ°μ ꡬνλ λ‘μ§μ λΆλ¦¬μμΌ κ³μ°λ‘μ§μ μ€νλ§ μμΌμ£Όλ μ½λλ§ μΆκ°νλ©΄ ν΄κ²°ν μΌμ΄λ€.
μ¦, ν΅μ¬ λ‘μ§μ μ§μ€ν μ μλλ‘, νμνμ§λ§ μ€λ³΅ν΄μ μμ±ν΄μΌνλ ν΅μ¬ λ‘μ§ μ΄μΈμ μ½λλ€μΒ μΈλΆλ‘ λΉΌλλ κ²μ΄λ€.
λν, AOPλ ν©μ΄μ§ Aspectλ€μ λͺ¨μ λͺ¨λν νλ κΈ°λ²μ λλ€.
Aspectλ?
-> κ°μ²΄μ§ν₯ μΈμ΄μ ν΄λμ€μ λΉμ·ν κ°λ μ΄λΌκ³ μκ°νλ©΄ μ½λ€.
-> κ·Έ μμ²΄λ‘ μ ν리μΌμ΄μ μ λλ©μΈ λ‘μ§μ λ΄μ ν΅μ¬κΈ°λ₯μ μλμ§λ§, λ§μ μ€λΈμ νΈμ κ±Έμ³ λΆκ°κΈ°λ₯μ μΆμνν΄λμ κ²μ΄λ€.
AOP μ£Όμ κ°λ (μ©μ΄) #
- Aspect: μμμ μ€λͺ ν ν©μ΄μ§ κ΄μ¬μ¬λ₯Ό λͺ¨λν ν κ², μ£Όλ‘ λΆκ°κΈ°λ₯μ λͺ¨λν νλ€.
- Target: Aspectλ₯Ό μ μ©νλ κ³³(ν΄λμ€, λ©μλ λ±λ±)
- Advice: μ€μ§μ μΌλ‘ μ΄λ€ μΌμ ν΄μΌν μ§μ λν κ²μΌλ‘ μ€μ§μ μΈ λΆκ°κΈ°λ₯μ λ΄μ ꡬν체
- JoinPoint: Adviceκ° μ μ©λ μμΉλ‘ λΌμ΄λ€ μ μλ μ§μ .(= λ©μλ μ§μ μ§μ , μμ±μ νΈμΆ μμ , νλμμ κ°μ κΊΌλ΄μ¬ λ λ± λ€μν μμ μ μ μ© κ°λ₯)
- PointCut: JoinPointμ μμΈν μ€νμ μ μν κ². 'Aλ λ©μλμ μ§μ μμ μ νΈμΆν κ²'κ³Ό κ°μ΄ ꡬ체μ μΌλ‘ Adviceκ° μ€νλ μ§μ μ μ ν μ μμ
AOP νΉμ§ #
- νλ‘μ ν¨ν΄ κΈ°λ°μ AOP ꡬν체, νλ‘μ κ°μ²΄λ₯Ό μ°λ μ΄μ λ μ κ·Ό μ μ΄ λ° λΆκ°κΈ°λ₯μ μΆκ°νκΈ° μν΄μμ
νλ‘μ κ°μ²΄λ?
μ¬κΈ°μλ κ°λ¨νκ² νΉμ κ°μ²΄λ₯Ό κ°μΈ νλ‘νΌν°μ μ½κΈ° μ°κΈ°μ κ°μ κ°μ²΄κ° κ°ν΄μ§λ μμ μ μ€κ°μμ κ°λ‘μ±λ κ°μ²΄λΌκ³
κ°λ¨νκ² μκ°ν΄λλ©΄ λλ€. μΌλ¨μ λνμλΌκ³ μκ°νμ κ°λ‘μ±μ§ μμ μ νλ‘μ μ체μμ μ²λ¦¬λκ±°λ μλ κ°μ²΄κ° μ²λ¦¬λλλ‘ κ·Έλλ‘ μ λ¬λκΈ°λ νλ€.
μ€νλ§ λΉμλ§ AOPλ₯Ό μ μ© κ°λ₯
λͺ¨λ AOP κΈ°λ₯μ μ 곡νλ κ²μ΄ μλ μ€νλ§ IoCμ μ°λνμ¬ μν°νλΌμ΄μ¦ μ ν리μΌμ΄μ μμ κ°μ₯ νν λ¬Έμ (μ€λ³΅ μ½λ, νλ‘μ ν΄λμ€ μμ±μ λ²κ±°λ¬μ, κ°μ²΄λ€ κ° κ΄κ³ 볡μ‘λ μ¦κ°...) μ λν ν΄κ²°μ± μ μ§μνλ κ²μ΄ λͺ©μ
@AOP #
@Aspect: μ΄ μ΄λ Έν μ΄μ μ λΆμ¬ μ΄ ν΄λμ€κ° AspectλΌλκ±Έ λνλ΄λ ν΄λμ€λΌ λͺ μν΄ μ€λ€.
@Around: μ΄ μ΄λ Έν μ΄μ μ νκ² λ©μλλ₯Ό κ°μΈ νΉμ Advice(ꡬν체)λ₯Ό μ€ννλ€λ μλ―Έλ€.
e****xecution(* com.saelobi..*.EventService.*(..)) μ΄λ°μμΌλ‘ μ€νμμ μ μ ν΄μ§ μ μλ€.
λν κ²½λ‘μ§μ λ°©μλ§κ³ νΉμ μ΄λ Έν μ΄μ μ΄ λΆμ ν¬μΈνΈμ ν΄λΉΒ Aspectλ₯Ό μ€νν μ μλ κΈ°λ₯λ μ 곡νλ€.
@Around("@annotation(ANNOTATION)")
public class ...
κ·Έλ¦¬κ³ μ€νλ§ λΉμ λͺ¨λ λ©μλμ μ μ©ν μ μλ κΈ°λ₯λ μ 곡νλ€.
@Around("bean(SERVICENAME)")
public class ...
μ΄ μΈμλ @AroundμΈμ νκ² λ©μλμ Aspectλ₯Ό μ€ν μμ μ μ§μ ν μ μλ μ΄λ Έν μ΄μ μ΄ μλ€.
- @Before (μ΄μ ) : μ΄λλ°μ΄μ€ νκ² λ©μλκ° νΈμΆλκΈ° μ μ μ΄λλ°μ΄μ€ κΈ°λ₯μ μν
- @After (μ΄ν) : νκ² λ©μλμ κ²°κ³Όμ κ΄κ³μμ΄(μ¦ μ±κ³΅, μμΈ κ΄κ³μμ΄) νκ² λ©μλκ° μλ£ λλ©΄ μ΄λλ°μ΄μ€ κΈ°λ₯μ μν
- @AfterReturning (μ μμ λ°ν μ΄ν)νκ² λ©μλκ° μ±κ³΅μ μΌλ‘ κ²°κ³Όκ°μ λ°ν νμ μ΄λλ°μ΄μ€ κΈ°λ₯μ μν
- @AfterThrowing (μμΈ λ°μ μ΄ν) : νκ² λ©μλκ° μν μ€ μμΈλ₯Ό λμ§κ² λλ©΄ μ΄λλ°μ΄μ€ κΈ°λ₯μ μν
- @Around (λ©μλ μ€ν μ ν) : μ΄λλ°μ΄μ€κ° νκ² λ©μλλ₯Ό κ°μΈμ νκ² λ©μλ νΈμΆμ κ³Ό νμ μ΄λλ°μ΄μ€ κΈ°λ₯μ μν