๋น ํ์ฒ๋ฆฌ๊ธฐ
๋น์ด ์์ฑ๋ ์ดํ ๋ฌด์์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฒด๋ฅผ ์กฐ์ํ๊ฑฐ๋, ์์ ํ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ ์๋ ์๋ ๋ฑ ๋น ํ์ฒ๋ฆฌ๊ธฐ๋ ๋ง๊ฐํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋น ํ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด BeanPostProcessor ์ธํฐํ์ด์ค๋ฅผ ๋ฑ๋กํ ํ, ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ์ฌ์ผ ํฉ๋๋ค.
- postProcessBeforeInitialization
- ๊ฐ์ฒด ์์ฑ ์ดํ, @PostConstruct ๊ฐ์ ์ด๊ธฐํ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค.
- postProcessAfterInitialization
- ๊ฐ์ฒด ์์ฑ ์ดํ, @PostConstruct ๊ฐ์ ์ด๊ธฐํ๊ฐ ๋ฐ์ํ ์ดํ์ ํธ์ถ๋ฉ๋๋ค.
์์
class BasicTest {
@Test
fun ap() {
val ac = AnnotationConfigApplicationContext(BasicConfig::class.java)
val a = ac.getBean("beanA", B::class.java)//beanA ์ด๋ฆ์ผ๋ก B ๊ฐ์ฒด๊ฐ ๋ฑ๋ก
a.a()
println("๊ฒฐ๊ณผ : beanA์ ํ์
= ${a.javaClass}")
}
}
class BasicConfig {
@Bean(name = ["beanA"])
fun a(): A{
return A()
}
@Bean(name = ["aToBPostProcessor"])
fun aToBPostProcessor(): AToBPostProcessor{
return AToBPostProcessor()
}
}
class A {
fun a(){
println("AA")
}
}
class B {
fun a(){
println("BB")
}
}
class AToBPostProcessor : BeanPostProcessor {
override fun postProcessAfterInitialization(bean: Any, beanName: String): Any? {
println("๋น ์ด๋ฆ = ${beanName}, ๋น = ${bean}")
return if (bean is A) B() else bean
}
}
... ์ดํ ์งํ
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()
AbstractBeanFactory.getBean()
AbstractBeanFactory.doGetBean()
DefaultSingletonBeanRegistry.getSingleton()
AbstractBeanFactory.getObject()
์คํ๋ง์ด ์ ๊ณตํ๋ ๋น ํ์ฒ๋ฆฌ๊ธฐ
implementation("org.springframework.boot:spring-boot-starter-aop")
์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด aspectjweaver๋ผ๋ aspectJ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฑ๋กํ๊ณ , ์คํ๋ง ๋ถํธ๊ฐ ์ด์ ๊ด๋ จ๋ ํด๋์ค๋ฅผ ์๋์ผ๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํด์ค๋๋ค.
์๋ ํ๋ก์ ์์ฑ๊ธฐ - AnnotationAwareAspectJAutoProxyCreator
์คํ๋ง ๋ถํธ ์๋ ์ค์ ์ผ๋ก AnnotationAwareAspectJAutoProxyCreator๋ผ๋ ๋น ํ์ฒ๋ฆฌ๊ธฐ๊ฐ ์๋์ผ๋ก ์คํ๋ง ๋น์ ๋ฑ๋ก๋ฉ๋๋ค.
AnnotationAwareAspectJAutoProxyCreator๋
์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ Advisor(์ด๋๋ฐ์ด์ )๋ค์ ์๋์ผ๋ก ์ฐพ์์
ํ๋ก์๊ฐ ํ์ํ ๊ณณ์ ์๋์ผ๋ก ํ๋ก์๋ฅผ ์ ์ฉํด์ค๋๋ค.
์๋ ๊ณผ์
- ์คํ๋ง์ด ์คํ๋ง ๋น ๋์์ด ๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋น ์ ์ฅ์์ ๋ฑ๋กํ๊ธฐ ์ง์ ์ ๋น ํ์ฒ๋ฆฌ๊ธฐ์ ์ ๋ฌํฉ๋๋ค.
- ์๋ ํ๋ก์ ์์ฑ๊ธฐ(๋น ํ์ฒ๋ฆฌ๊ธฐ)๋ ์คํ๋ง ์ปจํ
์ด๋์์ ๋ชจ๋ Advisor๋ฅผ ์กฐํํฉ๋๋ค.
- Advisor ๋น๋ค์ ํน๋ณํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ ๋จผ์ ์คํ๋ง ๋น์ ๋ฑ๋ก๋ฉ๋๋ค. ๋ฐ๋ผ์ ์กฐํ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
- Advisor์ Pointcut์ ํ์ฉํด ํ๋ก์ ์ ์ฉ ๋์์ ํ๋จํฉ๋๋ค.
- ๋จ ํ๋๋ผ๋ ๋งค์นญ๋๋ ๊ฒฝ์ฐ ํ๋ก์ ์ ์ฉ ๋์์ด ๋ฉ๋๋ค.
- ํ๋ก์ ์ ์ฉ ๋์์ธ ๊ฒฝ์ฐ ํ๋ก์๋ฅผ ์์ฑํ๊ณ ๋ฐํํฉ๋๋ค. ๋์์ด ์๋ ๊ฒฝ์ฐ ์๋ณธ ๊ฐ์ฒด ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
- ๋ฐํ๋ ๊ฐ์ฒด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค.
ํฌ์ธํธ์ปท์ ์ฉ๋
- ํ๋ก์ ์ ์ฉ ๋์ ํํฐ๋ง - ์์ฑ ๋จ๊ณ
- ์ค์ ์ด๋๋ฐ์ด์ค(๋ถ๊ฐ ๋ก์ง) ์คํ ์ฌ๋ถ ํ๋ณ - ์ฌ์ฉ ๋จ๊ณ
์ต์ ํ
ํ๋ก์๋ฅผ ๋ชจ๋ ๊ณณ์ ์์ฑํ๋ ๊ฒ์ ๋น์ฉ ๋ญ๋น์ ๋๋ค.
๋ฐ๋ผ์ ์๋ ํ๋ก์ ์์ฑ๊ธฐ(AnnotationAwareAspectJAutoProxyCreator)๋ ์ต์ ํ๋ฅผ ํ๋ฒ ์งํํด ์ค๋๋ค.
๋ชจ๋ ์คํ๋ง ๋น์ ํ๋ก์๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ, ํฌ์ธํธ์ปท์ ํตํด ํ๋ฒ ํํฐ๋งํ์ฌ ์ด๋๋ฐ์ด์ค๊ฐ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ณณ์๋ง ํ๋ก์๋ฅผ ์์ฑํฉ๋๋ค.
์ ๋ฆฌ
์๋ ํ๋ก์ ์์ฑ๊ธฐ(AnnotationAwareAspectJAutoProxyCreator) ๋๋ถ์,
๊ฐ๋ฐ์๋ Advisor๋ง ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค๋ฉด ํ๋ก์๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
'๐๏ธ Spring > AOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AOP] ์คํ๋ง AOP ๊ตฌํ๋ฐฉ๋ฒ (0) | 2022.08.02 |
---|---|
[AOP] @Aspect (0) | 2022.08.01 |
[AOP] ํฌ์ธํธ์ปท, ์ด๋๋ฐ์ด์ค, ์ด๋๋ฐ์ด์ (0) | 2022.08.01 |
[AOP] ํ๋ก์ ํฉํ ๋ฆฌ (0) | 2022.08.01 |
[Spring] AOP - ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ (0) | 2022.02.12 |