AOP(Aspect-Oriented Programming)
κ΄μ μ§ν₯ νλ‘κ·Έλλ°
μ ν리μΌμ΄μ λ‘μ§μ ν¬κ² ν΅μ¬ κΈ°λ₯κ³Ό λΆκ° κΈ°λ₯μΌλ‘ λλ μ μλ€. λ³΄ν΅ λΆκ° κΈ°λ₯μ μ¬λ¬ ν΄λμ€μ κ±Έμ³ μ¬μ©λλ κ²½μ°κ° λ§μ μ€λ³΅ μ½λκ° λ°μνμ¬ μ μ§λ³΄μκ° μ΄λ €μμ§λ©°, ν΅μ¬ κΈ°λ₯μ μ½λλ₯Ό νλ¦¬κ² λ§λ λ€. λλ¬Έμ μ΄λ₯Ό λΆλ¦¬νλ €λ μλλ₯Ό νκΈ° μμνκ³ , λΆκ°μ μΈ κΈ°λ₯μ λΆλ¦¬νμ¬ μ€κ³νμ¬ κ°λ° νλ λ°©λ²μ κ΄μ μ§ν₯ νλ‘κ·Έλλ°(AOP)μ΄λΌκ³ νλ€.
μ©μ΄ μ 리
μ΄λλ°μ΄μ€(Advice)
μ 곡ν λΆκ° κΈ°λ₯
μ‘°μΈ ν¬μΈνΈ(Join point)
μ΄λλ°μ΄μ€κ° μ μ©λ μ μλ μ§μ
λ©μλ μ€ν, μμ±μ νΈμΆ, νλ κ° μ κ·Ό, static λ©μλ μ κ·Ό λ± νΉμ μ§μ λͺ¨λ κ°λ₯(= AOPλ₯Ό μ μ©ν μ μλ μ§μ )
ν¬μΈνΈμ»·(Pointcut)
μ‘°μΈ ν¬μΈνΈ μ€μμ μ΄λλ°μ΄μ€κ° μ μ©λ μμΉλ₯Ό μ λ³νλ κΈ°λ₯
μ£Όλ‘ AspectJ ννμμ μ¬μ©ν΄μ μ§μ
νκ²(Target)
μ΄λλ°μ΄μ€κ° μ μ©λλ λμ κ°μ²΄
μ μ€ννΈ(Aspect)
μ΄λλ°μ΄μ€ + ν¬μΈνΈμ»·μ λͺ¨λν ν κ²
μ€νλ§μμλ 보ν΅
@Aspect
μ λ Έν μ΄μ μ ν΅ν΄ μ μ©
μ΄λλ°μ΄μ (Advisor)
νλμ μ΄λλ°μ΄μ€μ νλμ ν¬μΈνΈ μ»·μΌλ‘ κ²°ν©λ κ²
μ€νλ§ AOPμμλ§ μ¬μ©λλ νΉλ³ν μ©μ΄
μλΉ(Weaving)
ν¬μΈνΈμ»·μΌλ‘ κ²°μ ν νμΌμ μ‘°μΈ ν¬μΈνΈμ μ΄λλ°μ΄μ€λ₯Ό μ μ©νλ κ³Όμ
AOP νλ‘μ(AOP Proxy)
AOP κΈ°λ₯μ ꡬννκΈ° μν΄ λ§λ νλ‘μ κ°μ²΄
μ€νλ§μμμ AOP
μ€νλ§μμλ AOPλ₯Ό ꡬννκΈ° μν΄ μ¬λ¬ κ°μ§ κΈ°μ λ€μ μ 곡νκ³ μμΌλ©°, μ΅κ·Όμ @Aspect
μ λ
Έν
μ΄μ
μ μ¬μ©νλ κ²μ κ°μ₯ λ§μ΄ μ¬μ©νκ³ μλ€.
λν νλμ λΆκ° κΈ°λ₯λ§ μ 곡ν μ μλ κ²μ΄ μλλΌ μ²΄μΈ ννλ‘ κ΅¬μ±νμ¬ μ¬λ¬ κ°μ λΆκ° κΈ°λ₯μ μ 곡ν μ μλ€.
JDK λμ νλ‘μ / CGLIB
μ€νλ§μμ νλ‘μ ν¨ν΄μ ꡬννλ κ°μ₯ κΈ°λ³Έμ μΈ λ°©λ²μ JDK λμ νλ‘μμ CGLIBκ° μλ€. λ λ°©λ²μ μ¬μ©νκΈ° λΆνΈνκ³ λ³΅μ‘νκΈ° λλ¬Έμ μ§μ μ μΌλ‘ μ¬μ©νλ κ²½μ°λ μμ§λ§, μ€νλ§ νλ μμν¬μμλ μ΄λ₯Ό ν΅μ¬ κΈ°μ λ‘ νμ©νμ¬ νΈλ¦¬νκ² μ¬μ©ν μ μλλ‘ μΆμνλ κΈ°λ₯μ μ 곡νκ³ μλ€.
JDK λμ νλ‘μ
μλ° μΈμ΄μμ κΈ°λ³ΈμΌλ‘ μ 곡νλ νμ€ λΌμ΄λΈλ¬λ¦¬ λμ νλ‘μ κΈ°μ λ‘ μΈν°νμ΄μ€ κΈ°λ° νλ‘μ μμ±νλ λ°©λ²
μΈν°νμ΄μ€κ° μμΌλ©΄ νλ‘μ μμ± λΆκ°λ₯ν νκ³ μ‘΄μ¬
InvocationHandler
μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ νλ‘μ κ°μ²΄ μμ± λ° λμ μ μ
CGLIB
λ°μ΄νΈ μ½λλ₯Ό μ‘°μνμ¬ νλ‘μ μν μ νλ ν΄λμ€λ₯Ό λ§λ€μ΄μ£Όλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ νλ‘μ ν¨ν΄μ ꡬννλ λ°©λ²
ν΄λμ€ μμ λ°©μμΌλ‘ ꡬννκΈ° λλ¬Έμ μΈν°νμ΄μ€κ° μμ΄λ νλ‘μ ν¨ν΄ ꡬν κ°λ₯
ν΄λμ€λ λ©μλμ
final
ν€μλκ° μμΌλ©΄ μμμ΄ λΆκ°λ₯νκ±°λ μ€λ²λΌμ΄λ©μ΄ λΆκ°λ₯νκΈ° λλ¬Έμfinal
ν€μλκ° μλ ν΄λμ€λ λ©μλλ§ μ μ© κ°λ₯MethodInterceptor
μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ λμμ μ μ
μμ μ½λμμ λ³Ό μ μλ―μ΄ νλ‘μ ν¨ν΄μ ꡬνν΄μΌνλ μΈν°νμ΄μ€κ° λ€λ₯΄κΈ° λλ¬Έμ ꡬννλλ° λ³΅μ‘μ±μ κ°μ§λ€. μ€νλ§μμλ μ΄λ₯Ό μΆμνμμΌ νλ‘μλ₯Ό μμ±νλ λ°©λ²μ ν΅μΌνμ¬ μ¬μ©ν μ μλλ‘ Proxy Factoryλ₯Ό μ 곡νλ€.
Proxy Factory
Proxy Factoryλ μ€νλ§μμ νλ‘μ κ°μ²΄λ₯Ό μμ±νκ³ μμ²μ μ²λ¦¬νλ λ°©λ²μ ν΅μΌνμ¬ μ¬μ©ν μ μλλ‘ μΆμνν κ²μ΄λ€. μΈν°νμ΄μ€ μ 무 νΉμ μ΅μ μ λ°λΌ JDK λμ νλ‘μμ CGLIBλ₯Ό μ¬μ©νμ¬ νλ‘μ ν¨ν΄μ ꡬνν΄μ£Όλ κΈ°λ₯μ μ 곡νλ€.
νλ‘μ μμ±(Proxy Factory)κ³Ό μμ±λ νλ‘μμ μμ²(Advice Call)μ νκ² λλ©΄ μμ κ°μ νλ¦μΌλ‘ λμνκ² λλ€.
Proxy Factoryλ₯Ό μ΄μ©ν μμ μ½λ
μ΄ λ°©λ²μΌλ‘ μμ± λ°©λ²μ ν΅μΌλμμ§λ§, μ μ©ν λ©μλλ₯Ό νλνλ μλμΌλ‘ λ±λ‘ν΄μ£Όμ΄μΌ νκΈ° λλ¬Έμ μ€μ μ½λ μ체λ κΈΈμ΄μ§λ©°, μ»΄ν¬λνΈ μ€μΊμ νλ κ²½μ° νλ‘μ κ°μ²΄ μμ±μ΄ λΆκ°λ₯νλ€λ νκ³κ° μ‘΄μ¬νλ€. λλ¬Έμ μ»΄ν¬λνΈ μ€μΊμ ν¬ν¨ν λ±λ‘λλ λΉλ€μ λν΄ νλ‘μ κ°μ²΄λ₯Ό μ μ©νλ λΉ νμ²λ¦¬κΈ° λ°©λ²μ΄ λ±μ₯νκ² λμλ€.
λΉ νμ²λ¦¬κΈ°
λΉ νμ²λ¦¬κΈ°λ₯Ό μ΄μ©νλ©΄ μ»΄ν¬λνΈ μ€μΊμ ν¬ν¨ν λ±λ‘λλ λΉλ€μ λν΄ νλ‘μ κ°μ²΄λ₯Ό μ μ©νμ¬ λ±λ‘ν μ μλ€. λν μ μ© λ λΉμ νν°λ§ν μ μκΈ° λλ¬Έμ νΉμ λΉμλ§ νλ‘μλ₯Ό μ μ©ν μ μκ² λλ€.
νμ§λ§ μ΄ λ°©λ²μ μ¬μ©νλλΌλ ν¬μΈνΈ μ»·(=λΉ νμ²λ¦¬κΈ°)κ³Ό μ΄λλ°μ΄μ€(=Proxy Factory)λ₯Ό λ³λλ‘ μ μν΄μΌ νκΈ° λλ¬Έμ μ¬μ ν 볡μ‘νκ³ κ΄λ¦¬νκΈ° μ΄λ ΅λ€λ λ¨μ μ΄ μ‘΄μ¬νλ€.
@Aspect
νλ‘μλ₯Ό μ§μ μμ±νμ¬ κ΅¬ννλ λ°©λ²μ΄ μλ CGLibλ₯Ό μ¬μ©νμ¬ λ°μ΄νΈ μ½λλ₯Ό μ‘°μνμ¬ κΈ°λ₯μ μ 곡νλ λ°©λ²μΌλ‘, κ°μ₯ κ°λ¨νκ² AOPλ₯Ό ꡬνν μ μλ λ°©λ²μ΄λ€. ν¬μΈνΈμ»·(Pointcut)κ³Ό μ΄λλ°μ΄μ€(Advice)λ‘ κ΅¬μ±λ μ΄λλ°μ΄μ (Advisor)μ μμ±μ νΈλ¦¬νκ² ν΄μ£Όλ κΈ°λ₯μ κ°μ§ μ΄λ Έν μ΄μ μ ν΅ν΄ ν¨μ¬ κ°λ¨νκ² λΆκ° κΈ°λ₯μ μ 곡ν μ μλ€.
@Aspectμ λμ λ°©μ
@Aspectλ₯Ό μ¬μ©νμ¬ νλ‘μ κ°μ²΄λ₯Ό μ μ©ν λ, μ΄λλ°μ΄μ μμ±κ³Ό νλ‘μ κ°μ²΄ μ μ©μ λ€μκ³Ό κ°μ νλ¦μΌλ‘ λμνκ² λλ€.
μ΄λλ°μ΄μ μμ±
μ€νλ§ μ€ν ν
@Aspect
μ λ Έν μ΄μ μ΄ λΆμ λΉ μ‘°ν@Aspect
μ λ Έν μ΄μ μ 보λ₯Ό κΈ°λ°μΌλ‘ μ΄λλ°μ΄μ μμ±μ΄λλ°μ΄μ λ±λ‘
νλ‘μ κ°μ²΄ μ μ©
μ€νλ§ λΉ λμμ΄ λλ κ°μ²΄ μμ±
μμ±λ κ°μ²΄λ€μ μ€νλ§ λΉ μ»¨ν μ΄λ λ±λ‘νκΈ° μ λΉ νμ²λ¦¬κΈ°μ μ λ¬
μ€νλ§ λΉ μ»¨ν μ΄λμμ μ΄λλ°μ΄μ μ‘°ν
μ΄λλ°μ΄μ μ λ±λ‘λ ν¬μΈνΈμ»·μ ν΅ν΄ νλ‘μ μ μ© λμμΈμ§ νμΈ(ν΄λμ€ λ΄μ νλ μ΄μμ λ©μλκ° μ‘΄μ¬νλ©΄ νλ‘μ μ μ© λμ)
νλ‘μ ν©ν 리λ₯Ό ν΅ν΄ νλ‘μ κ°μ²΄ μμ±
νλ‘μ κ°μ²΄λ₯Ό μ€νλ§ λΉ μ»¨ν μ΄λμ λ±λ‘
νλ‘μ λ΄λΆ νΈμΆ(Self Invocation)
νλ‘μλ₯Ό μ μ©νμλλΌλ, λμ κ°μ²΄μ λ΄λΆμμ λ©μλ νΈμΆμ νκ² λλ©΄ νλ‘μλ₯Ό κ±°μΉμ§ μκ³ λμ κ°μ²΄λ₯Ό μ§μ νΈμΆνκ² λμ΄ νλ‘μ κΈ°λ₯μ΄ μ μ©λμ§ μλ λ¬Έμ κ° λ°μνλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μ νλ‘μλ₯Ό μ¬μ©νλ κ²μ΄ μλ μ€μ μ½λμ AOPλ₯Ό μ§μ μ μ©νλ λ°©λ²λ μμΌλ, 볡μ‘νκΈ° λλ¬Έμ κ·Έλλ‘ νλ‘μλ₯Ό μ°λ©΄μ λ¬Έμ λ₯Ό ννΌνλ λ°©λ²μ μ¬μ©νλ€.
μκΈ° μμ μ£Όμ
μ§μ° μ‘°ν
ꡬ쑰 λ³κ²½(μ€νλ§μμ κΆμ₯νλ λ°©λ²)
μ€νλ§κ³Ό CGLIB
μ΅μ λ²μ μ μ€νλ§ λΆνΈμμλ νλ‘μ κ°μ²΄λ₯Ό μμ±ν λ κΈ°λ³Έμ μΌλ‘ CGLIBλ₯Ό μ¬μ©νλλ°, μ΄λ₯Ό ν΅ν΄ μλμ κ°μ μ₯μ μ κ°μ§κ² λλ€.
μΈν°νμ΄μ€κ° μλ ν΄λμ€λ νλ‘μλ‘ λ§λ€ μ μμ
μμ‘΄κ΄κ³ μ£Όμ μ λ¬Έμ κ° λ°μνμ§ μμ(JDK λμ νλ‘μλ λ°μ)
νμ§λ§ CGLIBλ ν΄λμ€λ₯Ό μμλ°μ μμ±νλ λ°©μμ΄κΈ° λλ¬Έμ λ€μκ³Ό κ°μ μ μ½μ¬νμ΄ μ‘΄μ¬νμ§λ§ 3λ²μ μ μΈνκ³ λ μ΄λ―Έ ν΄κ²°λμλ€.(objenesis
λΌλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ ν΄κ²°)
λμ ν΄λμ€μ κΈ°λ³Έ μμ±μκ° λ°λμ μ‘΄μ¬ν΄μΌ ν¨
μμ±μ νΈμΆμ΄ λ λ² λ°μ(μ€μ κ°μ²΄λ₯Ό μμ±ν λ + νλ‘μ κ°μ²΄λ₯Ό μμ±ν λ)
final ν΄λμ€, final λ©μλκ° μλ κ²½μ° νλ‘μλ₯Ό μμ±ν μ μμ
3λ² λ¬Έμ λ μμ§ ν΄κ²°νμ§ λͺ»νμΌλ λλΆλΆμ κ²½μ° final ν€μλλ₯Ό μ μ¬μ©νμ§ μκΈ° λλ¬Έμ ν° λ¬Έμ κ° λμ§ μλλ€.
ETC
νλ‘μ κ°μ²΄λ μ€νλ§ μ»¨ν μ΄λκ° κ΄λ¦¬νκ³ μλ° ν λ©λͺ¨λ¦¬μλ μ¬λΌκ°μ§λ§, μ€μ κ°μ²΄λ μλ° ν λ©λͺ¨λ¦¬μλ μ¬λΌκ°μ§λ§ μ€νλ§ μ»¨ν μ΄λκ° κ΄λ¦¬νμ§λ μλλ€.
μ°Έκ³ μλ£
Last updated
Was this helpful?