AOPλ κ΄μ μ§ν₯ νλ‘κ·Έλλ°μ΄λΌκ³ λΆλ¦°λ€. μ΄λ€ λ‘μ§μ κΈ°μ€μΌλ‘ ν΅μ¬μ μΈ κ΄μ , λΆκ°μ μΈ κ΄μ μΌλ‘ λλμ΄μ λ³΄κ³ κ·Έ κ΄μ μ κΈ°μ€μΌλ‘ κ°κ° λͺ¨λννκ² λ€λ κ²μ΄λ€.
AOPμμ κ° κ΄μ μ κΈ°μ€μΌλ‘ λ‘μ§μ λͺ¨λννλ€λ κ²μ λͺ¨λλ€μ λΆλΆμ μΌλ‘ λλμ΄μ λͺ¨λννκ² λ€λ μλ―Έμ΄λ€. μ΄λ, μμ€ μμμ λΉμ·ν κΈ°λ₯μ νλ λΆλΆ(λΉμ·ν λ©μλ, μ½λ)μ΄ μλλ°, μ΄κ²μν©μ΄μ§ κ΄μ¬μ¬(Crosscutting Concerns)
λΌ λΆλ₯Έλ€.
μλ κ·Έλ¦Όμμ κ° λ°μ€μμ μμΉ λμ΄ μλ λΆλΆμ΄ ν©μ΄μ§ κ΄μ¬μ¬μ΄λ€. (κ° ν΄λμ€μμ 곡ν΅μ μΌλ‘ μ¬μ©νκ³ μλ λ©μλ νΉμ μ½λ) μ΄λ λ§μ½ λ
Έλμ κΈ°λ₯μ μμ ν΄μΌ νλ€λ©΄ κ°κ° ν΄λμ€μ λ
Έλμ κΈ°λ₯μ μμ ν΄μ£Όμ΄μΌ νκΈ° λλ¬Έμ μ μ§λ³΄μλ©΄μμ λΆλ¦¬νλ€.
μ΄κ²μ ν΄κ²°νλ λ°©λ²μ΄ AOP
μ΄λ€. ν©μ΄μ§ κ΄μ¬μ¬λ€μ λͺ¨μλ AOPμ Aspectμ μ¬μ©νλ€. κ° Concernλ³λ‘ Aspectμ λ§λ€μ΄μ£Όκ³ , μ΄λ ν΄λμ€μμ μ¬μ©νλ μ§ μ
λ ₯ν΄μ£Όλ λ°©μμ΄λ€. μλμ κ·Έλ¦Όμ΄ Aspectλ‘ λͺ¨λν ν κ²μ 보μ¬μ€ κ²μ΄λ€.
κ° λͺ¨λμλ Adviceμ Poincutμ΄ λ€μ΄μλ€. Adviceλ ν΄μΌν μΌ, κΈ°λ₯μ λνλΈλ€. Pointcutμ΄λ μ΄λμ μ μ©ν΄μΌνλμ§λ₯Ό λνλ΄λ κ²μ΄λ€. (AλΌλ ν΄λμ€μ WλΌλ λ©μλ) Targetμ΄λΌλ κ°λ
λ μλλ°, Targetμ΄λ κ°κ° ν΄λμ€λ₯Ό λνλ΄λ κ²μ΄λ€. μ¦, μ μ©μ΄λλ λμμ λ»νλ μ©μ΄μ΄λ€.
π Aspect
: κ΄μ
π Advice
: ν΅μ¬κΈ°λ₯μ λΆμ¬λλ λΆκ°κΈ°λ₯ (μμΉ λ©μλμ μ μ©λ λΆκ° κΈ°λ₯)
Around (Advice)
: λμ κ°μ²΄μ λ©μλ μ€ν μ , ν λ° μμΈ λ°μ λͺ¨λ μ€ννλ€. Before (Advice)
: λμ κ°μ²΄μ λ©μλλ‘, λ©μλ νΈμΆμ μ μννλ€. After (Advice)
: λμ κ°μ²΄μ λ©μλ μ€νλμ€ μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ λ©μλ μ€ν ν μ€ννλ€.AfterReturning (Advice)
: λμ κ°μ²΄μ λ©μλκ° μ€ν λμ€ μμΈμμ΄ μ€ν μ±κ³΅ν κ²½μ°μ μ€ννλ€.AfterThrowing (Advice)
: λμ κ°μ²΄μ λ©μλκ° μ€ν λμ€ μμΈκ° λ°μν κ²½μ°μ μ€ννλ€. π Pointcut
: Aspect μ μ© μμΉ μ§μ μ (Advice)λ₯Ό μ΄λμ μ μ©ν μ§λ₯Ό κ²°μ
π Advisor
: Advice + Pointcut
π Joinpoint
: Aspectκ° μ μ©ν μ§μ
execution(μμμ΄ν¨ν΄ 리ν΄νμ ν¨ν΄ ν΄λμ€μ΄λ¦ν¨ν΄.λ©μλμ΄λ¦ν¨ν΄())
κ° ν¨ν΄μ *μ μ΄μ©νμ¬ λͺ¨λ κ°μ ννν μ μλ€.
π ν¨ν€μ§
com.spring.aop
β com.spring.aopν¨ν€μ§λ₯Ό νκ²νλ€λ μλ―Έcom.spring.aop..
β com.spring.aopλ‘ μμνλ νμμ λͺ¨λ ν¨ν€μ§λ₯Ό νκ²νλ€λ μλ―Έπ 리ν΄νμ
*
β λͺ¨λ λ¦¬ν΄ νμ
νκ²void
> λ¦¬ν΄ νμ
μ΄ voidμΈ λ©μλλ§ νμΌ!void
> λ¦¬ν΄ νμ
μ΄ voidκ° μλ λ©μλλ§ νκ² π λ§€κ° λ³μ μ§μ
(..)
> 1κ° μ΄μμ λͺ¨λ νλΌλ―Έν° νμΌ(*)
> 1κ°μ νλΌλ―Έν°λ§ νμΌ (*,*)
> 2κ°μ νλΌλ―Έν°λ§ νκ²(String,*)
> 2κ°μ νλΌλ―Έν°μ€ 첫λ²μ§Έ νλΌλ―Έν°κ° Stringνμ
λ§ νκ² π μν μμ
execution(void set*(..))
execution(* abc.*.*())
execution(* abc..*.*(..))
execution(Long com.spring.aop.Boss.work(..))
execution (* get*(*))
execution(* get*(*,*))
execution(* read*(Integer,..))
@Component
@Aspect // AOP μ¬μ© μ μΈ μ΄λ
Έν
μ΄μ
public class Advice {
private static final Logger logger = LoggerFactory.getLogger(Advice.class);
@Pointcut("execution(void com.spring.aop.*.work())") // μ€λ³΅λλ executionμ κΈ°μ
public void pointcut() {
// νΉμ ν μλ―Έκ° μλ€.
}
// λ©μλ νΈμΆ μ
//@Before("execution(void com.spring.aop.*.work())")
@Before("pointcut()")
public void before() {
logger.info("AOP Before λ©μλ νΈμΆ : μΆκ·Όνλ€.");
}
}
π com.spring.aop.
ν¨ν€μ§ νμΌ
package com.spring.aop;
import org.springframework.stereotype.Component;
//ν
μ€νΈ λͺ©μ μ ν΄λμ€1
@Component
public class Boss {
public void work() {
System.out.println("μ¬μ₯μ μΌμ νλ€.");
}
public void getWorkingTime() {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void getInfo(String title , int salary) {
System.out.println("\n===================");
System.out.println("Bossν΄λμ€ getInfoλ©μλ νΈμΆ");
System.out.println("μ§κΈ : " + title + " / κΈμ¬ : " + salary);
System.out.println("===================\n");
}
@Component
@Aspect // AOP μ¬μ© μ μΈ μ΄λ
Έν
μ΄μ
public class Advice {
private static final Logger logger = LoggerFactory.getLogger(Advice.class);
@Pointcut("execution(void com.spring.aop.*.work())") // μ€λ³΅λλ executionμ κΈ°μ
public void pointcut() {
// νΉμ ν μλ―Έκ° μλ€.
}
// λ©μλ νΈμΆ ν
//@After("execution(void com.spring.aop.*.work())")
@After("pointcut()")
public void after() {
logger.info("AOP After λ©μλ νΈμΆ : ν΄κ·Όνλ€.\n");
}
}
@Component
@Aspect // AOP μ¬μ© μ μΈ μ΄λ
Έν
μ΄μ
public class Advice {
private static final Logger logger = LoggerFactory.getLogger(Advice.class);
@Pointcut("execution(void com.spring.aop.*.work())") // μ€λ³΅λλ executionμ κΈ°μ
public void pointcut() {
// νΉμ ν μλ―Έκ° μλ€.
}
// λ©μλ νΈμΆ μ ν
@Around("execution(void com.spring.aop.*.getWorkingTime())")
public void around(ProceedingJoinPoint pjp) {
logger.warn("===========================");
// λ©μλ νΈμΆ μ
long startTime = System.currentTimeMillis();
// ProceedingJoinPoint κ°μ²΄μ proceed()λ©μλλ‘ νκ²λ©μλλ₯Ό νΈμΆνλ€.
try {
pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
// λ©μλ νΈμΆ ν
long endTime = System.currentTimeMillis();
logger.warn("μ
무 μμμκ° : " + (endTime-startTime) + " μ΄");
logger.warn("===========================\n");
}
}
@Component
@Aspect // AOP μ¬μ© μ μΈ μ΄λ
Έν
μ΄μ
public class Advice {
private static final Logger logger = LoggerFactory.getLogger(Advice.class);
@Pointcut("execution(void com.spring.aop.*.work())") // μ€λ³΅λλ executionμ κΈ°μ
public void pointcut() {
// νΉμ ν μλ―Έκ° μλ€.
}
// νκ² λ©μλκ° μ±κ³΅μ μΌλ‘ μ€νν ν
@AfterReturning("execution(void com.spring.aop.*.getInfo(..))")
//JoinPointκ°μ²΄λ₯Ό ν΅ν΄μ νκ²λ©μλλ‘λΆν° μ λ¬λλ νλΌλ©νλ₯Ό λ°μ μ μλ€.
public void AfterReturning(JoinPoint jp) {
logger.info(Arrays.toString(jp.getArgs())); // λ©μλμ νλΌλ©νλ₯Ό νμΈ
logger.info(jp.getKind()); // λ©μλμ μ’
λ₯ νμΈ
logger.info(jp.getSignature().getName()); // λ©μλμ λν μ€λͺ
logger.info(jp.getTarget().toString()); // λμ κ°μ²΄λ₯Ό λ°ν
logger.info(jp.getThis().toString()); // νλ‘μ κ°μ²΄λ₯Ό λ°ν
logger.info("");
}
}
@Component
@Aspect // AOP μ¬μ© μ μΈ μ΄λ
Έν
μ΄μ
public class Advice {
private static final Logger logger = LoggerFactory.getLogger(Advice.class);
@Pointcut("execution(void com.spring.aop.*.work())") // μ€λ³΅λλ executionμ κΈ°μ
public void pointcut() {
// νΉμ ν μλ―Έκ° μλ€.
}
// νκ² λ©μλμμ μλ¬κ° λ°μν ν
@AfterThrowing("execution(void com.spring.aop.Employee.getError())")
public void AfterThrowing(){
logger.info("AOP AfterThrowingλ©μλ νΈμΆ\n");
}
}