[Spring] Spring Advisor์™€ Pointcut - ์‹ค์ „ํŽธ

๋ฐ˜์‘ํ˜•

์ด์ „ ๊ธ€์—์„œ DefaultPointcutAdvisor์™€ ๋‹ค์–‘ํ•œ Pointcut๋“ค์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ๋‹ค๋ค„๋ดค์Šต๋‹ˆ๋‹ค.

 

2022.10.10 - [Programming/Spring] - [Spring] Spring Advisor์™€ Pointcut - ๊ฐœ๋…ํŽธ

 

[Spring] Spring Advisor์™€ Pointcut - ๊ฐœ๋…ํŽธ

Spring AOP ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด Advice๋ฅผ ๋งŒ๋“ค์–ด ๋ฉ”์„œ๋“œ์˜ ์ „ํ›„์ฒ˜๋ฆฌ๋ฅผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. 2022.05.16 - [Programming/Spring] - [Spring] Spring Advice๋กœ ์ปค์Šคํ…€ ์–ด๋“œ๋ฐ”์ด์Šค ๋งŒ๋“ค๊ธฐ [Spring] Spr..

blog.neonkid.xyz

Pointcut์€ ์ธํ„ฐํŽ˜์ด์Šค ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ์ง€๋งŒ Spring AOP์—์„œ ์ด๋ฏธ ๋งŽ์€ ๊ตฌํ˜„์ฒด๋“ค์ด ๋งŒ๋“ค์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€๋Ÿฌ ์šฐ๋ฆฌ๊ฐ€ ์ปค์Šคํ…€ ํฌ์ธํŠธ์ปท์„ ๊ฐœ๋ฐœํ•˜์—ฌ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค๊ณ  ์ด์•ผ๊ธฐ ํ–ˆ์—ˆ์ฃ .

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด ๊ตฌํ˜„๋œ 8๊ฐœ์˜ ํฌ์ธํŠธ์ปท์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

StaticMethodMatcherPointcut

๋จผ์ € ํŽธ์˜ ํด๋ž˜์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ถ”์ƒ StaticMethodMatcherPointcut ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์ •์  ํฌ์ธํŠธ์ปท์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด๋ด…๋‹ˆ๋‹ค.

 

 

 

StaticMethodMatcherPointcut ํด๋ž˜์Šค๋Š” MethodMatcher ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ธ StaticMethodMatcher ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋ฏ€๋กœ matches ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋‚˜๋จธ์ง€ Pointcut ๊ตฌํ˜„์ฒด๋Š” ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ StaticMethodMatcherPointcut์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€๋งŒ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

  • getClassFilter์— ์›ํ•˜๋Š” ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ •์˜
  • matches์— ์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ •์˜

matches๋Š” ํ•„์ˆ˜์ง€๋งŒ getClassFilter๋Š” ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ๋ฐ, ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ชจ๋“  ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ํŠน์ • ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋งŒ ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด getClassFilter์— ์›ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ DefaultPointcutAdvisor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ํด๋ž˜์Šค์˜ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  JavaProgrammer ํด๋ž˜์Šค์˜ programming() ๋ฉ”์„œ๋“œ์—๋งŒ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

matches ๋ฉ”์„œ๋“œ์—์„œ methd.getName()์„ ์ด์šฉํ•ด ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ programming์œผ๋กœ ์ •์˜ํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—๋งŒ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€๋กœ getClassFilter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ํด๋ž˜์Šค์—์„œ๋งŒ ์ž‘๋™ํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ด์ œ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. SimpleAdvice๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , MethodInterceptor๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

MethodInvocation ์ธ์ž์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ Pointcut์— ์ •์˜ํ–ˆ๋˜ Method ์ด๋ฆ„์ด ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. return true ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋“  Pointcut์„ ๋™์ž‘ํ•˜๋„๋ก ํ–ˆ๋‹ค๋ฉด ๊ทธ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

programming ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— println์„ ํ•˜๊ณ , ํ˜ธ์ถœํ•˜๊ณ  ๋‚œ ๋’ค, Done์„ println ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

์ด์ œ SimpleAdvice์™€ SimpleStaticPointcut ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์‹ค์ œ Pointcut์„ ์–ด๋–ป๊ฒŒ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘ DefaultPointcutAdvisor ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ ๊ตฌ์ƒ ํด๋ž˜์Šค(conctete class)๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด SimpleAdvice๋Š” JavaProgrammer ํด๋ž˜์Šค์˜ programming() ๋ฉ”์„œ๋“œ์— ์˜ํ•ด์„œ๋งŒ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด Pointcut์œผ๋กœ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

DynamicMethodMatcherPointcut

๋™์  ํฌ์ธํŠธ์ปท๋„ ์ •์  ํฌ์ธํŠธ์ปท๊ณผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

 

์œ„ ์˜ˆ์ œ๋Š” ๋™์  ํฌ์ธํŠธ์ปท์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋Ÿฐ ์ธ์ž๋„ ๋ฐ›์ง€ ์•Š๋Š” bar ๋ฉ”์„œ๋“œ์™€ int ์ •์ˆ˜ ์ˆซ์ž ํ•œ ๊ฐœ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” foo ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

StaticPointcut๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ foo() ๋ฉ”์„œ๋“œ์—๋งŒ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•˜๋Š”๋ฐ, ์ด์ „์— ์‚ฌ์šฉํ•œ Programmer ์ธํ„ฐํŽ˜์ด์Šค์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ „๋‹ฌ๋œ int ์ธ์ˆ˜๊ฐ€ 100์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์ด ๋ฉ”์„œ๋“œ์— ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š” ๋™์  ํฌ์ธํŠธ์ปท์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํŽธ๋ฆฌํ•œ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์ธ DynamicMethodMatcherPointcut์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ํด๋ž˜์Šค๋Š” MethodMatcher ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„์ฒด๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์•„๋ž˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

boolean matches(Method method, Class<?> targetClass, Object... args);

๋˜ํ•œ, ์ •์  ๊ฒ€์‚ฌ์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

boolean matches(Method method, Class<?> targetClass);

์ž˜๋ณด๋ฉด ๋™์  ๊ฒ€์‚ฌ์ธ ์ „์ž matches๋งŒ ๊ตฌํ˜„ํ•ด๋„ ๋˜์ง€๋งŒ ์ •์  ๊ฒ€์‚ฌ์ธ ํ›„์ž์˜ matches๊นŒ์ง€๋ฅผ ๊ตฌํ˜„ํ•œ ์ด์œ ๋Š” ์ •์  ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ํ†ตํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ธ๋ฐ์š”.

 

์Šคํ”„๋ง์€ ์ •์  ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๋™์  ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ์—์„œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋™์  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊นŒ์ง€ ๋ชจ๋‘ ๋™์  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์ •์  ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋จผ์ € ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋” ์ด์ƒ ๋™์  ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ ์ธ ์ด์ ์ด ์ƒ๊น๋‹ˆ๋‹ค.

 

๊ฒŒ๋‹ค๊ฐ€ ์ •์  ๊ฒ€์‚ฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ์บ์‹ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฉ”์„œ๋“œ์˜ ์ •์  ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ •์  ๊ฒ€์‚ฌ ๋˜ํ•œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ตœ์ ํ™”๋œ ํฌ์ธํŠธ์ปท์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ฆฌํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  • ๋™์  ํฌ์ธํŠธ์ปท์˜ ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์ •.
  • ๋™์  ๊ฒ€์‚ฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™•์‹คํ•˜๊ฒŒ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์“ธ ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„
  • getClassFilter๋ฅผ ์ด์šฉํ•ด ํด๋ž˜์Šค ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰

 

์‹ค์ œ๋กœ ๋™์  ํฌ์ธํŠธ์ปท์ด ๋™์ž‘ํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  1. getClassFilter ๋ฉ”์„œ๋“œ์—์„œ ํด๋ž˜์Šค ๊ฒ€์‚ฌ ์ˆ˜ํ–‰.
  2. ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” matches ๋ฉ”์„œ๋“œ (์ •์  ๊ฒ€์‚ฌ) ์ˆ˜ํ–‰
  3. ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š” matches ๋ฉ”์„œ๋“œ (๋™์  ๊ฒ€์‚ฌ) ์ˆ˜ํ–‰

 

์ด๋ ‡๊ฒŒ ํ•ด๋‘๋ฉด ํฌ์ธํŠธ์ปท์„ ์ดํ•ดํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๋ฉฐ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํฌ์ธํŠธ์ปท์„ ์ง์ ‘ ์‹คํ–‰ํ•ด๋ณด๋ฉฐ ์œ„ ์ˆ˜ํ–‰ ๊ณผ์ •์„ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

์–ด๋“œ๋ฐ”์ด์Šค๋Š” ์ •์  ํฌ์ธํŠธ์ปท์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ SimpleAdvice๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‹ค์‹œํ”ผ ์ฒ˜์Œ ๋‘ ๋ฒˆ์˜ foo() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—๋งŒ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋˜์—ˆ์œผ๋ฉฐ ์ฒ˜์Œ์—๋Š” ๋จผ์ € ์ •์  ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋˜ ๊ธฐ๋ณธ์ ์ธ Object ๋ฉ”์„œ๋“œ๋“ค๊นŒ์ง€ ์ „๋ถ€...)

 

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•ด์•ผํ•  ์ ์€ foo() ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„, ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋˜๋Š” ๋‹จ๊ณ„์—์„œ ๋‘ ๋ฒˆ์˜ ์ •์  ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ๋™์  ํฌ์ธํŠธ์ปท์€ ์ •์  ํฌ์ธํŠธ์ปท๋ณด๋‹ค ๋” ํฐ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ผญ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋™์  ํฌ์ธํŠธ์ปท์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•ฉ์‹œ๋‹ค.

 

 

 

NameMatchMethodPointcut

์ข…์ข… ํฌ์ธํŠธ์ปท์„ ๋งŒ๋“ค ๋•Œ ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์˜ ์ƒ๊ด€์—†์ด ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋Š” StaticMethodMatcherPointcut์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์ด์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ธ NameMatchMethodPointcut์„ ์‚ฌ์šฉํ•ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ชฉ๋ก๊ณผ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋งค์นญํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค๋งŒ ์ด ํฌ์ธํŠธ์ปท์€ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— programming()๊ณผ programming(1.4) ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‘˜ ๋‹ค programming์ด๋ผ๋Š” ์ด๋ฆ„๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค.

 

 

 

์ •์  ํฌ์ธํŠธ์ปท์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ JavaProgrammer ์˜ˆ์ œ ์ฝ”๋“œ์— programming() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜์—ฌ ํŠน์ • IDE๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด ์˜ˆ์ œ์—์„œ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ NameMatchMethodPointcut์„ ์ด์šฉํ•ด programming(), programming(IDE), test() ๋ฉ”์„œ๋“œ์— ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ํฌ์ธํŠธ์ปท์€ programming๊ณผ test ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ๋งŒ ๋งค์นญ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 

IDE๋Š” ์—ด๊ฑฐ์ฒด๋กœ ํ‘œ๊ธฐํ•˜์—ฌ Eclipse๋ถ€ํ„ฐ Vim๊นŒ์ง€ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

NameMatchMethodPointcut์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  addMethodName ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋งค์นญํ•  ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ํฌ์ธํŠธ์ปท์— ์ถ”๊ฐ€ํ•œ programming, test ๋‘ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ด ๋•Œ ์ธ์ž๋กœ ๋„ฃ์€ IDE ๊นŒ์ง€๋„ ๊ฐ™์ด ํฌํ•จ๋˜์–ด ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

 

 

RegexpMethodPointcut

๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ •ํ™•ํžˆ ํŠน์ •ํ•  ์ˆ˜ ์—†์„ ๋•Œ๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์ •ํ•œ ํŒจํ„ด์˜ ์ด๋ฆ„์—์„œ๋งŒ ์ „ํ›„์ฒ˜๋ฆฌ(์–ด๋“œ๋ฐ”์ด์Šค)๋ฅผ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ •๊ทœ ํ‘œํ˜„์‹ ํฌ์ธํŠธ์ปท์ธ JdkRegexMethodPointcut์„ ์‚ฌ์šฉํ•ด ์ •๊ทœ ํ‘œํ˜„์‹ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋งค์นญ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•๊ณผ ๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ค„ ์•„๋Š” PythonProgrammer ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” test ๋ฉ”์„œ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  programming ๋ฉ”์„œ๋“œ์—์„œ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉ ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

์ •๊ทœ ํ‘œํ˜„์‹ ๊ธฐ๋ฒ•์œผ๋กœ ํฌ์ธํŠธ์ปท์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค์—์„œ ์ด๋ฆ„์ด programming์ด๋ผ๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์„ค๋ น ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„)

 

์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋งค์นญํ•˜๋Š” ํฌ์ธํŠธ์ปท์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ setPattern ๋“ฑ์˜ ํŒจํ„ด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์žฌ๋ฏธ์žˆ๋Š” ๊ฒƒ์€ ํŒจํ„ด์ธ๋ฐ, ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋งค์นญํ•  ๋•Œ ์Šคํ”„๋ง์€ ํŒจํ‚ค์ง€์™€ ํด๋ž˜์Šค ์ด๋ฆ„์ด ํฌํ•จ๋œ ์ „์ฒด ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด xyz.neonkid.programmers.PythonProgrammer ๋ผ๋ฉด ์Šคํ”„๋ง์€ xyz.neonkid.programmers.PythonProgrammer.programming๊ณผ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ •๊ทœํ‘œํ˜„์‹ ์•ž์— .*์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด (?i)๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋ชจ๋‘ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ ์ฃผ์–ด์ง„ ํŒจํ‚ค์ง€ ๋‚ด์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋งค์นญํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด test() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ์™ธํ•œ programming()๊ณผ asyncProgramming() ๋ฉ”์„œ๋“œ์—๋งŒ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

AspectJexpPointcut

JDK ์ •๊ทœ ํ‘œํ˜„์‹ ์™ธ์—๋„ AspectJ์˜ ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹ ์–ธ์–ด๋ฅผ ์ด์šฉํ•ด ํฌ์ธํŠธ์ปท์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์Šคํ”„๋ง ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์ด ์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์Šคํ”„๋ง์—์„œ๋Š” @AspectJ ์• ๋„ˆํ…Œ์ด์…˜ ๋ฐฉ์‹์˜ AOP ์ง€์› ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

@AspectJ ์• ๋„ˆํ…Œ์ด์…˜ ๋ฐฉ์‹ AOP ์ง€์› ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ๋•Œ๋Š” AspectJ์˜ ํฌ์ธํŠธ์ปท ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ‘œํ˜„์‹ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ํฌ์ธํŠธ์ปท์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” AspectJ ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

Spring์—์„œ AspectJ ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ classpath์— ๋‘ ๊ฐœ์˜ AspectJ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์ธ aspectjrt.jar์™€ aspectjweaver.jar๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Spring boot์˜ spring-boot-starter-aop๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋ฅผ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์ด ๋ฐ”๋กœ AspectJexpPointcut์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

RegexMethodPointcut๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ›„ setExpression ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํŒจํ„ด์„ ์„ค์ •ํ•œ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ JDK ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ syntax๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— AspectJ expression์„ ์ž˜ ๋ชจ๋ฅด๋Š” ๋ถ„์ด๋ผ๋ฉด ์ด๋ฅผ ๋จผ์ € ์ตํ˜€๋ณด๊ณ  ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฑธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

AnnotationMatchingPointcut

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์• ๋„ˆํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์ผ ๋•Œ๋Š” ํฌ์ธํŠธ์ปท์„ ์ •์˜ํ•  ๋•Œ ํŠน์ • ์ปค์Šคํ…€ ์• ๋„ˆํ…Œ์ด์…˜์„ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•ด ํฌ์ธํŠธ์ปท์„ ์ •์˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ • ์• ๋„ˆํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋‚˜ ํƒ€์ž…์— ์–ด๋“œ๋ฐ”์ด์Šค ๋กœ์ง์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์€ ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ํฌ์ธํŠธ์ปท์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” AnnotationMatchingPointcut ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

 

@interface ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ ์„ ์–ธํ•˜๊ณ  @Target ์• ๋„ˆํ…Œ์ด์…˜์€ ์• ๋„ˆํ…Œ์ด์…˜์„ ํƒ€์ž… ๋ ˆ๋ฒจ๊ณผ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. 

 

์œ„์—์„œ ๊ตฌํ˜„ํ•œ JavaProgrammer ํด๋ž˜์Šค์—์„œ programming(IDE ide)์— ์กฐ๊ธˆ ์ „์— ๋งŒ๋“  ์• ๋„ˆํ…Œ์ด์…˜์„ ์ ์šฉํ•ด๋ด…๋‹ˆ๋‹ค.

 

forMethodAnnotation ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์• ๋„ˆํ…Œ์ด์…˜ ํƒ€์ž…์„ ์ „๋‹ฌํ•ด AnnotationMatchingPointcut ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ง€์ •ํ•œ ์• ๋„ˆํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

forClassAnnotation ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ํƒ€์ž… ๋ ˆ๋ฒจ์— ์ง€์ •ํ•œ ์• ๋„ˆํ…Œ์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ์ „์—” ๋ฉ”์„œ๋“œ ์œ„์— @AdviceRequired๋ฅผ ํ–ˆ์ง€๋งŒ ํด๋ž˜์Šค ์œ„์— @AdviceRequired ํ•œ ๊ฒฝ์šฐ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

@AdviceRequired๋ฅผ ์ ์€ programming(IDE ide)์—๋งŒ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

๋งˆ์น˜๋ฉฐ...

์—ฌ๊ธฐ๊นŒ์ง€ Pointcut์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. 

 

์Šคํ”„๋ง์—์„œ๋Š” ๋งŽ์€ Pointcut ๊ตฌํ˜„์ฒด์— ๋Œ€ํ•ด ํฌ์ธํŠธ์ปท ์—ญํ• ์„ ํ•˜๋Š” ํŽธ๋ฆฌํ•œ Advisor ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DefaultPointcutAdvisor์™€ ํ•จ๊ป˜ NameMatchMethodPointcut์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  NameMatchMethodPointcutAdvisor๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

NameMatchMethodPointcut ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  NameMatchMethodPointcutAdvisor ์ธ์Šคํ„ด์Šค์—์„œ ํฌ์ธํŠธ์ปท ์ƒ์„ธ ์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ NameMatchMethodPointcutAdvisor๋Š” Advisor์ด์ž ํฌ์ธํŠธ์ปท ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ์‹์— ๋Œ€ํ•œ ํฐ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ์—†์œผ๋ฉฐ ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๊ฐ€ ๋” ์งง๋‹ค๋Š” ๊ฒƒ์— ์˜์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ๊ณผ์ •์„ ๋ณด๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์‹์ด ์ข‹์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ ์„ฑํ–ฅ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

๋‹ค์–‘ํ•œ Advisor ๊ตฌํ˜„์ฒด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์•„๋ž˜์˜ ๋งํฌ์ธ org.springframework.aop.support ํŒจํ‚ค์ง€์˜ JavaDoc์„ ๋ณด๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/support/package-summary.html

 

org.springframework.aop.support (Spring Framework 5.3.23 API)

Package org.springframework.aop.support Description Convenience classes for using Spring's AOP API.

docs.spring.io

 

 

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments