ํฌ์ธํธ์ปท ์ง์์ (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: ์ธ์๊ฐ, ์ฃผ์ด์ง ํ์ ์ ์ธ์คํด์ค์ธ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- @target: ์คํ ๊ฐ์ฒด์ ํด๋์ค์, ์ฃผ์ด์ง ํ์
์ ์ ๋
ธํ
์ด์
์ด ์๋ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญํฉ๋๋ค.
- ๋ค์์ ์ฐธ๊ณ - (https://ttl-blog.tistory.com/873)
- @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)
args
์ธ์๊ฐ, ์ฃผ์ด์ง ํ์ ์ ์ธ์คํด์ค์ธ ์กฐ์ธ ํฌ์ธํธ์ ๋ํ์ฌ ๋งค์นญํฉ๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ execution์์ ์ธ์(args) ๋ถ๋ถ๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ execution๊ณผ ๋ค๋ฅด๊ฒ ๋ถ๋ชจ ํ์ ์ ํ์ฉํฉ๋๋ค.
์์ ์ฝ๋
package hello.advanced.aop.member
interface MemberService {
fun hello(param: String): String
}
package hello.advanced.aop.member
import org.springframework.stereotype.Component
@Component
class MemberServiceImpl : MemberService{
override fun hello(param: String): String {
return "ok"
}
fun internal(param: String): String {
return "ok"
}
}
class ArgsTest {
val pointcut = AspectJExpressionPointcut()
lateinit var helloMethod: Method
@BeforeEach
fun init() {
helloMethod = MemberServiceImpl::class.java.getMethod("hello", String::class.java)
}
@Test
@DisplayName("๋งค๊ฐ๋ณ์์ ๋ํ ํจํด ๋งค์น - ์ ํํ ํ์
๋งค์นญ")
fun argsTest() {
pointcut.expression = "args(String)"
assertThat(pointcut.matches(helloMethod, MemberServiceImpl::class.java)).isTrue
}
@Test
@DisplayName("๋งค๊ฐ๋ณ์์ ๋ํ ํจํด ๋งค์น - ๋ถ๋ชจ ํ์
๋งค์นญ")
fun argsTestV1() {
pointcut.expression = "args(Object)"
assertThat(pointcut.matches(helloMethod, MemberServiceImpl::class.java)).isTrue
}
@Test
@DisplayName("๋งค๊ฐ๋ณ์์ ๋ํ ํจํด ๋งค์น - ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ")
fun argsTestV2() {
pointcut.expression = "args()"
assertThat(pointcut.matches(helloMethod, MemberServiceImpl::class.java)).isFalse
}
@Test
@DisplayName("๋งค๊ฐ๋ณ์์ ๋ํ ํจํด ๋งค์น - ๋งค๊ฐ๋ณ์์ ์ข
๋ฅ์ ๊ฐ์๊ฐ ์๊ด ์๋ ๊ฒฝ์ฐ")
fun argsTestV3() {
pointcut.expression = "args(..)"
assertThat(pointcut.matches(helloMethod, MemberServiceImpl::class.java)).isTrue
}
@Test
@DisplayName("ํ์
์ ๋ํ ํจํด ๋งค์น - ์๋ฌด ํ์
์ ๋งค๊ฐ๋ณ์ 1๊ฐ๋ง ํ์ฉ")
fun argsTestV4() {
pointcut.expression = "args(*)"
assertThat(pointcut.matches(helloMethod, MemberServiceImpl::class.java)).isTrue
}
@Test
@DisplayName("ํ์
์ ๋ํ ํจํด ๋งค์น - ํน์ ํ์
์ผ๋ก ์์ํ์ฌ, ์ดํ ํ๋ผ๋ฏธํฐ๋ ์๊ด์๋ ๊ฒฝ์ฐ")
fun argsTestV5() {
pointcut.expression = "args(String, ..)"
assertThat(pointcut.matches(helloMethod, MemberServiceImpl::class.java)).isTrue
}
}
์ฃผ์์ฌํญ - 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 ํฌ์ธํธ์ปท ํํ์ (5) - @within (0) | 2022.08.02 |
---|---|
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (4) - @target (0) | 2022.08.02 |
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (2) - within (0) | 2022.08.02 |
[AOP] AOP ํฌ์ธํธ์ปท ํํ์ (1) - execution (0) | 2022.08.02 |
[AOP] ์คํ๋ง AOP ๊ตฌํ๋ฐฉ๋ฒ (0) | 2022.08.02 |