πAOPμ PSA μ μΆκ° νμ΅ν λ΄μ©
: κ΄μ μ§ν₯ νλ‘κ·Έλλ°
λ€μν κΈ°λ₯λ€μ ν΅μ¬κ³Ό λΆκ°κΈ°λ₯μΌλ‘ λΆλ¦¬νλ κ²μ μλ―Ένλ€.
βοΈ OOPμ κΆκ·Ήμ μΈ λͺ©νλ 곡ν΅λ λͺ©μ μ κ°μ§ λ°μ΄ν°μ λ©μλλ₯Ό νλμ κ°μ²΄λ‘ λ¬Άμ΄ μ¬μ©ν¨μΌλ‘μ¨ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ μ€λ³΅μ½λλ₯Ό μ κ±°νλ κ²μ μλ€.
κ·Έλ¬λ λ‘κΉ , 보μ, νΈλμμ κ³Ό κ°μ λΆκ°κΈ°λ₯μ κ° λ©μλλ³λ‘ μνλκΈ° λλ¬Έμ μ€λ³΅μ½λκ° μμ±λλ€. μ΄λ° λ¨μ μ 보μνκΈ° μν λ°©λ²μΌλ‘ AOPλ₯Ό μ¬μ©νλ€.
βοΈ λΆκ° κΈ°λ₯μ λ³΄ν΅ μ¬λ¬ ν΄λμ€μμ 곡ν΅μ μΌλ‘ μ¬μ©λλ κ²½μ°κ° λ§λ€.
μλ°±μμ²κ°μ ν΄λμ€μμ 곡ν΅λ λΆκ°κΈ°λ₯μ λΆμ¬νλ€κ³ κ°μ νμ λ μ€λ³΅ μ½λ λ°μμ λ¬Όλ‘ μ΄κ³ ν΄λΉ μ½λμ μμ μ΄ νμν κ²½μ°κ° λ°μνλ€λ©΄ ...π€―
Advice + Pointcut
μ λͺ¨λννμ¬ μ ν리μΌμ΄μ
μ ν¬ν¨λλ ν‘λ¨ κΈ°λ₯Advice
μ νλμ Pointcut
λ‘ κ΅¬μ±λ λͺ¨λJoin point
μμ μνλλ μ½λ (λΆκ° κΈ°λ₯)Aspect
λ₯Ό μΈμ ν΅μ¬ μ½λμ μ μ©ν μμ μ μ μνλ€. Join point
μ€μμ Advice
κ° μ μ©λ μμΉλ₯Ό μ λ³νλ κΈ°λ₯AspectJ
ννμμ μ¬μ©ν΄ μ§μ νλ€.Join point
μ κ΄μ¬ μ½λ(Aspect code)λ₯Ό μΆκ°ν μ μλ€.Join point
μ ,νμ ν‘λ¨ κ΄μ¬μ΄ μΆκ°λλ€.π‘ μ€νλ§ AOPλ νλ‘μ λ°©μμ μ¬μ©νλ―λ‘ νμ λ©μλ μ€ν μ§μ μ
Join point
λ‘ κ°λλ€. λ°λΌμPointcut
λ λ©μλ μ€ν μ§μ μΌλ‘ μ νλλ€.βοΈνλ‘μ(Proxy)
μ»΄ν¨ν° λ€νΈμν¬μμ λ€λ₯Έ μλ² μμ μμμ μ°Ύλ ν΄λΌμ΄μΈνΈλ‘λΆν° μμ²μ λ°μ μ€κ³νλ μλ².
λΆμ° μμ€ν μ ꡬ쑰λ₯Ό λ¨μννκ³ μΊ‘μννμ¬ μλΉμ€μ 볡μ‘λλ₯Ό μ€μ΄λ μν μ νλ€.
βοΈ μ€νλ§ AOPλ νλ‘μ κΈ°λ°μ AOP ꡬν체μ΄λ€.
μ κ·Ό μ μ΄ λ° λΆκ° κΈ°λ₯μ μΆκ°νκΈ° μν΄μ νλ‘μ κ°μ²΄λ₯Ό μ¬μ©νλ€.
Pointcut
μΌλ‘ κ²°μ ν νκ²μ Join point
μ Advice
λ₯Ό μ μ©νλ κ²π‘μλΉ(Weaving)μ μ»΄νμΌ νμ(μλ°->ν΄λμ€λ‘ μ»΄νμΌλ λ), ν΄λμ€ λ‘λ νμ(μ»΄νμΌ μ΄ν λ©λͺ¨λ¦¬μ μ¬λΌκ°λ μμ ), λ°νμ(μ€ν μ€μΌ λ) 3κ°μ§ μ μ© μμ μ΄ μλ€.
βοΈλ¨, μ»΄νμΌ νμκ³Ό ν΄λμ€ λ‘λ νμμ AspectJμμ μ¬μ©νλ λ°©μμΌλ‘ Spring AOPμμλ μ¬μ©μ΄ λΆκ°νλ€.π‘ λ°νμ == νλ‘μ λ°©μμ΄λΌκ³ νλ©°, μ€νλ§ μ»¨ν μ΄λκ° κ°μ²΄λ₯Ό μμ±ν λ νλ‘μ κ°μ²΄λ₯Ό μλμΌλ‘ μμ±νκ³ μλ³Έ κ°μ²΄ λμ νλ‘μλ₯Ό λΉμ λ±λ‘νλ€.
Advice
λ₯Ό λ°λ κ°μ²΄μ΄κ³ Pointcut
μΌλ‘ κ²°μ λλ€.: ν΅μ¬ κΈ°λ₯μ μ μ©λ λΆκ° κΈ°λ₯μ μ½λ
Join point
μ€ν μ΄μ μ μ€νBefore Advice
λ‘ κ΅¬νν λ©μλλ μΌλ°μ μΌλ‘ Voidμ 리ν΄νμ
μ κ°λλ€.Join point
μ€ν@AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result")
public void doReturn(JoinPoint joinPoint, Object result) {
log.info("[return] {} return={}", joinPoint.getSignature(), result);
}
@AfterThrowing(value = "hello.aop.order.aop.Pointcuts.orderAndService()", throwing = "ex")
public void doThrowing(JoinPoint joinPoint, Exception ex) {
log.info("[ex] {} message={}", joinPoint.getSignature(), ex.getMessage());
}
Join point
μ λμκ³Όλ μκ΄μμ΄ μ€ννλ€.joinPoint.proceed()
joinPoint.proceed(args[])
try~catch~finally
κ° λ€μ΄κ°λ ꡬ문μ²λ¦¬ κ°λ₯ProceedingJoinPoint
λ₯Ό μ¬μ©ν΄μΌ νλ€.proceed()
λ₯Ό ν΅ν΄ λμμ μ€ννλ€.(μ¬λ¬λ² κ°λ₯)βοΈ Aroundκ° κ°μ₯ λ§μ κΈ°λ₯μ κ°μ§ AdviceμΈ κ²μ λ§μ§λ§ μν©μ λ°λΌ μ μμ μΌλ‘ μλλμ§ μλ κ²½μ°κ° μμΌλ μν©μ λ§κ² νλ¨νμ¬ μ¬μ©ν΄μΌ νλ€.