๐Ÿ๏ธ Spring/AOP

ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž (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: tar..
ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž (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: tar..
ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž (Pointcut Designators) ์Šคํ”„๋ง์—์„œ๋Š” ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ AspectJ ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž(PCD)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. execution: ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง AOP์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ฐธ๊ณ  - (https://ttl-blog.tistory.com/870) within: ํŠน์ •ํ•œ ํƒ€์ž… ๋‚ด์˜ ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ฉด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. this: ์Šคํ”„๋ง ๋นˆ ๊ฐ์ฒด(์Šคํ”„๋ง AOP ํ”„๋ก์‹œ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ฐธ๊ณ  - (https://ttl-blog.tistory.com/878) target: target ๊ฐ์ฒด(์Šคํ”„๋ง AOP ํ”„๋ก์‹œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ค์ œ ๋Œ€์ƒ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์กฐ์ธ ..
ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž (Pointcut Designators) ์Šคํ”„๋ง์—์„œ๋Š” ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ AspectJ ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž(PCD)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. execution: ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง AOP์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. within: ํŠน์ •ํ•œ ํƒ€์ž… ๋‚ด์˜ ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ฉด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ฐธ๊ณ  - (https://ttl-blog.tistory.com/871) this: ์Šคํ”„๋ง ๋นˆ ๊ฐ์ฒด(์Šคํ”„๋ง AOP ํ”„๋ก์‹œ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ฐธ๊ณ  - (https://ttl-blog.tistory.com/878) target: target ๊ฐ์ฒด(์Šคํ”„๋ง AOP ํ”„๋ก์‹œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ค์ œ ๋Œ€์ƒ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์กฐ์ธ ..
์ด๋ฒˆ์—๋Š” @Aspect๋ฅผ ํ†ตํ•ด AOP๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์• ์„œ๋Š” ์—ฌ๋Ÿฌ ํ™œ์šฉ ์˜ˆ์‹œ์™€ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ„์˜ ์ˆœ์„œ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ์–ด๋“œ๋ฐ”์ด์Šค์˜ ์ข…๋ฅ˜์™€ ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์€ ๋‹ค์Œ ๊ธ€์— ์ด์–ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํฌ์ธํŠธ์ปท๊ณผ ์–ด๋“œ๋ฐ”์ด์Šค ๋™์‹œ ์ž‘์„ฑ @Aspect class AspectV1 { val log = logger() @Around("execution(* hello.advanced..*(..))") private fun doLog(joinPoint: ProceedingJoinPoint): Any? { log.info("{}", joinPoint.signature) return joinPoint.proceed() } } ํฌ์ธํŠธ์ปท์˜ ๋ถ„๋ฆฌ - @Pointcut @Aspect clas..
@Aspect ์ด์ „ ๊ธ€(https://ttl-blog.tistory.com/864)์—์„œ Advisor๋งŒ ๋“ฑ๋กํ•˜๋ฉด ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•ด ์ค€๋‹ค๊ณ  ํ•˜์˜€์Šต๋‹ˆ๋‹ค. @Aspect๋Š” Advisor๋ฅผ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. joinPoint.proceed()๋Š” target(์‹ค์ œ ๋Œ€์ƒ)์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹ค์ œ๋กœ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. JoinPoint๋Š” target๊ณผ ์‹คํ–‰๋  ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ์•ผ๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” @Component๋ฅผ ํ†ตํ•ด ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ ์›๋ฆฌ ์ž๋™ ํ”„๋ก์‹œ ์ƒ์„ฑ๊ธฐ(AnnotationAwareAspectJAutoProxyCreator..
๋นˆ ํ›„์ฒ˜๋ฆฌ๊ธฐ ๋นˆ์ด ์ƒ์„ฑ๋œ ์ดํ›„ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜, ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋Š” ๋“ฑ ๋นˆ ํ›„์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋ง‰๊ฐ•ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ํ›„์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด BeanPostProcessor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋“ฑ๋กํ•œ ํ›„, ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. postProcessBeforeInitialization ๊ฐ์ฒด ์ƒ์„ฑ ์ดํ›„, @PostConstruct ๊ฐ™์€ ์ดˆ๊ธฐํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. postProcessAfterInitialization ๊ฐ์ฒด ์ƒ์„ฑ ์ดํ›„, @PostConstruct ๊ฐ™์€ ์ดˆ๊ธฐํ™”๊ฐ€ ๋ฐœ์ƒํ•œ ์ดํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ class BasicTest { @Test fun ap() { val ac = AnnotationConfigApplicationCon..
ํฌ์ธํŠธ์ปท (Pointcut) ์–ด๋””์— ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ ์šฉํ• ์ง€ ๋ง์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ํ•„ํ„ฐ๋ง ๋กœ์ง์ž…๋‹ˆ๋‹ค. ํฌ์ธํŠธ์ปท์€ ClassFilter์™€ MathodMatcher๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ClassFilter๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง์„ ๋‹ด๋‹นํ•˜๋ฉฐ, MathodMatcher๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์–ด๋“œ๋ฐ”์ด์Šค (Advice) ํ”„๋ก์‹œ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์–ด๋“œ๋ฐ”์ด์ € (Advisor) ํ•˜๋‚˜์˜ ํฌ์ธํŠธ์ปท๊ณผ ํ•˜๋‚˜์˜ ์–ด๋“œ๋ฐ”์ด์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ์™ธ์šฐ๊ธฐ ์ถฉ๊ณ ํ•˜๋Š” ์‚ฌ๋žŒ(Advisor)์€ ๋ˆ„๊ตฌ(Pointcut)์—๊ฒŒ ์–ด๋–ค ์ถฉ๊ณ (Advice)๋ฅผ ํ•ด์•ผ ํ• ์ง€ ์•Œ๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋“œ๋ฐ”์ด์Šค ๋งŒ๋“ค๊ธฐ ๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€(https://ttl-blog.tistory.com/862)์—์„œ ๋งŒ๋“  ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. class Tim..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/AOP' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)