π€Spring AOP(Aspect Oriented Programming - κ΄μ μ§ν₯ νλ‘κ·Έλλ°) λ?
: AspectJ μ»΄νμΌλ¬μ μν΄ νλ‘κ·Έλ¨ μ€νμ ν΅μ¬κ΄μ¬μ½λμ ν‘λ¨κ΄μ¬μ½λκ° κ²°ν©(Weaving)λμ΄ μ€νλλ κΈ°λ₯ μ 곡
1) OOPλ³΄λ€ AOPκ° μ’μ μ ?
OOPμ κ²½μ° λͺ¨λν(μΊ‘μν)κ° λ무 κ°λ ₯ν΄μ ν΅μ¬κ΄μ¬μ½λμ ν‘λ¨κ΄μ¬μ½λλ₯Ό λΆλ¦¬νμ¬ νλ‘κ·Έλ¨μ μμ±νκΈ° μ΄λ €μ
=> μ½λμ μ€λ³΅μ±μ΄ λμ νλ‘κ·Έλ¨μ μμ°μ± λ° μ μ§λ³΄μμ ν¨μ¨μ± κ°μ
μ΄λ¬ν λΆλΆμ AOPλ ν΅μ¬κ΄μ¬μ½λμ ν‘λ¨κ΄μ¬μ½λλ₯Ό λΆλ¦¬ν ν, κ²°ν©μ΄ νμν λΆλΆμμλ§ κ²°ν©νμ¬ μ€νλ μ μλλ‘νμ¬ ν΄κ²°ν΄μ€!
2) Spring AOP κΈ°λ₯μ μ¬μ©νκΈ° μν΄ 2κ°μ λΌμ΄λΈλ¬λ¦¬ λΉλ μ²λ¦¬ νμ
μλ aspectjrt λΌμ΄λΈλ¬λ¦¬μ aspectjweaver λΌμ΄λΈλ¬λ¦¬κ° νλ‘μ νΈμ λΉλ μ²λ¦¬ - λ©μ΄λΈ μ¬μ©
=> μλ μ¬μ΄νΈμμ μ λκ°μ λΌμ΄λΈλ¬λ¦¬ νμΌ μ°Ύμμ pom.xml νμΌμ λΉλμ²λ¦¬νλ©΄ λ¨
κ·Έλ°λ° aspectjrtλ μ΄λ―Έ λΉλμ²λ¦¬ λμ΄ μμ. Springμ΄ μ체μ μΌλ‘ μ¬μ©νλ€κ³ ν¨. aspectjweaver λΌμ΄λΈλ¬λ¦¬λ§ κ²μ!
pom.xml νμΌμ μλ μ½λ λΆμ¬ λ£μΌλ©΄ κ·Έκ²μ΄ λ°λ‘ λΉλ μ²λ¦¬!
<!--μ΄κ±΄ μ΄λ―Έ λΉλ μ²λ¦¬ λμ΄ μμμ -->
<!-- AspectJ - Spring AOP κΈ°λ₯μ μ 곡νκΈ° μν λΌμ΄λΈλ¬λ¦¬ -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<!-- => AspectJ μ»΄νμΌλ¬μ μν΄ μμ±λ Proxy ν΄λμ€μ μ€ν κ΄λ¦¬ κΈ°λ₯μ μ 곡νκΈ° μν λΌμ΄λΈλ¬λ¦¬ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!--μ΄κ±°λ§ νλ©΄ λ¨ -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<!-- => AspectJ μ»΄νμΌλ¬λ‘ ν΅μ¬κ΄μ¬μ½λμ ν‘λ¨κ΄μ¬μ½λκ° κ²°ν©λ ν΄λμ€(Proxy ν΄λμ€)λ₯Ό
μμ±νλ Weaving κΈ°λ₯μ μ 곡νκΈ° μν λΌμ΄λΈλ¬λ¦¬ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
<scope>runtime</scope>
</dependency>
3) Spring AOPμ ꡬν(2κ°μ§ λ°©λ² μμ)
- Spring Bean Configuration File(XML) νμΌμ μ리먼νΈλ₯Ό μ¬μ©νμ¬ νκ²½ μ€μ
or
- AOP κ΄λ ¨ μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μ€μ
β«μ λ κ°μ§ λ°©λ²μ μλ λΈλ‘κ·Έ μ°Έκ³ !
[Spring Core] AOP(Aspect Oriented Programming) - 2νΈ(Advice μ μ, @Before, @AfterReturning, @AfterThrowing, @After, @Around)
AOP - 2νΈ (Advice μ μ) [μλ° κΈ°λ° μ€μ λ°©μμμμ Advice μ μ] μμ μ€νλ§ AOPμμ νμ© κ°λ₯ν Adviceλ‘ λ€μ― κ°μ§ μ’ λ₯κ° μλ€κ³ νλ€. μ΄μ κ°κ°μ ꡬν λ°©μμ μλ₯Ό λ€μ΄ μ΄ν΄λ³΄μ. Before μ΄λ―Έ μ
kgvovc.tistory.com
cf)
*ν΅μ¬κ΄μ¬μ½λ: νλ‘κ·Έλ¨ μ€νμ ν΅μ¬μ μΈ κΈ°λ₯μ μ 곡νλ λͺ λ Ή - λ°μ΄ν μ²λ¦¬ λͺ λ Ή
*ν‘λ¨κ΄μ¬μ½λ: νλ‘κ·Έλ¨ μ€νμ 보쑰μ μΈ κΈ°λ₯μ μ 곡νλ λͺ λ Ή - λ‘κ·Έ μ²λ¦¬, κΆν μ²λ¦¬, νΈλ μ μ μ²λ¦¬, μμΈ μ²λ¦¬ λ±
π©π»μ€μ΅ μ½λ
1) ν΅μ¬κ΄μ¬μ½λ(λ°μ΄ν° μ²λ¦¬λ₯Ό λͺ λ Ήνλ λ©μλ)λ₯Ό μμ±ν JoinPointBean ν΄λμ€
package xyz.itwill06.aop;
//ν΅μ¬κ΄μ¬λͺ¨λ
public class JoinPointBean {
public void add() {
System.out.println("*** JoinPointBean ν΄λμ€μ add() λ©μλ νΈμΆ ***");
}
public void modify(int num, String name) {
System.out.println("*** JoinPointBean ν΄λμ€μ modify(int num, String name) λ©μλ νΈμΆ ***");
}
public void remove(int num) {
System.out.println("*** JoinPointBean ν΄λμ€μ remove(int num) λ©μλ νΈμΆ ***");
}
public String getName() {
System.out.println("*** JoinPointBean ν΄λμ€μ getName() λ©μλ νΈμΆ ***");
return "νκΈΈλ";
}
public void calc(int num1, int num2) {
System.out.println("*** JoinPointBean ν΄λμ€μ calc(int num1, int num2) λ©μλ νΈμΆ ***");
System.out.println("λͺ« = "+(num1/num2));
}
}
2) ν‘λ¨κ΄μ¬μ½λ(λ°μ΄ν° μ²λ¦¬ λͺ λ Ήμ μ μΈν 보쑰μ μΈ κΈ°λ₯μ λͺ λ Ήνλ λ©μλ)λ₯Ό μμ±ν JoinPointAdvice ν΄λμ€
=> ν‘λ¨κ΄μ¬μ½λλ₯Ό μμ±ν ν΄λμ€λ₯Ό Advice ν΄λμ€λΌκ³ λΆλ₯Έλ€
<μ£Όμ ν€μλ νμΈνκ³ μλ μ€μ΅μ½λ νμΈνκΈ° ! >
• νκ² λ©μλ(Target Method) : ν΅μ¬κ΄μ¬λͺ¨λ(=μμ 1λ² ν΄λμ€)μ λ©μλ μ€ PointCut μΈμ΄λ‘ μ§μ λμ΄ ν‘λ¨κ΄μ¬μ½λκ° μ½μ λΌ μ€νλ λ©μλ
=> PointCut μΈμ΄ : ν΅μ¬κ΄μ¬λͺ¨λμ λ©μλ μ€ νΉμ λ©μλλ§μ μ§μ νκΈ° μν μΈμ΄
• Before Advice Method : νκ² λ©μλμ λͺ
λ Ή μ€νμ μ μ½μ
λμ΄ μ€νλ λͺ
λ Ήμ μμ±ν λ©μλ
=> JoinPoint : ν΅μ¬κ΄μ¬μ½λλ₯Ό κΈ°μ€μΌλ‘ ν‘λ¨κ΄μ¬μ½λκ° μ½μ λμ΄ μ€νλ μμΉ
=> Around Advice Methodλ₯Ό μ μΈν λλ¨Έμ§ Advice Methodλ μΌλ°μ μΌλ‘ λ°ννμ [void]λ‘ μμ±νκ³ λ§€κ°λ³μλ₯Ό μμ±νμ§ μκ±°λ JoinPoint μΈν°νμ΄μ€λ₯Ό μλ£νμΌλ‘ μ¬μ©νλ λ§€κ°λ³μ μμ± κ°λ₯
=> Advice ν΄λμ€μ λ©μλλ₯Ό κ·μΉμ λ§μ§ μκ² μμ±ν κ²½μ° IllegalArgumentException λ°μ
• JoinPoint κ°μ²΄ : νκ²λ©μλ κ΄λ ¨ μ λ³΄κ° μ μ₯λ κ°μ²΄
=> AspectJ μ»΄νμΌλ¬μ μν΄ Advice ν΄λμ€μ λ©μλκ° νΈμΆλ λ νκ²λ©μλ κ΄λ ¨ μ 보λ₯Ό μ μ₯ν JoinPoint κ°μ²΄λ₯Ό λ§€κ°λ³μμ μ λ¬νμ¬ μ μ₯
=> Advice ν΄λμ€μ λ©μλμμ νκ²λ©μλ κ΄λ ¨ μ λ³΄κ° νμν κ²½μ° λ§€κ°λ³μλ₯Ό μ μΈνμ¬ JoinPoint κ°μ²΄λ₯Ό μ λ¬λ°μ JoinPoint κ°μ²΄μ λ©μλλ₯Ό νΈμΆνμ¬ μ¬μ© κ°λ₯
• JoinPoint.getTarget() : νκ²λ©μλλ₯Ό νΈμΆν κ°μ²΄(ν΅μ¬κ΄μ¬λͺ¨λ - Spring Bean)λ₯Ό λ°ννλ λ©μλ
=> Object νμ
μ κ°μ²΄ λ°ν
• Object.getClass() : κ°μ²΄λ₯Ό μμ±ν ν΄λμ€μ Class κ°μ²΄λ₯Ό λ°ννλ λ©μλ
• Class.getName() : Class κ°μ²΄μ ν΄λμ€(ν¨ν€μ§ ν¬ν¨)λ₯Ό λ¬Έμμ΄λ‘ λ°ννλ λ©μλ
System.out.println(joinPoint.getTarget().getClass().getName());
• Class.getSimpleName() : Class κ°μ²΄μ ν΄λμ€(ν¨ν€μ§ λ―Έν¬ν¨)λ₯Ό λ¬Έμμ΄λ‘ λ°ννλ λ©μλ
System.out.println(joinPoint.getTarget().getClass().getSimpleName());
• JoinPoint.getSignature() : νκ²λ©μλμ μ λ³΄κ° μ μ₯λ Signature κ°μ²΄λ₯Ό λ°ννλ λ©μλ
• Signature.getName() : νκ²λ©μλμ μ΄λ¦μ λ°ννλ λ©μλ
System.out.println(joinPoint.getSignature().getName());
• JoinPoint.getArgs() : νκ²λ©μλμ λ§€κ°λ³μμ μ μ₯λ λͺ¨λ κ°(κ°μ²΄)μ Object λ°°μ΄λ‘ λ°ννλ λ©μλ
System.out.println(joinPoint.getArgs());
<μ€νλ§.AOPμμ νμ© κ°λ₯ν 5κ°μ§ μ’ λ₯μ Adivce ν΄λμ€>
1) Before Advice Method
package xyz.itwill06.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
//ν‘λ¨κ΄μ¬λͺ¨λ
public class JoinPointAdvice {
public void beforeDisplay(JoinPoint joinPoint) {
//System.out.println("### [before]ν΅μ¬κ΄μ¬μ½λ μ€ν μ μ μ½μ
λμ΄ μ€νλ ν‘λ¨κ΄μ¬μ½λ ###");
String className=joinPoint.getTarget().getClass().getSimpleName();
String methodName=joinPoint.getSignature().getName();
Object[] params=joinPoint.getArgs();
System.out.print("### [before]"+className+" ν΄λμ€μ "+methodName+"(");
for(int i=0;i<params.length;i++) {
System.out.print(params[i]);
if(i < params.length-1) {
System.out.print(", ");
}
}
System.out.println(") λ©μλ νΈμΆ ###");
}
//μλ μ΄μ΄μ
2) After Advice Mehtod
public void displayMessage(JoinPoint joinPoint) {
//System.out.println("### [after]ν΅μ¬κ΄μ¬μ½λ μ€ν νμ 무쑰건 μ½μ
λμ΄ μ€νλ ν‘λ¨κ΄μ¬μ½λ ###");
Object[] params=joinPoint.getArgs();
System.out.println("### [after]μ¬μλ²νΈκ° "+params[0]+"μΈ μ¬μμ 보λ₯Ό μμ νμμ΅λλ€.");
}
//μλ μ΄μ΄μ
3) After Returning Advice Mehtod
After Returning Advice Mehtodμλ JoinPoint μΈν°νμ΄μ€μ λ§€κ°λ³μ μΈμ Object ν΄λμ€μ λ§€κ°λ³μ μμ± κ°λ₯
=> AspectJ μ»΄νμΌλ¬λ Object ν΄λμ€μ λ§€κ°λ³μμ νκ²λ©μλμ λ°νκ°μ μ 곡λ°μ μ μ₯
=> νκ²λ©μλμμ λ°νλλ κ°(κ°μ²΄)μ μλ£νμ΄ κ³ μ λμ΄ μλ κ²½μ° Object ν΄λμ€ λμ λ°νλλ κ°(κ°μ²΄)μ μλ£νμΌλ‘ λ§€κ°λ³μ μμ± κ°λ₯
=> After Returning Advice Mehtodμ Object ν΄λμ€μ λ§€κ°λ³μκ° μμ±λ κ²½μ° Spring Bean Configuration Fileμ AOP μ€μ μμ after-returning μ리먼νΈμ returning μμ±μ λ°λμ μμ±νμΌ νκ²λ©μλμ λ°νκ°μ μ μ₯ν λ§€κ°λ³μλ₯Ό μ§μ
=> after-returning μ리먼νΈμ returning μμ±μ΄ μκ±°λ μμ±κ°μ΄ μλͺ» μ€μ λλ©΄ IllegalArgumentException λ°μ
public void displayName(JoinPoint joinPoint, Object object) {
//System.out.println("### [after-returning]ν΅μ¬κ΄μ¬μ½λκ° μ μμ μΌλ‘ μ€νλ νμ μ½μ
λμ΄ μ€νλ ν‘λ¨κ΄μ¬μ½λ ###");
String methodName=joinPoint.getSignature().getName();
String userName=(String)object;
System.out.println("### [after-returning]"+methodName+" λ©μλμ λ°νκ° = "+userName);
}
//μλ μ΄μ΄μ
4) After Throwing Advice Mehtod
After Throwing Advice Mehtodμλ JoinPoint μΈν°νμ΄μ€μ λ§€κ°λ³μμΈμ Exception ν΄λμ€μ λ§€κ°λ³μ μμ± κ°λ₯
=> AspectJ μ»΄νμΌλ¬λ Exception ν΄λμ€μ λ§€κ°λ³μμ νκ²λ©μλμμ λ°μλ μμΈ(Exception κ°μ²΄)λ₯Ό μ 곡λ°μ μ μ₯
=> νκ²λ©μλμμ λ°μλλ μμΈκ° κ³ μ λμ΄ μλ κ²½μ° Exception ν΄λμ€ λμ νμν
μμΈ ν΄λμ€λ‘ λ§€κ°λ³μ μμ± κ°λ₯
=> After Throwing Advice Mehtodμ Exception ν΄λμ€μ λ§€κ°λ³μκ° μμ±λ κ²½μ° Spring Bean
Configuration Fileμ AOP μ€μ μμ after-throwing μ리먼νΈμ throwing μμ±μ λ°λμ
μμ±ν΄μΌ νκ²λ©μλμμ λ°μλ μμΈκ° μ μ₯λ λ§€κ°λ³μλ₯Ό μ§μ
=> after-throwing μ리먼νΈμ throwing μμ±μ΄ μκ±°λ μμ±κ°μ΄ μλͺ» μ€μ λλ©΄ IllegalArgumentException λ°μ
public void exceptionHandle(JoinPoint joinPoint, Exception exception) {
//System.out.println("### [after-throwing]ν΅μ¬κ΄μ¬μ½λμμ μμΈκ° λ°μλ νμ μ½μ
λμ΄ μ€νλ ν‘λ¨κ΄μ¬μ½λ ###");
String methodName=joinPoint.getSignature().getName();
System.out.println("### [after-throwing]"+methodName+" λ©μλμμ λ°μλ μμΈ = "
+exception.getMessage());
}
//μλ μ΄μ΄μ
5) Around Advice Method
Around Advice Methodλ Object ν΄λμ€λ‘ λ°ννμ μμ±νκ³ ProceedingJoinPoint μΈν°νμ΄μ€λ‘ λ§€κ°λ³μλ₯Ό μμ±νμ¬ μ μΈ
νκ²λ©μλμ λ°νκ°μ μ 곡λ°μ Around Advice Methodμμ λ°ννκΈ° μν΄ λ°νν μμ±
=> νκ²λ©μλμ λ°νκ°μ΄ μλ κ²½μ° void μλ£νμΌλ‘ λ°ννμ μμ±ν μ μμ§λ§ νκ²λ©μλμ λ°νκ°μ΄ μλ κ²½μ° void μλ£νμΌλ‘ λ°ννμ μμ±νλ©΄ μλ¬ λ°μ
νκ²λ©μλ κ΄λ ¨ μ 보λ₯Ό ProceedingJoinPoint μΈν°νμ΄μ€μ λ§€κ°λ³μλ‘ μ 곡λ°μ μ¬μ©
=> ProceedingJoinPoint κ°μ²΄ : νκ²λ©μλ κ΄λ ¨ μ 보λ₯Ό μ μ₯νκΈ° μν κ°μ²΄
=> JoinPoint κ°μ²΄μ λ€λ₯Έμ μ ProceedingJoinPoint κ°μ²΄λ‘ νκ²λ©μλλ₯Ό μ§μ νΈμΆ κ°λ₯
public Object display(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("### [around]ν΅μ¬κ΄μ¬μ½λ μ€ν μ μ μ½μ
λμ΄ μ€νλ ν‘λ¨κ΄μ¬μ½λ ###");
//ProceedingJoinPoint.proceed() : ProceedingJoinPoint κ°μ²΄λ‘ νκ²λ©μλλ₯Ό νΈμΆνλ λ©μλ
// => νκ²λ©μλλ₯Ό νΈμΆνμ¬ λ°νλλ κ²°κ³Όκ°μ λ³μμ μ μ₯
// => Throwable(Error ν΄λμ€μ Exception ν΄λμ€μ λΆλͺ¨ν΄λμ€) κ°μ²΄κ° λ°μλλ―λ‘ λ°λμ
//μμΈ μ²λ¦¬νκ±°λ μμΈ μ λ¬
Object result=joinPoint.proceed();
System.out.println("### [around]ν΅μ¬κ΄μ¬μ½λ μ€ν νμ μ½μ
λμ΄ μ€νλ ν‘λ¨κ΄μ¬μ½λ ###");
return result;//νκ²λ©μλμ λ°νκ°μ λ°ν μ²λ¦¬
}
}
'Backend > Spring Framework' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
MVC2 ν¨ν΄(μμ μ½λ) & νκ³μ (0) | 2024.02.26 |
---|---|
MVC1 ν¨ν΄ vs MVC2 ν¨ν΄(+Spring MVC2 ν¨ν΄) (0) | 2024.02.26 |