์ด๋ฒ์๋ @Aspect๋ฅผ ํตํด AOP๋ฅผ ๊ตฌํํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด๋ฒ ๊ธ์ ์๋ ์ฌ๋ฌ ํ์ฉ ์์์ ์ด๋๋ฐ์ด์ค๊ฐ์ ์์๋ค์ ๋ํด ์์๋ณด๊ณ ,
์ด๋๋ฐ์ด์ค์ ์ข ๋ฅ์ ํฌ์ธํธ์ปท ํํ์์ ๋ค์ ๊ธ์ ์ด์ด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํฌ์ธํธ์ปท๊ณผ ์ด๋๋ฐ์ด์ค ๋์ ์์ฑ
@Aspect
class AspectV1 {
val log = logger<AspectV1>()
@Around("execution(* hello.advanced..*(..))")
private fun doLog(joinPoint: ProceedingJoinPoint): Any? {
log.info("{}", joinPoint.signature)
return joinPoint.proceed()
}
}
ํฌ์ธํธ์ปท์ ๋ถ๋ฆฌ - @Pointcut
@Aspect
class AspectV2 {
val log = logger<AspectV2>()
//== ํฌ์ธํธ์ปท ๋ถ๋ฆฌ ==//
@Pointcut("execution(* hello.advanced.app..*(..))")
private fun allOrder(){}
@Around("allOrder()")
private fun doLog2(joinPoint: ProceedingJoinPoint): Any? {
log.info("log 2{}", joinPoint.signature)
return joinPoint.proceed()
}
}
@Pointcut์ ํฌ์ธํธ์ปท ํํ์์ ์ฌ์ฉํฉ๋๋ค.
ํด๋น ๋ฉ์๋์ ์ด๋ฆ๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ํฉ์ณ์ ํฌ์ธํธ์ปท ์๊ทธ๋์ฒ๋ผ ํฉ๋๋ค.
(์ ์ฝ๋์์๋ allOrder()๊ฐ ์๊ทธ๋์ฒ์ ๋๋ค.)
์ ๊ทผ์๋ ๋ด๋ถ์์๋ง ์ฌ์ฉํ๋ฉด private์ ์ฌ์ฉํด๋ ๋์ง๋ง, ์ธ๋ถ ์ ์คํฉํธ์์๋ ํด๋น ํฌ์ธํธ์ปท์ ์ฌ์ฉํ๋ ค๋ฉด public์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํฌ์ธํธ์ปท ์กฐํฉ
@Aspect
class AspectV3 {
val log = logger<AspectV3>()
@Pointcut("execution(* hello.advanced.app..*(..))")
private fun allOrder(){}
@Pointcut("execution(* *..*Service*.*(..))")
private fun allService(){}
@Around("allOrder() && allService()")//hello.advanced.app ํจํค์ง์ ํ์ ํจํค์ง๋ฑ ์ค ํด๋์ค ์ด๋ฆ ํจํด์ด xxService
private fun doLog3(joinPoint: ProceedingJoinPoint): Any? {
log.info("log 3{}", joinPoint.signature)
return joinPoint.proceed()
}
}
ํฌ์ธํธ์ปท์ &&(AND), ||(OR), !(NOT) ์กฐํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ธ๋ถ ํฌ์ธํธ์ปท ์ฐธ์กฐ
package hello.advanced.aop.log
class Pointcuts {
@Pointcut("execution(* hello.advanced.app..*(..))")
fun allOrder(){}
@Pointcut("execution(* *..*Service*.*(..))")
fun allService(){}
@Pointcut("allOrder() && allService()")
fun orderAndService(){}
}
@Aspect
class AspectV4 {
val log = logger<AspectV4>()
@Around("hello.advanced.aop.log.Pointcuts.orderAndService()")
private fun doLog4(joinPoint: ProceedingJoinPoint): Any? {
log.info("log 4{}", joinPoint.signature)
return joinPoint.proceed()
}
}
์ด๋๋ฐ์ด์ค ์์ ์ง์ ํ๊ธฐ - @Order
@Order๋ ํด๋์ค ๋จ์์ ์ฐ์ ์์๋ฅผ ์ง์ ํฉ๋๋ค.
ํ ํด๋์ค ๋ด๋ถ์์์ @Order๋ ์๋ํ์ง ์์ต๋๋ค.
@Order๋ ์ซ์๊ฐ ์์์๋ก ์ฐ์ ์์๊ฐ ๋์ต๋๋ค.
ํ ์คํธ
@Aspect
class AspectV5 {
val log = logger<AspectV5>()
@Order(100)
@Around("hello.advanced.aop.log.Pointcuts.orderAndService()")//hello.advanced.app ํจํค์ง์ ํ์ ํจํค์ง๋ฑ ์ค ํด๋์ค ์ด๋ฆ ํจํด์ด xxService
private fun log1(joinPoint: ProceedingJoinPoint): Any? {
log.info("BOO {}", joinPoint.signature)
return joinPoint.proceed()
}
@Order(1)
@Around("hello.advanced.aop.log.Pointcuts.orderAndService()")//hello.advanced.app ํจํค์ง์ ํ์ ํจํค์ง๋ฑ ์ค ํด๋์ค ์ด๋ฆ ํจํด์ด xxService
private fun log2(joinPoint: ProceedingJoinPoint): Any? {
log.info("FOO {}", joinPoint.signature)
return joinPoint.proceed()
}
}
์ด์ ์์๋ฅผ ๋ฐ๊ฟ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@Aspect
class AspectV5 {
val log = logger<AspectV5>()
@Order(1)
@Around("hello.advanced.aop.log.Pointcuts.orderAndService()")//hello.advanced.app ํจํค์ง์ ํ์ ํจํค์ง๋ฑ ์ค ํด๋์ค ์ด๋ฆ ํจํด์ด xxService
private fun log1(joinPoint: ProceedingJoinPoint): Any? {
log.info("BOO {}", joinPoint.signature)
return joinPoint.proceed()
}
@Order(100)
@Around("hello.advanced.aop.log.Pointcuts.orderAndService()")//hello.advanced.app ํจํค์ง์ ํ์ ํจํค์ง๋ฑ ์ค ํด๋์ค ์ด๋ฆ ํจํด์ด xxService
private fun log2(joinPoint: ProceedingJoinPoint): Any? {
log.info("FOO {}", joinPoint.signature)
return joinPoint.proceed()
}
}
Order์ ์์๋ฅผ ๋ฐ๊พธ์๋๋ฐ๋ ๊ฒฐ๊ณผ๋ ๋ฐ๋์ง ์์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
- @Aspect๋ฅผ ํด๋์ค๋ณ๋ก ๋๋ ์ ์์ฑํฉ๋๋ค.
- static inner Class๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@Aspect๋ฅผ ํด๋์ค๋ณ๋ก ๋๋๋ ๊ฒ์ ๊ฐ๋จํ๋ static inner class๋ฅผ ์ฌ์ฉํ๋ ์์๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
static inner class ํ์ฉ ์์
@Order(1)
@Aspect
class AspectV5 {
val log = logger<AspectV5>()
@Around("hello.advanced.aop.log.Pointcuts.orderAndService()")//hello.advanced.app ํจํค์ง์ ํ์ ํจํค์ง๋ฑ ์ค ํด๋์ค ์ด๋ฆ ํจํด์ด xxService
private fun log1(joinPoint: ProceedingJoinPoint): Any? {
log.info("BOO {}", joinPoint.signature)
return joinPoint.proceed()
}
@Order(2)
@Aspect
class AspectV6 {
val log = logger<AspectV6>()
@Around("hello.advanced.aop.log.Pointcuts.orderAndService()")//hello.advanced.app ํจํค์ง์ ํ์ ํจํค์ง๋ฑ ์ค ํด๋์ค ์ด๋ฆ ํจํด์ด xxService
private fun log2(joinPoint: ProceedingJoinPoint): Any? {
log.info("FOO {}", joinPoint.signature)
return joinPoint.proceed()
}
}
}
Reference
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop
'๐๏ธ Spring > AOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (2) - within (0) | 2022.08.02 |
---|---|
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (1) - execution (0) | 2022.08.02 |
[AOP] @Aspect (0) | 2022.08.01 |
[AOP] ๋น ํ์ฒ๋ฆฌ๊ธฐ(BeanPostProccessor)์AnnotationAwareAspectJAutoProxyCreator (0) | 2022.08.01 |
[AOP] ํฌ์ธํธ์ปท, ์ด๋๋ฐ์ด์ค, ์ด๋๋ฐ์ด์ (0) | 2022.08.01 |