๊ฐ๋ฐ ์ง์, ์คํฌ๋ฆฝํธ/Spring
(Spring) AOP --์ ๋ฆฌ ์ค
์ํ๋ฆฌํฐ์งํธ
2024. 2. 8. 16:00
//๋ก๊น xml ๊น์ง ์น ๋ค ์ ๋ฆฌํ๊ธฐ
package dev.syntax.aop.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
// Logging์ ๋ํ ๊ด์ฌ์ฌ๋ฅผ ๋ณ๋์ ๋ชจ๋์ธ ํ๋์ Aspect๋ก ์ง์
@Aspect // ํด๋น ํด๋์ค๊ฐ AOP์ ์ ์คํํธ๋ผ๊ณ ๋ช
์
@Component // ์คํ๋ง ์ปจํ
์ด๋์๊ฒ LoggingAspect๋ฅผ ํ๋์ ๋น์ผ๋ก ๋ฑ๋กํด์ ์คํ๋ง AOP ํ๋ ์์ํฌ๊ฐ ์ด Aspect๋ฅผ ์ ์ ์๋๋ก
@Slf4j // ๋ก๊น
์ ์ํ ๋กฌ๋ณต Annotation
public class LoggingAspect {
/*
* Advice: ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๊ตฌํํ๋ Aspect์ ๋ฉ์๋, ์ด ์ฝ๋์์๋ logBefore()
* JoinPoint: ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ ๋ฉ์๋
* Pointcut: ๊ฐ ์ด๋๋ฐ์ด์ค์์ ๊ทธ ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ ๋ฉ์๋๋ฅผ ๊ตฌ๋ณ์์ผ์ฃผ๋ ๊ตฌ๋ณ์(ํํ์)
*/
// ํฌ์ธํธ์ปท ์ ↓
// execution: ๋ฉ์๋์ ์ด๋ฆ ํจํด์ ์ฌ์ฉํ๊ฒ ๋ค
// execution( *(Asterisk) ~ : ๋ฉ์๋์ ๋ฐํ ํ์
์ ๋ฌด์์ ์ฌ์ฉํ๋ ์๊ด์์
// dev.syntax.aop.controller : ํด๋น ํจํค์ง ํ์์ ์ํด์ผํจ
// *Controller : ํด๋์ค ์ด๋ฆ์ด ~Controller๋ก ๋๋์ผํจ
// *( ) : ๋ฉ์๋๋ก ์ ๋ฌ๋๋ ์ธ์๋ ์๊ด์์
// (..) : ๋์ ๋ฉ ์๋๊ฐ ์ธ์๋ฅผ ๋ฐ์ ์๋ ์๊ณ , ํ๋ ์ด์์ ์ธ์๋ฅผ ๋ฐ์๋ ์๊ด์์
@Before(value = "execution(* dev.syntax.aop.controller.*Controller.*(..))")
public void logBefore(JoinPoint joinPoint) {
// ํธ์ถ๋ ํด๋์ค ๋ฐ ๋ฉ์๋์ ์ด๋ฆ ๋ก๊น
log.info("-- "
+ joinPoint.getTarget().getClass().getSimpleName() + "'s "
+ joinPoint.getSignature().getName()
);
// ํธ์ถ๋ ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ก๊น
Object[] args = joinPoint.getArgs(); // getArgs() : ๋์(Target) ๋ฉ์๋์ ์ ๋ฌ๋ ์ธ์๋ฅผ ์ป๋๋ค.
for (int i = 0; i < args.length; i++) {
log.info("args[" + i + "] -->" + args[i]);
}
}
@After(value = "execution(* dev.syntax.aop.controller.*Controller.*(..))")
public void logafter(JoinPoint joinPoint) {
log.info("-- "
+ joinPoint.getTarget().getClass().getSimpleName() + "'s "
+ joinPoint.getSignature().getName()
);
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
log.info("args[" + i + "] -->" + args[i]);
}
}
}