AOPλ? κ΄μ μ§ν₯ νλ‘κ·Έλλ°(Aspect Oriented Programming)μ μ½μ΄λ‘ 'ꡬννκ³ μΆμ νλ‘κ·Έλ¨ = μ€μ¬μ κ΄μ¬μ¬', 'λΆμμ νλ‘κ·Έλ¨ = ν‘λ¨μ κ΄μ¬μ¬'λ‘ λΆλ¦¬νμ¬ νλ‘κ·Έλ¨μ μμ±νλ λ°©μμ μλ―Ένλ€.
μ΄λ€ κΈ°λ₯μ ꡬνν λ κ·Έ κΈ°λ₯μ 'ν΅μ¬ κΈ°λ₯'κ³Ό 'λΆκ° κΈ°λ₯'μΌλ‘ ꡬλΆν΄ κ°κ°μ νλμ κ΄μ μΌλ‘ 보λ κ²μ μλ―Ένλ€.
μ¬λ¬ λΉμ¦λμ€ λ‘μ§μ λ°λ³΅λλ λΆκ° κΈ°λ₯μ νλμ κ³΅ν΅ λ‘μ§μΌλ‘ μ²λ¦¬νλλ‘ λͺ¨λνν΄ μ½μ νλ λ°©μ => AOP
μ©μ΄ | λ΄μ© |
---|---|
Advice(μ΄λλ°μ΄μ€) | ν‘λ¨μ κ΄μ¬μ¬μ ꡬν(λ©μλ)λ₯Ό μλ―Ένλ€. λ‘κ·Έ μΆλ ₯ λ° νΈλμμ μ μ΄ λ±μ κΈ°λ₯μ μλ―Ένλ€. |
Aspect(μ μ€ννΈ) | μ΄λλ°μ΄μ€λ₯Ό μ 리ν κ²(ν΄λμ€)λ₯Ό μλ―Ένλ€. |
JoinPoint(μ‘°μΈν¬μΈνΈ) | μ΄λλ°μ΄μ€λ₯Ό μ€μ¬μ μ κ΄μ¬μ¬μ μ μ©νλ νμ΄λ°μ μλ―Ένλ€. λ©μλ(μμ±μ) μ€ν μ , λ©μλ(μμ±μ) μ€ν ν λ± μ€νλλ νμ΄λ°μ΄λ€. |
Pointcut(ν¬μΈνΈμ»·) | μ΄λλ°μ΄μ€λ₯Ό μ½μ ν μ μλ μμΉλ₯Ό μλ―Ένλ€. μλ₯Ό λ€μ΄ λ©μλ μ΄λ¦μ΄ getμΌλ‘ μμν λλ§ μ²λ¦¬νλ 쑰건μ μ μν μ μλ€. |
Interceptor(μΈν°μ ν°) | μ²λ¦¬μ μ μ΄λ₯Ό μΈν°μ νΈνκΈ° μν ꡬ쑰 λλ νλ‘κ·Έλ¨μ μλ―Ένλ€. μ€νλ§ νλ μμν¬μμ μΈν°μ νΈλΌλ λ©μ»€λμ¦μΌλ‘ μ΄λλ°μ΄μ€λ₯Ό μ€μ¬μ κ΄μ¬μ¬μ μΆκ°ν κ²μ²λΌ 보μ΄κ² νλ€. |
Target(νκ²) | μ΄λλ°μ΄μ€κ° λμ λλ λμμ μλ―Ένλ€. |
μ€νλ§ νλ μμν¬μμλ 'μΈν°μ ν°'λΌλ λ©μ»€λμ¦μ μ¬μ©νμ¬ ν‘λ¨μ κ΄μ¬μ¬(μ΄λλ°μ΄μ€)λ₯Ό μ€μ¬μ κ΄μ¬μ¬(νκΉ)μ μ½μ νλ κ²μ²λΌ λ³΄μΌ μ μλ€.
μ€νλ§ νλ μμν¬κ° μ 곡νλ μ€μ¬μ κ΄μ¬μ¬μ μ μ©νλ μ΄λλ°μ΄μ€λ μ€ν μ μ΄ λ΄μ©λ³λ‘ λ€μκ³Ό κ°μ΄ λ€μ―κ°μ§ μ’ λ₯κ° μλ€.
μ΄λλ°μ΄μ€ | λ΄μ© | μ΄λ Έν μ΄μ |
---|---|---|
Before Advice | μ€μ¬μ κ΄μ¬μ¬κ° μ€νλκΈ° 'μ΄μ 'μ ν‘λ¨μ κ΄μ¬μ¬λ₯Ό μ€ννλ€. | @Before |
After Returning Advice | μ€μ¬μ κ΄μ¬μ¬κ° 'μ μμ μΌλ‘ μ’ λ£λ ν'μ ν‘λ¨μ κ΄μ¬μ¬λ₯Ό μ€ννλ€. | @AfterReturning |
After Throwing Advice | μ€μ¬μ κ΄μ¬μ¬κ° 'μμΈκ° λμ Έμ§ ν'λ‘ ν‘λ¨μ κ΄μ¬μ¬λ₯Ό μ€ννλ€. | @AfterThrowing |
After Advice | μ€μ¬μ κ΄μ¬μ¬μ 'μ€ν ν'μ ν‘λ¨μ κ΄μ¬μ¬λ₯Ό μ€ννλ€. (μ μ μ’ λ£λ μμΈ μ’ λ£ λ±μ κ²°κ³Όμ μκ΄μμ΄ μ€ν) | @After |
Around Advice | μ€μ¬μ κ΄μ¬μ¬ νΈμΆ μ , νμ ν‘λ¨μ κ΄μ¬μ¬λ₯Ό μ€ννλ€. | @Around |
μ§μ μ΄λλ°μ΄μ€λ₯Ό λ§λλ κ²½μ° ν¨ν€μ§, ν΄λμ€, λ©μλ λ± μ΄λλ°μ΄μ€ μ½μ λμμ 쑰건μΌλ‘ μ§μ ν μ μλ€. μ§μ νλ 쑰건 λ°©λ²μλ ν¬μΈνΈμ»· μμ μ¬μ©νλ€. λ§μ ν¬μΈνΈμ»· ννμ μ€ execution μ§μμμ λν΄ μ€λͺ νκ² λ€!
Pointcut μ : execution(λ°νκ° ν¨ν€μ§.ν΄λμ€.λ©μλ(μΈμ))
ν¬μΈνΈμ»· μμ μμΌλ μΉ΄λλ₯Ό μ΄μ©νμ¬ μ μ°νκ² μ μ© λ²μλ₯Ό μ§μ ν μ μλ€.
μμΌλμΉ΄λ | λ΄μ© |
---|---|
* (μ μ€ν°λ¦¬μ€ν¬) | μμμ λ¬Έμμ΄μ λνλ΄κ³ , ν¨ν€μ§λ₯Ό λνλΌ λλ μμμ ν¨ν€μ§ ν κ³μΈ΅μ λνλΈλ€. λ©μλμ μΈμμμλ ν κ°μ μΈμλ₯Ό λνλ΄ λ°νκ°μΌλ‘λ μ΄μ©νλ€. |
.. (μ λκ°) | ν¨ν€μ§λ₯Ό λνλ΄λ κ²½μ° 0κ° μ΄μμ ν¨ν€μ§λ₯Ό λνλΈλ€. λ©μλμ μΈμλ₯Ό νννλ κ²½μ°μλ 0κ° μ΄μμ μμμ μΈμλ₯Ό λνλΈλ€. |
+ (νλ¬μ€) | ν΄λμ€λͺ λ€μ κΈ°μ ν΄ ν΄λμ€μ κ·Έ μλΈν΄λμ€ λ° κ΅¬ν ν΄λμ€ λͺ¨λλ₯Ό λνλΈλ€. |
ꡬν μ | λ΄μ© |
---|---|
execution(* com.example.service.DemoService.*(..)) | DemoService ν΄λμ€μ λ©μλμ μ΄λλ°μ΄μ€λ₯Ό μ μ©νλ€. |
execution(* com.example.service.DemoService.select*(..)) | DemoService ν΄λμ€μ selectλ‘ μμνλ λ©μλμ μ΄λλ°μ΄μ€λ₯Ό μ μ©νλ€. |
execution(String com.example.service.DemoService.*(..)) | DemoService ν΄λμ€μ λ°νκ°μ΄ String νμ μΈ λ©μλμ μ΄λλ°μ΄μ€λ₯Ό μ μ©νλ€. |
execution(* com.example.service.DemoService.*(String, ..)) | DemoService ν΄λμ€μ 첫 λ²μ§Έ μΈμκ° String νμ μΈ λ©μλμ μ΄λλ°μ΄μ€λ₯Ό μ μ©νλ€. |
execution(* com.example.service..*.*(..)) | service ν¨ν€μ§ λ°λ‘ μλμ νμ ν¨ν€μ§μ λͺ¨λ ν΄λμ€μ μ΄λλ°μ΄μ€λ₯Ό μ μ©νλ€. |
execution(* com.example.service.DemoService.*(*)) | DemoService ν΄λμ€μ μΈμκ° νλμΈ λ©μλμ μ΄λλ°μ΄μ€λ₯Ό μ μ©νλ€. |
μ΄λλ°μ΄μ€λ₯Ό κΈ°μ νλ ν΄λμ€λ @Aspect μ΄λ
Έν
μ΄μ
μ λΆμ¬νλ€.
κ·Έλ¦¬κ³ μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν΄ @Component μ΄λ
Έν
μ΄μ
μ λΆμ¬νλ€.
ν΄λμ€ μμ Advice λ©μλλ₯Ό μμ±νκ³ λ©μλ μΈμλ‘λ JoinPointλ₯Ό μ λ¬νλ€.
//λνμ μΈ μ
@Before("execution(* com.example.demo.chater03.used.*Greet.*(..))")
public void beforeAdvice(JoinPoint joinpoint){
//μμ λΆλΆ νμ
System.out.println("====Before Advice===="
//λ μ§ μΆλ ₯
SYstem.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
//λ©μλ μ΄λ¦ μΆλ ₯
System.out.println(String.format("λ©μλ : %s, joinPoint.getSignature().getName()));
}
//μΆλ ₯ κ²°κ³Ό
====Before Advice====
2023/10/30
λ©μλ : greeting
---------------------
μ’μ μ λ
μ
λλ€.
---------------------
ν΄λΉ μμλ₯Ό ν΄μνλ€λ©΄ com.example.demo.chapter03.usedμμ ν΄λμ€ μ΄λ¦μ΄ Greetλ‘ λλλ ν΄λμ€μ λͺ¨λ λ©μλμ λν΄ 'λ μ§μ λ©μλ μ΄λ¦μ νμνλ μ΄λλ°μ΄μ€'λ₯Ό μμ±ν ν μ€νν κ²°κ³Όμ΄λ€.
Around Adviceλ₯Ό μ μΈν κ±°μ λͺ¨λ μ΄λλ°μ΄μ€λ μμ λ°©μμΌλ‘ μ½λλ₯Ό μμ±νλ©΄ λλ€.
+) Around Advice μμ±
//λνμ μΈ μ
@Around("execution(* com.example.demo.chater03.used.*Greet.*(..))")
public void aroundAdvice(ProceedingJoinPoint joinpoint) thorws Throwable{
//μμ λΆλΆ νμ
System.out.println("====Around Advice===="
System.out.println("βΌβΌ μ²λ¦¬μ βΌβΌ");
//μ§μ ν ν΄λμ€μ λ©μλ μ€ν
Object result = joinPoint.proceed();
System.out.println("β²β² μ²λ¦¬ν β²β²")
//λ°νκ°μ λλ €μ€ νμκ° μλ κ²½μ° Object νμ
μ λ°νκ°μΌλ‘ λλ €μ€λ€.
return result;
}
//μΆλ ₯ κ²°κ³Ό
====Around Advice====
βΌβΌ μ²λ¦¬μ βΌβΌ
---------------------
μ’μ μ λ
μ
λλ€.
---------------------
β²β² μ²λ¦¬ν β²β²"
---------------------