JointPoint ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด JointPoint๋ฅผ ์ด๋๋ฐ์ด์ค ๋ฉ์๋ ๋งค๊ฐ๋ณ์๋ก ์ ์ธ๋ง ํ๋ฉด ๋๋ค.
์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก JointPoint ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฉ์๋ ํธ์ถ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ JointPoint ๊ฐ์ฒด์ ์ ์ฅํ์ฌ ์ด๋๋ฐ์ด์ค ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ๋๊ฒจ์ค๋ค.
1. Before ์ด๋๋ฐ์ด์ค
ํด๋ผ์ด์ธํธ๊ฐ ๋น์ฆ๋์ค ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ์ธ์๋ก ๋๊ฒจ์ค ๊ฐ๋ค์ JoinPoint๋ฅผ ์ด์ฉํ์ฌ ์ถ๋ ฅํ๋๋ก ์์ฑํ๋ค.
JoinPoint ๊ฐ์ฒด์ getSignature() ๋ฉ์๋๊ฐ ๋ฆฌํดํ๋ Signature ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ฉด, ํธ์ถ๋๋ ๋ฉ์๋์ ๋ํ ๋ค์ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค. getName(), getLongString() ๋ฑ์ด ์๋ค. getArgs() ๋ฉ์๋๋ฅผ ํตํด์๋ ์ธ์ ๋ชฉ๋ก์ Object ๋ฐฐ์ด๋ก ์ป์ด๋ผ ์ ์๋ค.
package com.springbook.biz.common;
import org.aspectj.lang.JoinPoint;
public class BeforeAdvice {
public void beforeLog(JoinPoint jp){
String method = jp.getSignature().getName();
Object[] args = jp.getArgs();
System.out.println("[์ฌ์ ์ฒ๋ฆฌ] " + method + "() ๋ฉ์๋ ARGS ์ ๋ณด : " + args[0].toString());
}
}
2. After Returning ์ด๋๋ฐ์ด์ค
Object ํ์ ์ ๋ณ์๊ฐ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ์ธ๋์ด ์๋๋ฐ, '๋ฐ์ธ๋ ๋ณ์'๋ผ๊ณ ํ๋ค.๋ฐ์ธ๋ ๋ณ์๋ ๋น์ฆ๋์ค ๋ฉ์๋๊ฐ ๋ฆฌํดํ ๊ฒฐ๊ด๊ฐ์ ๋ฐ์ธ๋ฉํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
package com.springbook.biz.common;
import org.aspectj.lang.JoinPoint;
import com.springbook.biz.user.UserVO;
public class AfterReturningAdvice {
public void afterLog(JoinPoint jp, Object returnObj) {
String method = jp.getSignature().getName();
if (returnObj instanceof UserVO) {
UserVO user = (UserVO) returnObj;
if (user.getRole().equals("Admin")) {
System.out.println(user.getName() + " ๋ก๊ทธ์ธ(Admin)");
}
}
System.out.println("[์ฌํ ์ฒ๋ฆฌ] " + method + "() ๋ฉ์๋ ๋ฆฌํด๊ฐ : " + returnObj.toString());
}
}
๋ฐ์ธ๋ ๋ณ์๊ฐ ์ถ๊ฐ๋์๋ค๋ฉด ๋ฐ๋์ ๋ฐ์ธ๋ ๋ณ์์ ๋ํ ๋งคํ ์ค์ ์ ์คํ๋ง ์ค์ ํ์ผ(applicationContext.xml)์ ์ถ๊ฐํด์ผ ํ๋ค. ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด <aop:after-returning> ์๋ฆฌ๋จผํธ์ returing ์์ฑ์ ์ด์ฉํ๋ค.
<aop:after-returning pointcut-ref="getPointcut" method="afterLog" throwing="returnObj"/>
3. After Throwing ์ด๋๋ฐ์ด์ค
์ด๋ฒ์๋ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ์์ธ ํด๋์ค์ ์ต์์ ํ์ ์ธ Exception์ ์ ์ธํ์ฌ exceptObj ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
package com.springbook.biz.common;
import org.aspectj.lang.JoinPoint;
public class AfterThrowingAdvice {
public void exceptionLog(JoinPoint jp, Exception exceptObj) {
String method = jp.getSignature().getName();
// System.out.println("[์์ธ ์ฒ๋ฆฌ] " + method + "() ๋ฉ์๋ ์ํ ์ค ๋ฐ์๋ ์์ธ ๋ฉ์์ง : " + exceptObj.getMessage());
System.out.println(method + "() ๋ฉ์๋ ์ํ ์ค ์์ธ ๋ฐ์!");
if (exceptObj instanceof IllegalArgumentException) {
System.out.println("๋ถ์ ํฉํ ๊ฐ์ด ์
๋ ฅ๋์์ต๋๋ค.");
} else if (exceptObj instanceof NumberFormatException) {
System.out.println("์ซ์ ํ์์ ๊ฐ์ด ์๋๋๋ค.");
} else if (exceptObj instanceof Exception) {
System.out.println("๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
}
}
}
๋ฐ์ธ๋ ๋ณ์๊ฐ ์ถ๊ฐ๋์๋ค๋ฉด ๋ฐ๋์ ๋ฐ์ธ๋ ๋ณ์์ ๋ํ ๋งคํ ์ค์ ์ ์คํ๋ง ์ค์ ํ์ผ(applicationContext.xml)์ ์ถ๊ฐํด์ผ ํ๋ค. ์ด ๋ throwing ์์ฑ์ ์ด์ฉํ๋ค.
<aop:after-throwing pointcut-ref="allPointcut" method="exceptionLog" throwing="exceptObj"/>
4. Around ์ด๋๋ฐ์ด์ค
Around ์ด๋๋ฐ์ด์ค๋ ๋ค๋ฅธ ์ด๋๋ฐ์ด์ค์ ๋ค๋ฅด๊ฒ ๋ฐ๋์ ProceedingJoinPoint ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ผ ํ๋ค.
Around ์ด๋๋ฐ์ด์ค์์๋ง proceed() ๋ฉ์๋๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ProceedingJoinPoint ๊ฐ์ฒด๋ ๋น์ฆ๋์ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋ proceed() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ JoinPoint๋ฅผ ์์ํ๋ค.
package com.springbook.biz.common;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.util.StopWatch;
public class AroundAdvice {
public Object aroundLog(ProceedingJoinPoint pjp) throws Throwable {
String method = pjp.getSignature().getName();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object obj = pjp.proceed();
stopWatch.stop();
System.out.println(method + "() ๋ฉ์๋ ์ํ์ ๊ฑธ๋ฆฐ ์๊ฐ : " + stopWatch.getTotalTimeMillis() + "(ms)์ด");
return obj;
}
}
'Spring > Spring Quick Start' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํธ๋์ญ์ (Transaction) ์ ์ฉ (0) | 2021.01.07 |
---|---|
ํ๋กํผํฐ ํ์ผ์ ์ด์ฉํ Spring JDBC (0) | 2021.01.07 |
Annotation ๊ธฐ๋ฐ AOP ์ ์ฉ (0) | 2021.01.07 |
Advice ๋์ ์์ (0) | 2021.01.07 |
ํฌ์ธํธ์ปท ํํ์ (0) | 2021.01.07 |
AOP ์๋ฆฌ๋จผํธ (0) | 2021.01.07 |