μ€νλ§μ λ΄λΆμμ νΈλμμ
κ΄λ¦¬, μΊμ±, 보μ λ±μ μ μΈμ μΈ μλΉμ€λ₯Ό ꡬννκΈ° μν΄ AOP νλ μμν¬λ₯Ό μ 곡νλ€.
AOP(Aspect Oriented Programming)λ νκΈλ‘ "κ΄μ μ§ν₯ νλ‘κ·Έλλ°" λΌκ³ λΆλ₯΄κ³ μ¬λ¬ ν΄λμ€μ λλ μ±
μμ Aspect(κ΄μ )μ΄λΌ λΆλ₯΄λ λ³λμ ν΄λμ€μ μΊ‘μννλ μ κ·Ό λ°©μμ λ§νλ€.
κ·Έλ¦¬κ³ , μ¬λ¬ ν΄λμ€μ κ±Έμ³ μλ μ± μμ Cross-Cutting Concern(ν‘λ¨ κ΄μ¬μ¬) λΌκ³ λΆλ₯Έλ€. (ν‘λ¨ κ΄μ¬μ¬μ μ: λ‘κΉ (logging), νΈλμμ κ΄λ¦¬, μΊμ±, 보μ λ±)
νμλ AOPμ λν΄ μμλ³΄λ € νλλ° ν‘λ¨ κ΄μ¬μ¬λΌλ μ΄μνκ³ μ΄ν΄κ°μ§ μλ λ¨μ΄λ‘ μ λμ κ±Έμ΄μλ€.
ν‘λ¨ κ΄μ¬μ¬μ μλ‘ λ‘κΉ
, νΈλμ μ
κ΄λ¦¬, 보μ λ±μ΄μλ€κ³ νλλ° μ΄λ¬ν λ€μμ λͺ¨λμμ λ°λ³΅μ μΌλ‘ λνλλ λΆλΆμ΄ μ‘΄μ¬νλ€.
μ΄ λ°λ³΅μ μΈ λΆλΆμ ν‘λ¨ κ΄μ¬μ΄λΌ νλλ°, 'λ°λ³΅μ ' μ΄λΌλ λ¨μ΄λ₯Ό κΈ°μ΅νκ³ μλμ μ€λͺ
μ 보μ.
μμ κ·Έλ¦Όμ λ³΄κ³ μ΄ν΄κ° κ°μ λ€λ©΄, μ΄μ λν΄ μ΄λ―Έ μκ³ μκ±°λ Springμ λν΄ μ§μμ νλ μμ€μΌ κ² κ°λ€.
νμλ μ΄ κ·Έλ¦Όμ λ³΄κ³ μ²μμ μ΄ν΄νμ§ λͺ»νλ€.
μμ κ·Έλ¦Όμ 보면 μ κΈ, μΆκΈ, μ΄μ²΄ λΆλΆμμ λ‘κΉ , 보μ, νΈλμμ κ³Ό κ°μ΄ μ€λ³΅ μ½λ©μ΄ μΌμ΄λλ λΆλΆμ ν‘λ¨κ΄μ¬μ΄λΌ μ΄ν΄νλ©΄ μ’μ κ² κ°λ€.
μ½κ² μλ₯Ό λ€μ΄λ³΄κΈ° μν΄ μ΄λ λ¨μμ μ¬μμ ν루λ₯Ό ν΅ν΄ μλ₯Ό λ€μ΄λ³΄κ² λ€.
// λ¨μ1νΈμ ν루
λ¬Έμ μ΄κ³ μ§μ λ€μ΄κ°λ€.
μ»΄ν¨ν°λ‘ κ²μμ νλ€.
μλ±νκ³ μλ€.
λ¬Έμ μ κ·Έκ³ μ§μ λμ λ€.
! μμΈ: μ§μ λΆμ΄λλ€ - 119μ μ κ³ νλ€.
// μ¬μ1νΈμ ν루
λ¬Έμ μ΄κ³ μ§μ λ€μ΄κ°λ€.
μ»΄ν¨ν°λ‘ μνλ₯Ό λ³Έλ€
μλ±νκ³ μλ€.
λ¬Έμ μ κ·Έκ³ μ§μ λμ λ€.
! μμΈ: μ§μ λΆμ΄λλ€ - 119μ μ κ³ νλ€.
λ¨μμ μ¬μμ ν루λ₯Ό 보μμ λ, μ΄λ€ λΆλΆμ΄ μ€λ³΅μΌλ‘ λνλλ ν‘λ¨κ΄μ¬μ¬νμΈμ§ μ μ μμ κ²μ΄λ€.
μμ μ½λμμ λΉ¨κ° λ°μ€μ λΆλΆμ΄ ν‘λ¨κ΄μ¬μ¬ν
μ΄ λκ³ νλ λ°μ€μ λΆλΆμ ν΅μ¬κ΄μ¬μ¬ν
μ΄λΌκ³ νλλ° ν΅μ¬κ΄μ¬μ¬νμ λͺ¨λλ³λ‘ λ€λ₯΄μ§λ§ λͺ¨λλ³λ‘ μ€λ³΅ μ½λ©μ΄ μΌμ΄λλ λΆλΆμ λ§νλ€.
λ§μ΄ 볡μ‘νμ§λ§, μ€νλ§ DIκ° μμ‘΄μ±(new)μ λν μ£Όμ
μ΄λΌλ©΄, AOPλ λ‘μ§(code)μ λν μ£Όμ
μ΄λΌκ³ 보면 μ΄ν΄νκΈ° μμν κ² κ°λ€.
μμ μ½λμ μ΄λ―Έμ§μ²λΌ ν‘λ¨κ΄μ¬μ¬νμ Aspectλ‘ λͺ¨λννκ³ ν΅μ¬μ μΈ λΉμ¦λμ€ λ‘μ§μμ λΆλ¦¬νμ¬ μ¬μ¬μ©νκ² λ€λ κ²μ΄ AOPμ μ·¨μ§μΈ κ²μ΄λ€.
Advice + PointCut = Aspect
μ’ λ₯ | Content |
---|---|
Around | νκ²μ λ©μλκ° νΈμΆλκΈ° μ΄μ (before) μμ κ³Ό μ΄ν(after)μμ μ λͺ¨λ μ²λ¦¬ν΄μΌ ν νμκ° μλ λΆκ° κΈ°λ₯μ μ μνλ€. π Joinpoint μκ³Ό λ€μμ μ€νλλ Advice |
Before | νκ²μ λ©μλκ° μ€νλκΈ° μ΄μ (before) μμ μ μ²λ¦¬ν΄μΌ ν νμκ° μλ λΆκ°κΈ°λ₯μ μ μνλ€. π Jointpoint μμμ μ€νλλ Advice |
After Returning | νκ²μ λ©μλκ° μ μμ μΌλ‘ μ€νλ μ΄ν(after) μμ μ μ²λ¦¬ν΄μΌ ν νμκ° μλ λΆκ°κΈ°λ₯μ μ μνλ€. π Jointpoint λ©μλ νΈμΆμ΄ μ μμ μΌλ‘ μ’ λ£λ λ€μ μ€νλλ Advice |
After Throwing | νκ²μ λ©μλκ° μμΈλ₯Ό λ°μλ μ΄ν(after) μμ μ μ²λ¦¬ν΄μΌ ν νμκ° μλ λΆκ°κΈ°λ₯μ μ μνλ€. π μμΈκ° λμ Έμ§ λ μ€νλλ Advice |
Method | Content |
---|---|
getArgs() | λ©μλ μκ·λ¨ΌνΈλ₯Ό λ°ννλ€. |
getThis() | νλ‘μ κ°μ²΄λ₯Ό λ°ννλ€. |
getTarget() | λμ κ°μ²΄λ₯Ό λ°ννλ€. |
getSignature() | μ΄λλ°μ΄μ¦ λλ λ©μλμ μ€λͺ (description)μ λ°ννλ€. |
toString() | μ΄λλ°μ΄μ¦ λλ λ©μλμ μ€λͺ μ μΆλ ₯νλ€. |
μ€νλ§ AOP νλ μμν¬λ νλ‘μ κΈ°λ°(Proxy-based)μ΄λ€. νλ‘μλ AOP νλ μμν¬μ μν΄ νΈμΆνλ κ°μ²΄μ λμ κ°μ²΄ μ¬μ΄μ λμ λλ μ€κ° κ°μ²΄λ€.
μ€νλ§ AOPμμ λμ κ°μ²΄λ μ€νλ§ μ»¨ν μ΄λμ λ±λ‘λ λΉ μΈμ€ν΄μ€μ΄λ€.
μλμ λ€μ΄μ΄κ·Έλ¨μ μν μλΉμ€λ₯Ό ν΅ν΄ λ‘κΉ
Aspectμ logλ©μλλ₯Ό μλΉμ€ κ°μ²΄μ μ΄λ»κ² μ μ©νλμ§λ₯Ό 보μ¬μ€λ€.
μ€ν μμ μμ νλ‘μλ λμ κ°μ²΄ νΈμΆμ κ°λ‘μ±κ³ λμ λ©μλμ μ μ©ν μ΄λλ°μ΄μ€λ₯Ό μ€ννλ€.
μ΄ λ€μ΄μ΄κ·Έλ¨μ BankAccountService(μνκ³μ’μλΉμ€)μ FixedDepositService(μ κΈ°μκΈμλΉμ€) κ°μ²΄μ λν νλ‘μκ° μμ±λμ΄ κ° λ©μλ(μ¬κΈ°μλ create~~) νΈμΆμ κ°λ‘μ±λ€.
μ€νλ§ AOPλ₯Ό μ¬μ©ν λλ μ€νλ§μ ProxyFactoryBeanμ μ¬μ©ν΄ νλ‘μλ₯Ό λͺ
μμ μΌλ‘ μ¬μ©ν μ μκ³ , μ€νλ§μ΄ AOP νλ‘μλ₯Ό μλμΌλ‘ μμ±νκ² λ§λ€ μλ μλ€. AOP νλ‘μλ₯Ό μ€νλ§ AOPκ° μλμΌλ‘ μμ±νλ κ²½μ°λ₯Ό μλ νλ‘μ μμ±(AutoProxying)
μ΄λΌκ³ νλ€.
μ€νλ§ AOP νλ μμν¬λ JavaSEλ CGLIBμ κΈ°λ°μΌλ‘ νλ‘μλ₯Ό μμ±νλ€.
λμ κ°μ²΄κ° μ무 μΈν°νμ΄μ€μλ ꡬννμ§ μλλ€λ©΄ μ€νλ§ AOPλ CGLIBκΈ°λ° νλ‘μλ₯Ό μμ±νκ³ λμ κ°μ²΄κ° νλ μ΄μμ μΈν°νμ΄μ€λ₯Ό ꡬννλ€λ©΄ JavaSE κΈ°λ°μ νλ‘μλ₯Ό μμ±νκ² λλ€.
β JavaSE: JavaSEλ μλ° νμ€ λΌμ΄λΈλ¬λ¦¬μ μΌλΆλ‘ μ 곡λλ λμ νλ‘μ μμ± κΈ°λ₯μ΄λ€. JavaSE κΈ°λ°μ νλ‘μλ λμ κ°μ²΄κ° νλ μ΄μμ μΈν°νμ΄μ€λ₯Ό ꡬνν λ μμ±λλ€. μ΄λ λμ κ°μ²΄μ μΈν°νμ΄μ€λ₯Ό λ°λ₯΄λ νλ‘μλ₯Ό μμ±νμ¬ λμ κ°μ²΄μ ν΄λΌμ΄μΈνΈ μ¬μ΄μ μ€κ° μν μ μννλ€.
β CGLIB: Code Generation Libraryμ μ½μλ‘, μ€νλ§ AOPμμ νλ‘μλ₯Ό μμ±νλ λ° μ¬μ©λλ λΌμ΄λΈλ¬λ¦¬μ΄λ€. λμ κ°μ²΄κ° μ΄λ ν μΈν°νμ΄μ€λ ꡬννμ§ μμ κ²½μ°, μ€νλ§ AOPλ CGLIB κΈ°λ°μ νλ‘μλ₯Ό μμ±νλ€. CGLIBλ μμμ ν΅ν΄ νλ‘μ κ°μ²΄λ₯Ό μμ±νκΈ° λλ¬Έμ λμ κ°μ²΄μ νμ ν΄λμ€λ₯Ό μμ±νκ³ , νλ‘μ κ°μ²΄λ λμ κ°μ²΄μ κΈ°λ₯μ μμλ°μμ μ¬μ©νλ€.
π κ°λ¨ν λ§νλ©΄, JavaSE κΈ°λ°μ νλ‘μλ μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘ λμνλ©°, CGLIB κΈ°λ°μ νλ‘μλ μΈν°νμ΄μ€ μμ΄λ λμν μ μλ€. μ€νλ§ AOPλ λμ κ°μ²΄μ νΉμ±μ λ°λΌ μ μ ν νλ‘μλ₯Ό μ ννμ¬ μμ±νλ€.
π λ°°μμ λ°λ‘ μ°λ μ€νλ§ νλ μμν¬
π¨π»βπ» μ¬λ¦λλΌκ²¨μΈμ΄μΌκΈ°λμ λΈλ‘κ·Έ: AOP - Aspect
π¨π»βπ» μλ‘λΉλμ λΈλ‘κ·Έ: μ€νλ§ AOP κ°λ
π¨π»βπ» "IT is True"λμ λΈλ‘κ·Έ: μ€νλ§ AOP μ©μ΄ μ 리