ํฌ์ธํธ์ปท ์ง์์ (Pointcut Designators)
์คํ๋ง์์๋ ํฌ์ธํธ์ปท ํํ์์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์ AspectJ ํฌ์ธํธ์ปท ์ง์์(PCD)๋ฅผ ์ง์ํฉ๋๋ค.
- execution: ๋ฉ์๋ ์คํ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ์คํ๋ง AOP์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/870)
- within: ํน์ ํ ํ์
๋ด์ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ถ๋ชจ ํ์ ์ ์ง์ ํ๋ฉด ์ ์ฉ๋์ง ์์ต๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/871)
- this: ์คํ๋ง ๋น ๊ฐ์ฒด(์คํ๋ง AOP ํ๋ก์)๋ฅผ ๋์์ผ๋ก ํ๋ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/878)
- target: target ๊ฐ์ฒด(์คํ๋ง AOP ํ๋ก์๊ฐ ๊ฐ๋ฆฌํค๋ ์ค์ ๋์)๋ฅผ ๋์์ผ๋ก ํ๋ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/879)
- args: ์ธ์๊ฐ, ์ฃผ์ด์ง ํ์
์ ์ธ์คํด์ค์ธ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/872)
- @target: ์คํ ๊ฐ์ฒด์ ํด๋์ค์, ์ฃผ์ด์ง ํ์ ์ ์ ๋ ธํ ์ด์ ์ด ์๋ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- @args: ์ ๋ฌ๋ ์ค์ ์ธ์์ ๋ฐํ์ ์์ ํ์
์ด, ์ฃผ์ด์ง ํ์
์ ์ ๋
ธํ
์ด์
์ ๊ฐ๋ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/876)
- @within: ์ฃผ์ด์ง ์ ๋
ธํ
์ด์
์ด ์๋ ํ์
๋ด ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/874)
- @annotation: ๋ฉ์๋๊ฐ ์ฃผ์ด์ง ์ ๋
ธํ
์ด์
์ ๊ฐ์ง๊ณ ์๋ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/875)
- bean : ์คํ๋ง ์ ์ฉ ํฌ์ธํธ์ปท ์ง์์๋ก, ๋น์ ์ด๋ฆ์ผ๋ก ํฌ์ธํธ์ปท์ ์ง์ ํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/877)
@target
์คํ๋๋ ๊ฐ์ฒด์ ํด๋์ค์ ํด๋น ์ ๋ ธํ ์ด์ ์ด ๋ถ์ด์๋ ๊ฒฝ์ฐ ๋งค์นญ๋ฉ๋๋ค.
์ ํํ ํ๋์ target์ ์ ํ๋ ๊ฒ์ด๋ฏ๋ก, ํ์ ํ์ ์ ์ ์ฉ๋์ง ์์ต๋๋ค.
@within ๊ณผ์ ์ฐจ์ด
- @target : ์คํ๋๋ ์ธ์คํด์ค์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์กฐ์ธ ํฌ์ธํธ๋ก ์ ์ฉํฉ๋๋ค.
- @within : ํด๋น ํ์ ๋ด์ ์๋ ๋ฉ์๋๋ง ์กฐ์ธ ํฌ์ธํธ๋ก ์ ์ฉํฉ๋๋ค.
์ฆ @target์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๊น์ง ์ด๋๋ฐ์ด์ค๋ฅผ ๋ค ์ ์ฉํ๊ณ , @within์ ์๊ธฐ ์์ ์ ํด๋์ค์ ์ ์๋ ๋ฉ์๋์๋ง ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํฉ๋๋ค.
์์ ์ฝ๋
package hello.advanced.aop.member.anno
import kotlin.annotation.AnnotationRetention.RUNTIME
import kotlin.annotation.AnnotationTarget.*
@Target(CLASS)//ํด๋์ค์ ๋ถ์
@Retention(RUNTIME)
annotation class ClassAop()
ํด๋์ค์ ์ฌ์ฉํ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
package hello.advanced.aop.member.anno
import kotlin.annotation.AnnotationRetention.*
import kotlin.annotation.AnnotationTarget.*
@Target(FUNCTION)
@Retention(RUNTIME)
annotation class MethodAop(
val value: String
)
๋ฉ์๋์ ์ฌ์ฉํ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
package hello.advanced.pointcut
import hello.advanced.aop.member.anno.ClassAop
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.stereotype.Component
import java.lang.reflect.Method
@SpringBootTest
class AtTargetTest {
@Autowired
lateinit var child: Child
@Autowired
lateinit var grandChild: GrandChild
@Autowired
lateinit var parent: Parent
@Test
fun success() {
println("parent Proxy={${parent::class}}") //๋ชจ๋ ๋น๋ค์ ํ๋ก์๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ํ๋ก์์ด๋ค.
println("child Proxy={${child::class}}") //๋ชจ๋ ๋น๋ค์ ํ๋ก์๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ํ๋ก์์ด๋ค.
println("grandChild Proxy={${grandChild::class}}") //๋ชจ๋ ๋น๋ค์ ํ๋ก์๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ํ๋ก์์ด๋ค.
println()
child.inheritance()//์์๋ฐ์ ๋ฉ์๋
child.childMethod()//์์๋ง ๊ฐ์ง ๋ฉ์๋
child.parentMethod()//๋ถ๋ชจ๋ง ๊ฐ์ง ๋ฉ์๋
//๋ถ๋ชจ, ์์ ๋ชจ๋ ์๋ ๋ฉ์๋ child.parentMethod(); //๋ถ๋ชจ ํด๋์ค๋ง ์๋ ๋ฉ์๋
println()
println()
grandChild.inheritance()
grandChild.parentMethod()
grandChild.childMethod()
grandChild.grandChildMethod()
}
}
@Component
class Parent {
fun parentMethod() = println("parent method") //๋ถ๋ชจ์๋ง ์๋ ๋ฉ์๋
fun inheritance() = println("inheritance ๋ถ๋ชจ")
}
@ClassAop
@Component
class Child : Parent() {
override fun inheritance() = println("inheritance child")
fun childMethod() = println("child method")
}
@Component
class GrandChild : Child() {
override fun inheritance() = println("inheritance grandChild")
fun grandChildMethod() = println("grandChild method")
}
@Aspect
@Component
class AtTargetAtWithinAspect {
//@target: ์ธ์คํด์ค ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ๋ฉ์๋์ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ์ ์ , ๋ถ๋ชจ ํ์
์ ๋ฉ์๋๋ ์ ์ฉ
@Around("execution(* hello.advanced..*(..)) && @target(hello.advanced.aop.member.anno.ClassAop)")
fun atTarget(joinPoint: ProceedingJoinPoint): Any? {
println("[@target] {${joinPoint.signature}}")
return joinPoint.proceed();
}
}
์ฃผ์์ฌํญ - args, @args, @target
args, @args, @target
์ ์ธ ํฌ์ธํธ์ปท ์ง์์๋ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
execution๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์ ์ฉ ๋์์ ์ค์ฌ์ฃผ์ด์ผ ํฉ๋๋ค.
args, @args, @target๋ ์ค์ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ์คํ๋ ๋ ์ด๋๋ฐ์ด์ค ์ ์ฉ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์คํ ์์ ์ ์ผ์ด๋๋ ํฌ์ธํธ์ปท ์ฌ๋ถ๋ ๊ฒฐ๊ตญ์ ํ๋ก์๊ฐ ์์ด์ผ ํ๋จ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํ๋ก์๋ฅผ ์์ฑํ๋ ์์ ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๋ง๋ค์ด์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ args, @args, @target๊ฐ์ ํฌ์ธํธ์ปท ์ง์์๊ฐ ์์ผ๋ฉด, ์คํ๋ง์ ๋ชจ๋ ์คํ๋ง ๋น์ AOP๋ฅผ ์ ์ฉํ๋ ค ์๋ํฉ๋๋ค.
์์ ์ค๋ช ํ ๊ฒ ์ฒ๋ผ, ํ๋ก์๊ฐ ์์ผ๋ฉด ์คํ ์์ ์ ํ๋จ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ชจ๋ ์คํ๋ง ๋น์ AOP๋ฅผ ์ ์ฉํ๋ ค ํ๊ธฐ ๋๋ฌธ์, ์ ์ฉ ๋ฒ์๋ฅผ ์ค์ฌ์ฃผ์ง ์์ผ๋ฉด ์คํ๋ง์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ฑ๋กํ๋ ค๋ ๋น๋ค ์ค final๋ก ์ง์ ๋ ๋น๋ค์ด ๋ฑ๋ก๋ ๋ ํ๋ก์๋ฅผ ๋ง๋ค์ง ๋ชปํด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ args, @args, @target๋ ๋ค๋ฅธ ํฌ์ธํธ์ปท ํํ์๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
Reference
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-pointcuts
'๐๏ธ Spring > AOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (6) - @annotation (0) | 2022.08.02 |
---|---|
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (5) - @within (0) | 2022.08.02 |
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (3) - args (0) | 2022.08.02 |
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (2) - within (0) | 2022.08.02 |
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (1) - execution (0) | 2022.08.02 |