Spring Core Advanced
μνλμ μ€νλ§ ν΅μ¬ μ리 - κ³ κΈνΈ κ°μλ₯Ό μμ½ν λ΄μ©μ λλ€.
βοΈ ThreadLocal
λμμ± λ¬Έμ
λ€μμ μ°λ λκ° λμμ κ°μ μΈμ€ν΄μ€ νλ κ°μ λ³κ²½νλ©΄μ λ°μνλ λ¬Έμ
μ€νλ§ λΉμ²λΌ μ±κΈν€ κ°μ²΄μ νλλ₯Ό λ³κ²½νλ©° μ¬μ©ν λ μ£Όμ
ThreadLocal
νΉμ μ€λ λλ§ μ κ·Όν μ μλ νΉλ³ν μ μ₯μ
κ° μ€λ λλ§λ€ λ³λμ λ΄λΆ μ μ₯μ μ 곡
νΉμ μ€λ λ λ‘컬μ λͺ¨λ μ¬μ©λ©΄
ThreadLocal.remove()
νΈμΆλ‘ μ μ₯λ κ°μ λ°λμ μ κ±°μ€λ λ νμ μ¬μ©ν κ²½μ°(ex. WAS) μ€λ λ λ‘컬 κ°μ μ κ±°νμ§ μμΌλ©΄, μ¬μ©μBκ° μ¬μ©μA λ°μ΄ν°λ₯Ό μ‘°ννκ² λλ λ¬Έμ λ°μ
μ€λ λλ μ€λ λ νμ ν΅ν΄ μ¬μ¬μ©λμ§ λλ¬Έμ μ€λ λ λ‘컬μμ μ κ±°λμ§ μκ³ λ¨μμλ λ°μ΄ν°λ₯Ό λ€λ₯Έ μ¬μ©μκ° μ‘°νν μ μκ² λλ€.
Template Method Pattern
λ€νμ±(μμκ³Ό μ€λ²λΌμ΄λ©)μ νμ©ν΄μ λ³νλ λΆλΆ
(ν΅μ¬ κΈ°λ₯)κ³Ό λ³νμ§ μλ λΆλΆ
(λ‘κ·Έ μΆμ κΈ°, νΈλμμ
..)μ λΆλ¦¬
νλ λμμΈ ν¨ν΄
ꡬ쑰
μΈμ€ν΄μ€ νΈμΆ κ³Όμ
λΆλͺ¨ ν΄λμ€μ ν νλ¦Ώ(λ³νμ§ μλ λΆλΆ)μ μ μνκ³ , μΌλΆ λ³κ²½λλ λ‘μ§μ μμ ν΄λμ€μ μ μ
μμ ν΄λμ€κ° μ 체 ꡬ쑰λ₯Ό λ³κ²½νμ§ μκ³ , νΉμ λΆλΆλ§ μ¬μ μ
κ²°κ΅ μμκ³Ό μ€λ²λΌμ΄λ©μ ν΅ν λ€νμ±μΌλ‘ λ¬Έμ ν΄κ²°
ν΄λμ€λ λ¨ ν κ°μ μ± μμ κ°μ ΈμΌ νλ€λ
λ¨μΌ μ± μ μμΉ
(Single Responsibility Principle)μ μ μ§ν€λ ν¨ν΄λ¨, μμμμ μ€λ λ¨μ λ€μ΄ μ‘΄μ¬
κ°ν μμ‘΄μ±μΌλ‘ λΆλͺ¨ ν΄λμ€μ κΈ°λ₯μ μ¬μ©νμ§ μλλΌλ λΆλͺ¨ ν΄λμ€λ₯Ό μμμΌ νκ³
λΆλͺ¨ ν΄λμ€λ₯Ό μμ νλ©΄ μμ ν΄λμ€μ μν₯μ μ€ μ μμ
μμ κ΅¬μ‘°λ‘ μΈν΄ μμ±λλ ν΄λμ€λ μ΅λͺ λ΄λΆ ν΄λμ€μ 볡μ‘μ±
μ΅λͺ λ΄λΆ ν΄λμ€
μ§μ μ΄λ¦μ΄ μκ³ ν΄λμ€ λ΄λΆμ μ μΈλλ ν΄λμ€
κ°μ²΄ μΈμ€ν΄μ€ μμ±κ³Ό λμμ μμ±ν ν΄λμ€λ₯Ό μμ λ°μ μμ ν΄λμ€ μ μ
Template Example
Strategy Pattern
Template Method Pattern μ μμμΌλ‘ μΈν λ¨μ μ μμμΌλ‘
ν΄κ²°ν λμμΈ ν¨ν΄
ꡬ쑰
μ λ΅ ν¨ν΄ μ€ν κ³Όμ
λ³νμ§ μλ λΆλΆμ Context(λ³νμ§ μλ ν νλ¦Ώ)μ, λ³νλ λΆλΆμ Strategy(λ³νλ μκ³ λ¦¬μ¦) μΈν°νμ΄μ€μ λκ³ , ν΄λΉ ꡬν체λ₯Ό ν΅ν΄ λ¬Έμ λ₯Ό ν΄κ²°
Contextμ μνλ Strategy ꡬν체 μ£Όμ
ν΄λΌμ΄μΈνΈλ Context μ€ν
Contextλ Context λ‘μ§ μμ
Context λ‘μ§ μ€κ°μ strategy.call() νΈμΆλ‘ μ£Όμ λ°μ Strategy λ‘μ§ μ€ν
Contextλ λλ¨Έμ§ λ‘μ§ μ€ν
μ΅λͺ ν΄λμ€ μ¬μ©
Context/Strategy μ 쑰립, ν μ€ν λ°©μμ μ ν©
νλμ Strategy μ μ₯ λ°©μμ μ λ΅ ν¨ν΄
ν λ² μ‘°λ¦½ μ΄ν Context μ€νλ§ νλ©΄ λ
μ€νλ§ λ‘λ© μμ μ μμ‘΄κ΄κ³ μ£Όμ μ ν΅ν΄ 쑰립 ν μμ²μ μ²λ¦¬νλ κ²κ³Ό μ μ¬
λ¨μ μ, 쑰립 μ΄νμ μ λ΅ λ³κ²½μ΄ λ²κ±°λ‘μ (μ±κΈν€ μ¬μ© μ λμμ± μ΄μ λ± κ³ λ € μ¬νμ΄ μ‘΄μ¬)
Template Callback Pattern
μ λ΅μ νλλ‘ κ°μ§μ§ μκ³ νλΌλ―Έν°λ‘ μ λ¬
μ λ΅ ν¨ν΄μμ ν νλ¦Ώκ³Ό μ½λ°± λΆλΆμ΄ κ°μ‘°λ ν¨ν΄(GOF ν¨ν΄μ μλκ³ μ€νλ§ λ΄λΆμμ λΆλ¦¬μ)
μ½λκ° Call μ΄ν μ½λλ₯Ό λκ²¨μ€ κ³³μ Back μμ μ€ν(CallBack..)
μ€νλ§μμ XxxTemplate(JdbcTemplate, RestTemplate, TransactionTemplate, RedisTemplate) ννλ ν νλ¦Ώ μ½λ°± ν¨ν΄μ΄ μ¬μ©λμ΄ λ§λ€μ΄μ§ ν΄λμ€
νλΌλ―Έν°μ Strategy μ λ¬ λ°©μμ μ λ΅ ν¨ν΄
μ€νν λλ§λ€ μ λ΅μ μ μ°νκ² λ³κ²½
λ¨μ μ, μ€νν λλ§λ€ μ λ΅μ κ³μ μ§μ ν΄ μ£Όμ΄μΌ νλ λ²κ±°λ‘μ
μ½λ°±μ μ¬μ©ν κ²½μ° μ΅λͺ λ΄λΆ ν΄λμ€λ λλ€λ₯Ό μ¬μ©νλ κ²μ΄ νΈλ¦¬
λ¨, μ¬λ¬ κ³³μμ ν¨κ» μ¬μ©λ κ²½μ° μ¬μ¬μ©μ μν΄ μ½λ°±μ λ³λμ ν΄λμ€λ‘ λ§λλκ² μ’μ
Context -> Template
Strategy -> Callback
Example
μ μ©
Proxy
νλ‘μμ μ£Όμ κΈ°λ₯
μ κ·Ό μ μ΄
κΆνμ λ°λ₯Έ μ κ·Ό μ°¨λ¨
μΊμ±
μ§μ° λ‘λ©
λΆκ° κΈ°λ₯ μΆκ°
κΈ°μ‘΄ μ 곡 κΈ°λ₯μ λΆκ° κΈ°λ₯ μν
ex. μμ²/μλ΅ κ° λ³ν, μΆκ° λ‘κ·Έ
λ¨μ
λμ ν΄λμ€λ§ λ€λ₯Ό λΏ λ‘μ§μ μ μ¬νκ³ , λμ ν΄λμ€ κ°μλ§νΌ νλ‘μ ν΄λμ€ μμ± νμ
λμ νλ‘μ κΈ°μ
μ ν΅ν΄ νλ‘μ ν΄λμ€λ₯Ό νλλ§ λ§λ€μ΄μ λͺ¨λ κ³³μ μ μ© κ°λ₯
Proxy Pattern
νλ‘μλ₯Ό μ μ©νμ¬ μ κ·Όμ μ μ΄νλ ν¨ν΄
μλ(intent) : λ€λ₯Έ κ°μ²΄μ λν μ κ·Όμ μ μ΄νκΈ° μν΄ λ리μ μ 곡
μ€μ κ°μ²΄μ ν΄λΌμ΄μΈνΈμ μ½λλ₯Ό λ³κ²½νμ§ μκ³ , νλ‘μ λμ μΌλ‘ μ κ·Όμ μ μ΄
μ€μ ν΄λΌμ΄μΈνΈ μ μ₯μμ νλ‘μ κ°μ²΄κ° μ£Όμ λμλμ§, μ€μ κ°μ²΄κ° μ£Όμ λμλμ§ μ μ μμ
νλ‘μ κ°μ²΄
νλ‘μ κ°μ²΄ μ μ©
Decorator Pattern
νλ‘μλ₯Ό μ μ©νμ¬ λΆκ° κΈ°λ₯μ μΆκ°νλ ν¨ν΄
μλ(intent) : κ°μ²΄μ μΆκ° μ± μ(κΈ°λ₯)μ λμ μΌλ‘ μΆκ°νκ³ , κΈ°λ₯ νμ₯μ μν μ μ°ν λμ μ 곡
client -> messageDecorator(proxy) -> realComponent κ°μ²΄ μμ‘΄
client -> timeDecorator(proxy) -> messageDecorator(proxy) -> realComponent κ°μ²΄ μμ‘΄
μ μ©
νλ‘μλ₯Ό μ¬μ©ν΄ κΈ°μ‘΄ μ½λλ₯Ό μμ νμ§ μκ³ μλ‘μ΄ κΈ°λ₯μ λμ
μ€μ κ°μ²΄ λμ νλ‘μ κ°μ²΄λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘(νλ‘μ λ΄λΆμμ μ€μ κ°μ²΄ μ°Έμ‘°)
νλ‘μ κ°μ²΄
λ μ€νλ§ μ»¨ν μ΄λκ° μ€νλ§ λΉμΌλ‘ κ΄λ¦¬νκ³ μλ° ν λ©λͺ¨λ¦¬μ μ¬λΌκ°λ λ°λ©΄μ€μ κ°μ²΄
λ μλ° ν λ©λͺ¨λ¦¬μλ μ¬λΌκ°μ§λ§ μ€νλ§ μ»¨ν μ΄λκ° κ΄λ¦¬νμ§ μμνλ‘μ κ°μ²΄λ₯Ό ν΅ν΄μ μ°Έμ‘°λλ μ‘΄μ¬
μΈν°νμ΄μ€μ ꡬν ν΄λμ€(μ€νλ§ λΉ μλ λ±λ‘)
μΈν°νμ΄μ€ κΈ°λ° νλ‘μ λμ
νλ‘μ ν΄λμ€λ₯Ό λ€μ μμ±ν΄μΌ νλ λ¨μ μ‘΄μ¬
μΈν°νμ΄μ€ μλ ꡬ체 ν΄λμ€(μ€νλ§ λΉ μλ λ±λ‘)
ν΄λμ€ κΈ°λ° νλ‘μ λμ
μΈν°νμ΄μ€κ° μλλΌλ λ€νμ±μΌλ‘ ν΄λμ€λ₯Ό μμλ°μμ νλ‘μλ₯Ό μ μ©
μΈν°νμ΄μ€ κΈ°λ° νλ‘μμ λΉν΄ μ¬λ¬ λ¨μ μ΄ μ‘΄μ¬
λΆλͺ¨ ν΄λμ€μ μμ±μ νΈμΆ νμ
final ν΄λμ€ μμ λΆκ°
final λ©μλ μ€λ²λΌμ΄λ© λΆκ°
μ»΄ν¬λνΈ μ€μΊ μ€νλ§ λΉ μλ λ±λ‘
λμ νλ‘μ
리νλ μ
ν΄λμ€/λ©μλ
λ©νμ 보
λ₯Όλμ μΌλ‘ νλ
νκ³ , μ½λλ₯Όλμ μΌλ‘ νΈμΆ
λ°νμμ λμνλ―λ‘ μ»΄νμΌ μμ μ μ€λ₯λ₯Ό μ‘μ μ μλ λ¨μ
μΌλ°μ μΌλ‘ μ¬μ©νμ§ μλ κ²μ΄ μ’κ³ , νλ μμν¬ κ°λ°μ΄λ μΌλ°μ μΈ κ³΅ν΅ μ²λ¦¬κ° νμν κ²½μ° λΆλΆμ μΌλ‘ μ£Όμν΄μ μ¬μ©
JDK λμ νλ‘μ
λμ ν΄λμ€μ μΈν°νμ΄μ€κ° μμ κ²½μ°(μΈν°νμ΄μ€ κΈ°λ° νλ‘μ)
μΈν°νμ΄μ€ κΈ°λ°
λμ νλ‘μ μμ±(λ°νμ)κ°κ°μ λμ κ°μ²΄ νλ‘μλ₯Ό μ§μ λ§λ€μ§ μκ³ , νλ‘μ λμ μμ±(JDK λμ νλ‘μ) ν
InvocationHandler
μΈν°νμ΄μ€ ꡬν체(νλ‘μ λ‘μ§ μ μ) νλλ₯Ό κ³΅ν΅ μ¬μ©λμ νλ‘μλ νΈλ€λ¬ λ‘μ§λ§ νΈμΆνκ³ λ©μλμ μΈμλ₯Ό κ°μ§κ³ μ€ν
κ°μ²΄μ μΈν°νμ΄μ€κ° λ°λμ νμν΄μ, ν΄λμ€λ§ μλ κ²½μ°μλ μ μ©ν μ μλ νκ³
InvocationHandler.java
TimeInvocationHandler.java (InvocationHandler μΈν°νμ΄μ€ ꡬν체)
Object proxy : νλ‘μ μμ
Method method : νΈμΆν λ©μλ
Object[] args : λ©μλλ₯Ό νΈμΆν λ μ λ¬ν μΈμ
μ μ© μμ
μ€ν μμ
JDK λμ νλ‘μμ call() μ€ν
proxy.call();
JDK λμ νλ‘μλ
InvocationHandler.invoke()
νΈμΆTimeInvocationHandler λ΄λΆ λ‘μ§ μν λ°
method.invoke(target, args)
νΈμΆ.targetμ μ€μ κ°μ²΄ AImpl μΈμ€ν΄μ€μ
call()
μ€νAImpl μΈμ€ν΄μ€μ call() μ€νμ΄ λλλ©΄ TimeInvocationHandler μλ΅
μ μ©
CGLIB
λμ ν΄λμ€μ μΈν°νμ΄μ€κ° μμ κ²½μ°(ꡬ체 ν΄λμ€ κΈ°λ° νλ‘μ)
μΈν°νμ΄μ€ μμ΄
ꡬ체 ν΄λμ€ κΈ°λ°
(μμ) λμ νλ‘μ μμ±μμ μ¬μ©μΌλ‘ μΈν μ μ½
λΆλͺ¨ ν΄λμ€μ κΈ°λ³Έ μμ±μ νμ
final ν΄λμ€λ μμ λΆκ°
final λ©μλλ μ€λ²λΌμ΄λ© λΆκ°
JDK λμ νλ‘μ μ€ν λ‘μ§μ InvocationHandlerλ₯Ό μ 곡νλ―,
MethodInterceptor
μ 곡
MethodInterceptor.java
Spring Proxy Factory
νλ‘μ μμ±μ ProxyFactory
λ‘μ§μ Advice
λ¨μ λ¬Έμ μ .. -> λΉ νμ²λ¦¬κΈ°λ‘ μ²λ¦¬ κ°λ₯
λ무 λ§μ μ€μ μ΄ νμ
μ€νλ§ λΉμ΄ 100κ° μλ€λ©΄, νλ‘μ λΆκ° κΈ°λ₯ μ μ©μ μν΄ 100κ°μ λμ νλ‘μ μμ± νμ
μ»΄ν¬λνΈ μ€μΊμ μ¬μ©νλ κ²½μ° Proxy Factory μ μ© λΆκ°λ₯
μ€μ κ°μ²΄κ° μ€νλ§ μ»¨ν μ΄λ μ€νλ§ λΉμΌλ‘ λ±λ‘λ μνμ΄λ―λ‘
γ μΈν°νμ΄μ€κ° μλ κ²½μ° JDK λμ νλ‘μ, κ·Έλ μ§ μμ κ²½μ°μλ CGLIB μ μ©
λμ νλ‘μλ₯Ό ν΅ν©ν΄μ λ§λ€μ΄μ£Όλ
ProxyFactory
μ 곡μΈν°νμ΄μ€κ° μμΌλ©΄ JDK λμ νλ‘μ μ¬μ©, ꡬ체 ν΄λμ€λ§ μλ€λ©΄ CGLIB μ¬μ©(default)
γ JDK λμ νλ‘μ, CGLIB λ₯Ό ν¨κ» μ¬μ©ν κ²½μ° λΆκ° κΈ°λ₯ μ μ©
InvocationHandler,MethodInterceptor λ₯Ό μ κ²½μ°μ§ μκ³ ,
Advice
λ§ μμ±org.aopalliance.intercept.
MethodInterceptor
ꡬνμΌλ‘ Advice μμ±
γ νΉμ 쑰건μ νλ‘μ λ‘μ§μ μ μ©νλ κ³΅ν΅ κΈ°λ₯
Pointcut
κ°λ λμ μΌλ‘ μΌκ΄μ±μκ² ν΄κ²°
MethodInterceptor ꡬνμΌλ‘ Advice μμ± μμ
Spring Proxy Factory μ¬μ© μμ
Pointcut, Advice, Advisor
ν΅μ¬. νλμ Target μ μ¬λ¬ AOPκ° λμμ μ μ©λμ΄λ, μ€νλ§μ AOPλ Target λ§λ€ νλμ νλ‘μλ§ μμ±
Pointcut
: λμ μ¬λΆλ₯Ό νμΈνλ νν° μν
λΆκ° κΈ°λ₯μ μ΄λ κ³³μ μ μ©/λ―Έμ μ©ν μ§ νλ¨νλ νν°λ§ λ‘μ§
μ£Όλ‘ ν΄λμ€μ λ©μλ μ΄λ¦μΌλ‘ νν°λ§
μ€νλ§μ΄ μ 곡νλ λνμ μΈ Pointcut
AspectJExpressionPointcut
: aspectJ ννμ λ§€μΉ (μ€λ¬΄μμ μ£Όλ‘ λ§μ΄ μ¬μ©)NameMatchMethodPointcut
: λ©μλ μ΄λ¦ κΈ°λ° λ§€μΉνλ€JdkRegexpMethodPointcut
: JDK μ κ· ννμ κΈ°λ° λ§€μΉTruePointcut
: νμ μ°Έ λ°νAnnotationMatchingPointcut
: μ λ Έν μ΄μ 맀μΉ
Pointcut μ λ κ°μ§ μν βΌοΈ
μμ± λ¨κ³
-> νλ‘μ μ μ© μ¬λΆ νλ¨ (ν΄λμ€, λ©μλ 쑰건 λͺ¨λ λΉκ΅)μ¬μ© λ¨κ³
-> advice(λΆκ° κΈ°λ₯) μ μ© μ¬λΆ νλ¨
Advice
: λΆκ° κΈ°λ₯ λ‘μ§ λ΄λΉ
νλ‘μκ° νΈμΆνλ λΆκ° κΈ°λ₯(=νλ‘μ λ‘μ§)
Advisor
: νλμ Pointcut, νλμ Adviceλ₯Ό κ°λ κ²
μ‘°μΈ(
Advice
)μ μ΄λ(Pointcut
)μ ν κ²μΈκ°?μ‘°μΈμ(
Advisor
)λ μ΄λ(Pointcut
)μ μ‘°μΈ(Advice
)μ ν΄μΌν μ§ μκ³ μλ€.
βοΈ BeanPostProcessor
λΉ μ μ₯μμ κ°μ²΄λ₯Ό λ±λ‘νκΈ° μ§μ μ‘°μμ νκ³ μΆμ κ²½μ° λΉ νμ²λ¦¬κΈ°(BeanPostProcessor)λ₯Ό μ¬μ©(λΉ μμ± ν μ²λ¦¬ μ©λ)
Spring Proxy Factory μ λ¨μ (λ§μ μ€μ , μ»΄ν¬λνΈ μ€μΊ λμ κ°μ²΄ μ μ©μ μ΄λ €μ)μ ν΄κ²°
μμ±
: μ€νλ§ λΉ λμ κ°μ²΄ μμ±(@Bean, @ComponentScan..)μ λ¬
: μμ±λ κ°μ²΄λ₯Ό λΉ μ μ₯μμ λ±λ‘νκΈ° μ§μ μ λΉ νμ²λ¦¬κΈ°μ μ λ¬ν μ²λ¦¬ μμ
: λΉ νμ²λ¦¬κΈ°λ μ λ¬λ μ€νλ§ λΉ κ°μ²΄λ₯Ό μ‘°μνκ±°λ λ€λ₯Έ κ°μ²΄λ‘ λ°λμΉκΈ° κ°λ₯λ±λ‘
: λΉ νμ²λ¦¬κΈ°λ λΉ λ°ν. μ λ¬ λ λΉμ κ·Έλλ‘ λ°ννλ©΄ ν΄λΉ λΉμ΄ λ±λ‘λκ³ , λ°κΏμΉκΈ° νλ©΄ λ€λ₯Έ κ°μ²΄κ° λΉ μ μ₯μμ λ±λ‘
BeanPostProcessor interface
λΉ νμ²λ¦¬κΈ°λ₯Ό μ¬μ©νκΈ° μν΄
BeanPostProcessor
μΈν°νμ΄μ€ ꡬν ν μ€νλ§ λΉ λ±λ‘postProcessBeforeInitialization
: κ°μ²΄ μμ± μ΄ν @PostConstruct κ°μ μ΄κΈ°ν λ°μ μ νΈμΆλλ ν¬μ€νΈ νλ‘μΈμpostProcessAfterInitialization
: κ°μ²΄ μμ± μ΄ν @PostConstruct κ°μ μ΄κΈ°ν λ°μ ν νΈμΆλλ ν¬μ€νΈ νλ‘μΈμ
μ μ©
BeanPostProcessor λ₯Ό μ¬μ©ν΄μ μ€μ κ°μ²΄ λμ νλ‘μλ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘ κ°λ₯
μλ λ±λ‘ λΉμ ν¬ν¨νμ¬ μ»΄ν¬λνΈ μ€μΊμ μ¬μ©νλ λΉκΉμ§ λͺ¨λ νλ‘μ μ μ©μ΄ κ°λ₯
μ€μ νμΌμμ νλ‘μλ₯Ό μμ±νλ μ½λκ° λΆνμ
μ€νλ§ μ 곡 λΉ νμ²λ¦¬κΈ°
μ€νλ§ AOP λ Pointcut μ μ¬μ©ν΄μ νλ‘μ μ μ© λμ μ¬λΆ 체ν¬
νλ‘μκ° νμν κ³³μλ§ νλ‘μ μ μ©
νλ‘μ λ΄λΆ νΉμ λ©μλκ° νΈμΆ λμμ λ μ΄λλ°μ΄μ€ μ μ©
μμ‘΄μ± μΆκ°λ‘
aspectjweaver
: aspectJ κ΄λ ¨ λΌμ΄λΈλ¬λ¦¬ λ±λ‘ λ° μ€νλ§ λΆνΈκ° AOP κ΄λ ¨ ν΄λμ€λ₯Ό μλμΌλ‘ μ€νλ§ λΉμ λ±λ‘AnnotationAwareAspectJAutoProxyCreator
λΉ νμ²λ¦¬κΈ°κ° μ€νλ§ λΉμ μλμΌλ‘ λ±λ‘
AutoProxyCreator
μλμΌλ‘ νλ‘μλ₯Ό μμ±ν΄μ£Όλ λΉ νμ²λ¦¬κΈ°
μ€νλ§ λΉμΌλ‘ λ±λ‘λ Advisor λ€μ μλμΌλ‘ μ°Ύμμ νλ‘μκ° νμν κ³³μ μλμΌλ‘ νλ‘μ μ μ©
νλ‘μλ₯Ό λͺ¨λ κ³³μ μμ±νλ κ²μ λΉμ© λλΉμ΄λ―λ‘ ν¬μΈνΈμ»·μΌλ‘ νν°λ§ ν νμν κ³³μ μ΅μνμ νλ‘μ μ μ©
Advisor1, Advisor2, 3, 4.. κ° μ 곡νλ ν¬μΈνΈμ»·μ 쑰건μ λͺ¨λ λ§μ‘±νλλΌλ νλ‘μλ₯Ό ν κ°λ§ μμ±νκ³ νλ‘μλ 쑰건μ λ§μ‘±νλ μ¬λ¬ Advisorλ₯Ό μμ
μ€νλ§μ΄ μ 곡νλ λΉ νμ²λ¦¬κΈ° μ μ©
AspectJExpressionPointcut
AOPμ νΉνλ μ λ°ν ν¬μΈνΈμ»· ννμ(AspectJ) μ μ©
μ€νλ§μ νλ‘μλ₯Ό μ μ©νλ €λ©΄ Advisor(pointcut, advice λ‘ κ΅¬μ±)λ₯Ό λ§λ€μ΄μ μ€νλ§ λΉμΌλ‘ λ±λ‘νλ©΄ μλ νλ‘μ μμ±κΈ°κ° μλμΌλ‘ μ²λ¦¬
μλ νλ‘μ μμ±κΈ°λ μ€νλ§ λΉμΌλ‘ λ±λ‘λ Advisor λ€μ μ°Ύκ³ , μ€νλ§ λΉλ€μ μλμΌλ‘ ν¬μΈνΈμ»·μ΄ 맀μΉλλ κ²½μ° νλ‘μλ₯Ό μ μ©
@Aspect
μ λ
Έν
μ΄μ
μ μ¬μ©ν΄μ λ νΈλ¦¬νκ² pointcut κ³Ό advice λ₯Ό λ§λ€κ³ νλ‘μμ μ μ©ν μ μλ€.
βοΈ @Aspect Proxy
@Aspect
μ λ Έν μ΄μ μΌλ‘ pointcut κ³Ό advice λ‘ κ΅¬μ±λμ΄ μλ Advisor μ νΈλ¦¬ν μμ± μ§μμλ νλ‘μ μμ±κΈ°(AnnotationAwareAspectJAutoProxyCreator)λ₯Ό ν΅ν΄ @Aspect λ₯Ό μ°Ύμμ Advisor λ‘ λ³ν/μ μ₯, Advisor κΈ°λ°μΌλ‘ νμν κ³³μ νλ‘μλ₯Ό μμ±
@Aspect -> Advisor λ³ν κ³Όμ
μ€ν: μ€νλ§ μ ν리μΌμ΄μ λ‘λ© μμ μ μλ νλ‘μ μμ±κΈ° νΈμΆ
λͺ¨λ @Aspect λΉ μ‘°ν: μλ νλ‘μ μμ±κΈ°λ μ€νλ§ μ»¨ν μ΄λμμ @Aspect μ΄ λΆμ μ€νλ§ λΉμ λͺ¨λ μ‘°ν
μ΄λλ°μ΄μ μμ±: @Aspect μ΄λλ°μ΄μ λΉλ(BeanFactoryAspectJAdvisorsBuilder)λ₯Ό ν΅ν΄ @Aspect μ λ Έν μ΄μ μ 보λ₯Ό κΈ°λ°μΌλ‘ μ΄λλ°μ΄μ μμ±
@Aspect κΈ°λ° μ΄λλ°μ΄μ μ μ₯: μμ±ν μ΄λλ°μ΄μ λ₯Ό @Aspect μ΄λλ°μ΄μ λΉλ λ΄λΆμ μ μ₯
@Aspect μ΄λλ°μ΄μ λΉλ(BeanFactoryAspectJAdvisorsBuilder)
@Aspect μ 보λ₯Ό κΈ°λ°μΌλ‘ ν¬μΈνΈμ»·, μ΄λλ°μ΄μ€, μ΄λλ°μ΄μ μμ± λ° λ³΄κ΄(μΊμ±)
μλ νλ‘μλ₯Ό μμ±κΈ°μ λμκ³Ό λμΌνλ°, @Aspect Advisor μ‘°ν λΆλΆμ΄ μΆκ°
Aspect μ μ© ν΄λμ€
βοΈ Spring AOP
μ ν리μΌμ΄μ λ‘μ§μ ν¬κ² ν΅μ¬ κΈ°λ₯κ³Ό λΆκ° κΈ°λ₯μΌλ‘ λλ μ μμ
μ¬κΈ°μ, λΆκ° κΈ°λ₯ μ μ©μ λ¬Έμ
μ μ© μ λ§μ λ°λ³΅ νμ
μ¬λ¬ κ³³μ μ€λ³΅ μ½λ λ°μ
λ³κ²½ μ μ€λ³΅μΌλ‘ λ§μ μμ νμ
μ μ© λμ λ³κ²½ μ λ§μ μμ νμ
Aspect
λΆκ° κΈ°λ₯κ³Ό λΆκ° κΈ°λ₯μ μ΄λμ μ μ©ν μ§ μ ννλ κΈ°λ₯μ νλλ‘ ν©νμ¬ λ§λ€μ΄μ§ λͺ¨λ
Advisor(Pointcut + Advice) λ κ°λ μ νλμ Aspect
μ ν리μΌμ΄μ μ λ°λΌλ³΄λ κ΄μ μ νλμ κΈ°λ₯μμ ν‘λ¨ κ΄μ¬μ¬(cross-cutting concerns) κ΄μ μΌλ‘ 보λ κ²
Aspect λ₯Ό μ¬μ©ν νλ‘κ·Έλλ° λ°©μμ κ΄μ μ§ν₯ νλ‘κ·Έλλ° AOP(Aspect-Oriented Programming)
OOP λ₯Ό λ체νκΈ° μν κ²μ΄ μλ ν‘λ¨ κ΄μ¬μ¬λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬νκΈ° μ΄λ €μ΄ OOPμ λΆμ‘±ν λΆλΆ 보쑰 λͺ©μ μΌλ‘ κ°λ°
AspectJ Framework
μ€νλ§ AOPλ λλΆλΆ AspectJ λ¬Έλ²μ μ°¨μ©νκ³ , νλ‘μ λ°©μμ AOP μ μ©(AspectJ μ 곡 κΈ°λ₯ μΌλΆλ§ μ 곡)
AspectJ Frameworkλ ν‘λ¨ κ΄μ¬μ¬μ κΉλν λͺ¨λν
μλ° νλ‘κ·Έλλ° μΈμ΄μ λν μλ²½ν κ΄μ μ§ν₯ νμ₯
ν‘λ¨ κ΄μ¬μ¬μ κΉλν λͺ¨λν
μ€λ₯ κ²μ¬ λ° μ²λ¦¬
λκΈ°ν
μ±λ₯ μ΅μ ν(μΊμ±)
λͺ¨λν°λ§ λ° λ‘κΉ
AOP μ μ© λ°©μ
μ»΄νμΌ μμ
.java μμ€ μ½λλ₯Ό μ»΄νμΌλ¬(AspectJκ° μ 곡νλ νΉλ³ν μ»΄νμΌλ¬)λ₯Ό μ¬μ©ν΄μ .class λ₯Ό λ§λλ μμ μ λΆκ° κΈ°λ₯ λ‘μ§ μΆκ° (=Weaving / aspect μ μ€μ μ½λλ₯Ό μ°κ²°)
λ¨μ , μ»΄νμΌ μμ μ λΆκ° κΈ°λ₯μ μ μ©νλ €λ©΄ νΉλ³ν μ»΄νμΌλ¬κ° νμνκ³ λ³΅μ‘
ν΄λμ€ λ‘λ© μμ
μλ°λ₯Ό μ€ννλ©΄ μλ°λ .class νμΌμ JVM λ΄λΆμ ν΄λμ€ λ‘λμ 보κ΄. μ΄λ μ€κ°μμ .class νμΌμ μ‘°μν λ€μ JVMμ λ‘λ
λλΆλΆ λͺ¨λν°λ§ ν΄λ€μ΄ java Instrumentation λ°©μ μ¬μ©
λ¨μ , λ‘λ νμ μλΉμ μλ°λ₯Ό μ€νν λ νΉλ³ν μ΅μ (java -javaagent)μ ν΅ν΄ ν΄λμ€ λ‘λ μ‘°μκΈ°λ₯Ό μ§μ ν΄μΌ νλλ°, μ΄ λΆλΆμ΄ λ²κ±°λ‘κ³ μ΄μμ΄ μ΄λ €μ
λ°νμ μμ (νλ‘μ)
λ°νμ μμ (μ»΄νμΌμ΄ λλκ³ , ν΄λμ€ λ‘λμ ν΄λμ€λ λ€ μ¬λΌκ°κ³ , μ΄λ―Έ μλ°κ° μ€νλκ³ λ λ€μ μν, μλ°μ main λ©μλ μ€ν μ΄ν) νλ‘μλ₯Ό ν΅ν΄ μ€νλ§ λΉμ λΆκ° κΈ°λ₯μ μ μ©(AOP)
λ¨μ , νλ‘μ μ¬μ©μΌλ‘ AOP κΈ°λ₯μ μΌλΆ μ μ½(final, μμ, μμ±μ, ..)μ΄ μμ§λ§, λ€λ₯Έ λ°©λ²μμ 볡μ‘ν μ€μ λ¨κ³κ° λΆνμ
λΆκ° κΈ°λ₯μ΄ μ μ©λλ μ°¨μ΄
μ»΄νμΌ μμ
: μ€μ λμ μ½λμ μ μ€ν©νΈλ₯Ό ν΅ν λΆκ° κΈ°λ₯ νΈμΆ μ½λκ° ν¬ν¨ (AspectJ μ§μ μ¬μ© νμ)ν΄λμ€ λ‘λ© μμ
: μ€μ λμ μ½λμ μ μ€ν©νΈλ₯Ό ν΅ν λΆκ° κΈ°λ₯ νΈμΆ μ½λκ° ν¬ν¨ (AspectJ μ§μ μ¬μ© νμ)λ°νμ μμ
: μ€μ λμ μ½λλ κ·Έλλ‘ μ μ§νλ λμ νλ‘μλ₯Ό ν΅ν΄ λΆκ° κΈ°λ₯μ΄ μ μ© (νμ νλ‘μλ₯Ό ν΅ν΄ λΆκ° κΈ°λ₯ μ¬μ© -> μ€νλ§ AOP μ¬μ© λ°©μ)
Join Point(AOPλ₯Ό μ μ©ν μ μλ μ§μ )
AOPλ λ©μλ μ€ν μμΉ λΏλ§ μλλΌ, λ€μν μμΉμ μ μ© κ°λ₯
μ μ© κ°λ₯ μ§μ : μμ±μ, νλ κ° μ κ·Ό, static λ©μλ μ κ·Ό, λ©μλ μ€ν
μ»΄νμΌ μμ / ν΄λμ€ λ‘λ© μμ
λ°μ΄νΈ μ½λλ₯Ό μ€μ μ‘°μνκΈ° λλ¬Έμ ν΄λΉ κΈ°λ₯μ λͺ¨λ μ§μ μ λ€ μ μ© κ°λ₯
μ€νλ§ AOP
νλ‘μ λ°©μμ μ¬μ©(μ€λ²λΌμ΄λ© κ°λ μΌλ‘ λμ)νλ―λ‘
λ©μλ μ€ν μ§μ μλ§ AOP μ μ©
κ°λ₯μ€νλ§ μ»¨ν μ΄λκ° κ΄λ¦¬ν μ μλ
μ€νλ§ λΉμλ§ AOP μ μ©
κ°λ₯
AspectJλ λ μ¬μΈνκ³ λ€μν κΈ°λ₯μ μ 곡νμ§λ§, μμμΌ ν λ΄μ©μ΄ λ§κ³ , μλ° κ΄λ ¨ 볡μ‘ν μ€μ μ΄ λ§μΌλ―λ‘, μ€λ¬΄μμλ λ³λ μ€μ μμ΄ μ¬μ©ν μ μλ μ€νλ§ μ 곡 AOP κΈ°λ₯λ§ μ¬μ©ν΄λ λλΆλΆμ λ¬Έμ λ₯Ό ν΄κ²° κ°λ₯
AOP μ©μ΄
Join point
AOPλ₯Ό μ μ©ν μ μλ λͺ¨λ μ§μ (μμΉ, λ©μλ μ€ν, μμ±μ νΈμΆ, νλ κ° μ κ·Ό, static λ©μλ μ κ·Ό)
νλ‘μλ₯Ό μ¬μ©νλ μ€νλ§ AOPλ νμ λ©μλ μ€ν μ§μ μΌλ‘ μ ν
Pointcut
Pointcut μ€μμ Adviceκ° μ μ©λ μμΉ μ λ³(μ£Όλ‘ AspectJ ννμμ μ¬μ©ν΄μ μ§μ )
νλ‘μλ₯Ό μ¬μ©νλ μ€νλ§ AOPλ λ©μλ μ€ν μ§μ λ§ PointcutμΌλ‘ μ λ³ κ°λ₯
Target
Advice(λΆκ° κΈ°λ₯)λ₯Ό λ°λ κ°μ²΄, PointcutμΌλ‘ κ²°μ
Advice
λΆκ° κΈ°λ₯
Around, Before, After κ°μ λ€μν μ’ λ₯μ Advic μ‘΄μ¬
Aspect
Advice + Pointcutμ λͺ¨λν ν κ²(@Aspect)
μ¬λ¬ Adviceμ Pointcut ν¨κ» μ‘΄μ¬ κ°λ₯
Advisor
νλμ Adviceμ νλμ PointcutμΌλ‘ ꡬμ±
μ€νλ§ AOPμμλ§ μ¬μ©λλ νΉλ³ν μ©μ΄
Weaving
PointcutμΌλ‘ κ²°μ ν νμΌμ Join pointμ Adviceλ₯Ό μ μ©νλ κ²
ν΅μ¬ κΈ°λ₯ μ½λμ μν₯μ μ£Όμ§ μκ³ λΆκ° κΈ°λ₯μ μΆκ° κ°λ₯
AOP μ μ©μ μν΄ μ μ€ννΈλ₯Ό κ°μ²΄μ μ°κ²°ν μν
μ»΄νμΌ νμ(AspectJ compiler)
λ‘λ νμ
λ°νμ, μ€νλ§ AOPλ λ°νμ, νλ‘μ λ°©μ
AOP Proxy
AOP κΈ°λ₯μ ꡬννκΈ° μν΄ λ§λ νλ‘μ κ°μ²΄
μ€νλ§μμ AOP νλ‘μλ JDK λμ νλ‘μ λλ CGLIB νλ‘μ
βοΈ AOP ꡬν
AOP κΈ°λ₯ μ¬μ©μ μν΄ spring-boot-starter-aop dependency μΆκ°
@Aspect μ¬μ©μ μν΄ @EnableAspectJAutoProxy μ€μ μ΄ νμνμ§λ§, μ€νλ§ λΆνΈκ° μλμΌλ‘ μΆκ°
@Aspect ν΄λμ€λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νλ λ°©λ²
@Bean μ μ¬μ©ν΄μ μ§μ λ±λ‘
@Component μ»΄ν¬λνΈ μ€μΊμ μ¬μ©ν΄μ μλ λ±λ‘
@Import μ£Όλ‘ μ€μ νμΌμ μΆκ°ν λ μ¬μ©(@Configuration)
@Pointcut
ν¬μΈνΈμ»· μκ·Έλμ²: λ©μλ μ΄λ¦ + νλΌλ―Έν°
λ©μλμ λ°ν νμ μ void
Advice μμ
μ΄λλ°μ΄μ€λ κΈ°λ³Έμ μΌλ‘ μμλ₯Ό 보μ₯νμ§ μμ
@Order λ₯Ό μ¬μ©ν μ μμ§λ§, μ΄λλ°μ΄μ€ λ¨μκ° μλλΌ ν΄λμ€ λ¨μλ‘ μ μ© νμ
Advice μ’
λ₯
μ°Έκ³ .
JoinPoint Interface μ£Όμ κΈ°λ₯
getArgs() : λ©μλ μΈμ λ°ν
getThis() : νλ‘μ κ°μ²΄ λ°ν
getTarget() : λμ κ°μ²΄ λ°ν
getSignature() : μ‘°μΈλλ λ©μλμ λν μ€λͺ λ°ν
toString() : μ‘°μΈλλ λ°©λ²μ λν μ μ©ν μ€λͺ λ°ν
ProceedingJoinPoint Interface μ£Όμ κΈ°λ₯
proceed() : λ€μ μ΄λλ°μ΄μ€λ νμΌ νΈμΆ
@Around
: λ©μλ νΈμΆ μ /νμ μνλ€λ₯Έ μ΄λλ°μ΄μ€ κΈ°λ₯ λͺ¨λ μ²λ¦¬(μ‘°μΈ ν¬μΈνΈ μ€ν μ¬λΆ μ ν, λ°ν κ° λ³ν, μμΈ λ³ν λ±)
λ€μ μ΄λλ°μ΄μ€λ νμΌ νΈμΆμ μν΄ ProceedingJoinPoint μ¬μ©νκ³ , λλ¨Έμ§ μ΄λλ°μ΄μ€λ JoinPoint μ¬μ©
νμ joinPoint.proceed() νΈμΆ ν΄μΌ νλ λΆλΆμ μ£Όμ
@Before
: μ‘°μΈ ν¬μΈνΈ μ€ν μ μ μ€νμμ νλ¦ λ³κ²½ λΆκ°
λ©μλ μ’ λ£ μ λ€μ νμΌ(proceed()) μλ νΈμΆ
@After
: μ‘°μΈ ν¬μΈνΈκ° μ μ λλ μμΈμ κ΄κ³μμ΄ μ€νλ©μλ μ€νμ΄ μ’ λ£λλ©΄ μ€ν(=finally)
μ μ λ° μμΈ λ°ν 쑰건μ λͺ¨λ μ²λ¦¬
μΌλ°μ μΌλ‘ 리μμ€ ν΄μ μ μ¬μ©
@AfterReturning
: μ‘°μΈ ν¬μΈνΈ μ μ μλ£ ν μ€νreturning μμ± μ΄λ¦μ μ΄λλ°μ΄μ€ λ©μλ 맀κ°λ³μ μ΄λ¦ μΌμΉ
returning μ μ μ§μ λ νμ μ κ°(Obejct)μ λ°ννλ λ©μλλ§ λμ
λ°νλλ κ°μ²΄ λ³κ²½ λΆκ°
@AfterThrowing
: λ©μλκ° μμΈλ₯Ό λμ§λ κ²½μ° μ€ν@AfterReturning νΉμ§κ³Ό λμΌ
@Around κ° κ°μ₯ λμ κΈ°λ₯μ μ 곡νμ§λ§, @Before, @After μ κ°μ΄ μ μ½μ΄ μλ μ΄λλ°μ΄μ€λ₯Ό μ¬μ©ν΄μ λͺ ννκ² μ€κ³λ₯Ό ν΄λ³΄μ.
ν¬μΈνΈμ»·
Pointcut μ§μμ
ν¬μΈνΈμ»· ννμ(AspectJ pointcut expression)μ execution κ°μ ν¬μΈνΈμ»· μ§μμ(PCD, Pointcut Designator)λ‘ μμ
ν¬μΈνΈμ»· μ§μμ μ’ λ₯
execution : λ©μλ μ€ν μ‘°μΈ ν¬μΈνΈ 맀μΉ(κ°μ₯ λ§μ΄ μ¬μ©νκ³ , κΈ°λ₯λ 볡μ‘)
within : νΉμ νμ λ΄μ μ‘°μΈ ν¬μΈνΈ 맀μΉ
args : μΈμκ° μ£Όμ΄μ§ νμ μ μΈμ€ν΄μ€μΈ μ‘°μΈ ν¬μΈνΈ
this : μ€νλ§ λΉ κ°μ²΄(μ€νλ§ AOP νλ‘μ)λ₯Ό λμμΌλ‘ νλ μ‘°μΈ ν¬μΈνΈ
target : Target κ°μ²΄(μ€νλ§ AOP νλ‘μκ° κ°λ₯΄ν€λ μ€μ λμ)λ₯Ό λμμΌλ‘ νλ μ‘°μΈ ν¬μΈνΈ
@target : μ€ν κ°μ²΄μ ν΄λμ€μ μ£Όμ΄μ§ νμ μ μ λ Έν μ΄μ μ΄ μλ μ‘°μΈ ν¬μΈνΈ
@within : μ£Όμ΄μ§ μ λ Έν μ΄μ μ΄ μλ νμ λ΄ μ‘°μΈ ν¬μΈνΈ
@annotation : λ©μλκ° μ£Όμ΄μ§ μ λ Έν μ΄μ μ κ°μ§κ³ μλ μ‘°μΈ ν¬μΈνΈλ₯Ό 맀μΉ
@args : μ λ¬λ μ€μ μΈμμ λ°νμ νμ μ΄ μ£Όμ΄μ§ νμ μ μ λ Έν μ΄μ μ κ°λ μ‘°μΈ ν¬μΈνΈ
bean : μ€νλ§ μ μ© ν¬μΈνΈμ»· μ§μμ, λΉ μ΄λ¦μΌλ‘ ν¬μΈνΈμ»· μ§μ
execution λ¬Έλ²
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern namepattern(param-pattern) throws-pattern?)
execution(μ κ·Όμ μ΄μν¨ν΄? λ°ννμ ν¨ν΄ μ μΈνμ ν¨ν΄? λ©μλμ΄λ¦ν¨ν΄(νλΌλ―Έν°) μμΈν¨ν΄?)
λ©μλ μ€ν μ‘°μΈ ν¬μΈνΈ 맀μΉ
?
λ μλ΅ κ°λ₯ν ν¨ν΄*
ν¨ν΄ μ§μ κ°λ₯
ν¨ν€μ§ ν¨μΉ κ·μΉ
hello.aop.member.(1).(2)
(1): νμ
(2): λ©μλ μ΄λ¦
. : μ ννκ² ν΄λΉ μμΉμ ν¨ν€μ§
.. : ν΄λΉ μμΉμ ν¨ν€μ§μ κ·Έ νμ ν¨ν€μ§λ ν¬ν¨
λ©μλ/ν¨ν€μ§ μ΄λ¦ 맀μΉ
νλΌλ―Έν° λ§€μΉ κ·μΉ
(String) : μ ννκ² String νμ νλΌλ―Έν°
() : νλΌλ―Έν° μμ
(*) : μ νν νλμ νλΌλ―Έν°, λ¨ λͺ¨λ νμ νμ©
(*, *) : μ νν λ κ°μ νλΌλ―Έν°, λ¨ λͺ¨λ νμ νμ©
(..) : μ«μμ 무κ΄νκ² λͺ¨λ νλΌλ―Έν°, λͺ¨λ νμ νμ©. νλΌλ―Έν°κ° μμ΄λ νμ© (= 0..*)
(String, ..) : String νμ μΌλ‘ μμ. μ«μμ 무κ΄νκ² λͺ¨λ νλΌλ―Έν°, λͺ¨λ νμ νμ©
ex. (String) , (String, Xxx) , (String, Xxx, Xxx) νμ©
within μ§μμ
νΉμ νμ λ΄ μ‘°μΈ ν¬μΈνΈμ λν λ§€μΉ μ ν
ν΄λΉ νμ μ΄ λ§€μΉλλ©΄ κ·Έ μμ λ©μλ(μ‘°μΈ ν¬μΈνΈ)λ€μ΄ μλμΌλ‘ 맀μΉ
execution νμ λΆλΆλ§ μ¬μ©
λΆλͺ¨ νμ μ§μ λΆκ°
κ±°μ μ¬μ©νμ§ μκ³ , λ³΄ν΅ execution μ¬μ©
args μ§μμ
μΈμκ° μ£Όμ΄μ§ νμ μ μΈμ€ν΄μ€μΈ μ‘°μΈ ν¬μΈνΈλ‘ 맀μΉ
executionr vs args
executionr
νλΌλ―Έν° νμ μ μ νν 맀μΉ
ν΄λμ€μ μ μΈλ μ 보(λ©μλ μκ·Έλμ²) κΈ°λ° νλ¨ / μ μ
args
λΆλͺ¨ νμ νμ©
μ€μ λμ΄μ¨ νλΌλ―Έν° κ°μ²΄ μΈμ€ν΄μ€(λ°νμμ μ λ¬λ μΈμ) κΈ°λ° νλ¨ / λμ
λ¨λ μΌλ‘ μ¬μ©λκΈ° λ³΄λ€ νλΌλ―Έν° λ°μΈλ©μ μ£Όλ‘ μ¬μ©
@target, @within μ§μμ
νλΌλ―Έν° λ°μΈλ©μ ν¨κ» μ¬μ©
@target : μΈμ€ν΄μ€ κΈ°μ€μΌλ‘ λͺ¨λ λ©μλμ μ‘°μΈ ν¬μΈνΈλ₯Ό μ μ
λΆλͺ¨ νμ μ λ©μλλ μ μ©
@within : μ νλ ν΄λμ€ λ΄λΆμ μλ λ©μλλ§ μ‘°μΈ ν¬μΈνΈλ‘ μ μ
λΆλͺ¨ νμ μ λ©μλλ μ μ©λμ§ μμ
μ°Έκ³ . args, @args, @target μ§μμλ λ¨λ μΌλ‘ μ¬μ©νμ§ μκΈ° !!!
μ€μ κ°μ²΄ μΈμ€ν΄μ€κ° μμ±, μ€νλ λ μ΄λλ°μ΄μ€ μ μ© μ¬λΆλ₯Ό νμΈ κ°λ₯νλ―λ‘ νλ‘μκ° μμ΄μΌλ§(μ€ν μμ ) νλ¨ κ°λ₯
λ¨, νλ‘μλ₯Ό μμ±νλ μμ μ μ€νλ§ μ»¨ν μ΄λκ° λ§λ€μ΄μ§λ μ ν리μΌμ΄μ λ‘λ© μμ μ΄λ―λ‘ args, @args, @target μ§μμλ μ€νλ§μ λͺ¨λ λΉμ AOPλ₯Ό μ μ©νλ €κ³ μλ -> μ€νλ§ λ΄λΆμμ μ¬μ©νλ λΉ μ€μλ final μ§μ λΉλ€λ μκΈ° λλ¬Έμ μ€λ₯ λ°μ
μ΅λν νλ‘μ μ μ© λμμ μΆμνλ ννμ(execution)κ³Ό ν¨κ» μ¬μ©νκΈ°
@annotation, @args μ§μμ
@annotation : μ£Όμ΄μ§ μ λ Έν μ΄μ (@MethodAop)μ κ°μ§κ³ μλ λ©μλλ₯Ό μ‘°μΈ ν¬μΈνΈ 맀μΉ
@args : λ°νμ νμ μ μ λ¬λ μΈμκ° μ£Όμ΄μ§ νμ μ(@Check) μ λ Έν μ΄μ μ΄ μλ κ²½μ°μ 맀μΉ
bean μ§μμ
λΉ μ΄λ¦μΌλ‘ AOP μ μ© μ¬λΆ μ§μ (μ€νλ§ μ μ© ν¬μΈνΈμ»· μ§μμ)
this, target μ§μμ
this : μ€νλ§ λΉμΌλ‘ λ±λ‘λμ΄ μλ νλ‘μ κ°μ²΄λ₯Ό λμμΌλ‘ ν¬μΈνΈμ»· 맀μΉ
target : μ€νλ§ AOP νλ‘μ κ°μ²΄κ° κ°λ₯΄ν€λ μ€μ target κ°μ²΄λ₯Ό λμμΌλ‘ ν¬μΈνΈμ»· 맀μΉ
νλ‘μ λμμΈ this λ ꡬ체 ν΄λμ€ μ§μ μ νλ‘μ μμ± μ λ΅μ λ°λΌ λ€λ₯Έ κ²°κ³Όκ° λμ¬ μ μμ
μ κ°μ ν¨ν΄ μ¬μ© λΆκ°
λΆλͺ¨ νμ νμ©
λ¨λ μΌλ‘ μ¬μ©λκΈ° 보λ€λ νλΌλ―Έν° λ°μΈλ©μ μ£Όλ‘ μ¬μ©
맀κ°λ³μ μ λ¬
ν¬μΈνΈμ»· ννμμ μ¬μ©ν΄μ μ΄λλ°μ΄μ€μ 맀κ°λ³μ μ λ¬ κ°λ₯
this, target, args,@target, @within, @annotation, @args
λ©μλμ μ§μ ν νμ μΌλ‘ μ ν
βοΈ AOP μ€μ μμ
μ°Έκ³ . μ€νλ§μ κ°μ₯ λνμ μΈ AOPλ @Transactional
βοΈ μ£Όμμ¬ν
νλ‘μ λ°©μμ AOP νκ³ - λμ κ°μ²΄λ₯Ό μ§μ νΈμΆ
μμ‘΄κ΄κ³ μ£Όμ μ νλ‘μ κ°μ²΄κ° μ£Όμ λλ―λ‘ λμ κ°μ²΄λ₯Ό μ§μ νΈμΆνλ λ¬Έμ λ μΌλ°μ μΌλ‘ λ°μνμ§ μμ§λ§, λμ κ°μ²΄μ λ΄λΆμμ λ©μλ νΈμΆ(μμ μ μΈμ€ν΄μ€ λ΄λΆ λ©μλ νΈμΆ)μ΄ λ°μνλ©΄ νλ‘μλ₯Ό κ±°μΉμ§ μκ³ λμ κ°μ²΄λ₯Ό μ§μ νΈμΆνλ λ¬Έμ λ°μ
μ€νλ§μ νλ‘μ λ°©μμ AOPλ₯Ό μ¬μ©νλλ°, λ©μλ λ΄λΆ νΈμΆμ νλ‘μλ₯Ό μ μ©ν μ μμ
νλ‘μ λ°©μμ AOP νκ³ - νλ‘μ λ°©μμ AOPμ λ΄λΆ νΈμΆ λ¬Έμ
νλ‘μ λ°©μμ AOP νκ³. λμ I. μκΈ° μμ μ£Όμ
μμ μ μΈμ€ν΄μ€ λ©μλλ₯Ό νΈμΆνλ κ²μ΄ μλλΌ, νλ‘μ μΈμ€ν΄μ€λ₯Ό ν΅ν΄μ νΈμΆ
νλ‘μ λ°©μμ AOP νκ³. λμ II. μ§μ° μ‘°ν
ObjectProvider(Provider), ApplicationContext μ¬μ©
ObjectProvider : κ°μ²΄ μ‘°νλ₯Ό μ€νλ§ μ»¨ν μ΄λ μ€νλ§ λΉ μμ± μμ μμ μ€μ κ°μ²΄ μ¬μ© μμ (.getObject())μΌλ‘ μ§μ°
νλ‘μ λ°©μμ AOP νκ³. λμ III. ꡬ쑰 λ³κ²½
λ΄λΆ νΈμΆμ λ³λ ν΄λμ€λ‘ λΆλ¦¬
νλ‘μ κΈ°μ μ νκ³
νμ μΊμ€ν
νλ‘μ μΊμ€ν λ¬Έμ λ μμ‘΄κ΄κ³ μ£Όμ μ λ°μ
JDK λμ νλ‘μ : μΈν°νμ΄μ€ κΈ°λ° νλ‘μ μμ±
νλ‘μλ₯Ό μΈν°νμ΄μ€λ‘ μΊμ€ν κ°λ₯νμ§λ§, ꡬ체 ν΄λμ€λ‘ νμ μΊμ€ν μ΄ λΆκ°λ₯(μΈν°νμ΄μ€λ₯Ό ꡬνν νλ‘μμ΄λ―λ‘..)
CGLIB : ꡬ체 ν΄λμ€ κΈ°λ° νλ‘μ μμ±
ꡬ체 ν΄λμ€ κΈ°λ°μΌλ‘ νλ‘μκ° μμ±λλ―λ‘, ꡬ체 ν΄λμ€λ‘ νμ μΊμ€ν κ°λ₯
νλ‘μ κΈ°μ μ νκ³ - νμ μΊμ€ν
μμ‘΄κ΄κ³ μ£Όμ
JDK λμ νλ‘μ
μΈν°νμ΄μ€ κΈ°λ°μΌλ‘ νλ‘μλ₯Ό μμ±ν΄μ λμ κ°μ²΄ Impl νμ μ μμ‘΄κ΄κ³ μ£Όμ λΆκ°
CGLIB
ꡬ체 ν΄λμ€ κΈ°λ°μΌλ‘ νλ‘μλ₯Ό μμ±ν΄μ λμ κ°μ²΄ Impl νμ μ μμ‘΄κ΄κ³ μ£Όμ κ°λ₯
νλ‘μ κΈ°μ κ³Ό νκ³ - μμ‘΄κ΄κ³ μ£Όμ
CGLIB νλ‘μ λ¬Έμ μ
λμ ν΄λμ€μ κΈ°λ³Έ μμ±μ νμ
μμ±μλ₯Ό 2λ² νΈμΆ
μ€μ target κ°μ²΄ μμ±
νλ‘μ κ°μ²΄ μμ± μ λΆλͺ¨ ν΄λμ€ μμ±μ νΈμΆ
final ν€μλ ν΄λμ€, λ©μλ μ¬μ© λΆκ°
μ€νλ§μ νλ‘μ κΈ°μ μ νκ³ ν΄κ²°μ±
μ€νλ§ 3.2 : CGLIBλ₯Ό μ€νλ§ λ΄λΆμ ν¨κ» ν¨ν€μ§
μ€νλ§ 4.0 : objenesis λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν΄μ κΈ°λ³Έ μμ±μ νμ λ¬Έμ , μμ±μ 2λ² νΈμΆ λ¬Έμ ν΄κ²°
μ€νλ§ λΆνΈ 2.0 : CGLIB κΈ°λ³Έ μ¬μ©
Last updated