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

๋ฐ˜์‘ํ˜•

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

 

2022.05.16 - [Programming/Spring] - [Spring] Spring Advice๋กœ ์ปค์Šคํ…€ ์–ด๋“œ๋ฐ”์ด์Šค ๋งŒ๋“ค๊ธฐ

 

[Spring] Spring Advice๋กœ ์ปค์Šคํ…€ ์–ด๋“œ๋ฐ”์ด์Šค ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ ํฌ์ŠคํŠธ๋ถ€ํ„ฐ๋Š” Spring AOP ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ Advice๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ , ์œ„๋น™ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Advice Interface Advice์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋ณต์Šตํ•ด๋ณด์ž๋ฉด Advice๋Š” ํŠน์ • ์กฐ์ธํฌ์ธํŠธ ์ฆ‰, ๋ฉ”์„œ๋“œ๊ฐ€

blog.neonkid.xyz

Spring AOP์˜ ProxyFactory ํด๋ž˜์Šค๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ๋ฉ”์„œ๋“œ์—์„œ AOP ํ”„๋ก์‹œ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ–ˆ๋Š”๋ฐ์š”. 

 

์ด ์›๋ฆฌ๋ฅผ ๋ณด์ž๋ฉด addAdvice ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ addAdvisor ๋ฉ”์„œ๋“œ์— ์ž‘์—…์„ ์œ„์ž„ํ•˜์—ฌ DefaultPointcutAdvisor ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํŠธ์ปท์œผ๋กœ ์–ด๋“œ๋ฐ”์ด์ €๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ƒ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, AOP๋ฅผ ๋กœ๊น… ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ดœ์ฐฎ๊ฒ ์ง€๋งŒ ๋•Œ๋กœ๋Š” ํŠน์ • ๋ฉ”์„œ๋“œ์—์„œ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋ฉ”์„œ๋“œ์˜ ์ˆœ์ฐจ์  ๊ฒ€์‚ฌ

๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋“œ๋ฐ”์ด์Šค ๋™์ž‘์„ ์ œ์™ธํ•ด์•ผ ํ• ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ ๋ชฉ๋ก์„ ์–ด๋“œ๋ฐ”์ด์Šค์— ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ, ์–ด๋“œ๋ฐ”์ด์Šค์˜ ์žฌ์‚ฌ์šฉ์„ฑ ๊ฐ์†Œ
  • ์–ด๋“œ๋ฐ”์ด์Šค ๋‚ด ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋˜๋Š”์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ O(n) [์—ฌ๊ธฐ์„œ n์€ ๋ฉ”์„œ๋“œ ๊ฐฏ์ˆ˜]์˜ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ด์Šˆ ๋ฐœ์ƒ

 

1๋ฒˆ์งธ ๋‹จ์ ์€ ๋‹จ์ˆœํžˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์ธ ์ด์Šˆ์ธ๋ฐ, ๋งŒ์•ฝ ํ•˜๋“œ ์ฝ”๋”ฉ์„ ํ†ตํ•ด ์ ์šฉ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ ๋ชฉ๋ก์„ ๋„ฃ๋Š” ๊ฒฝ์šฐ ์–ด๋“œ๋ฐ”์ด์Šค ๋งˆ๋‹ค ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค์ƒ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์“ฐ๊ธฐ ๋ณด๋‹ค๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ๋„ฃ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—‡์Šต๋‹ˆ๋‹ค.

 

2๋ฒˆ์งธ ๋‹จ์ ์€ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋•Œ๋งˆ๋‹ค ์ด ๋ฉ”์„œ๋“œ์— ๋‚ด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์—†์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ผ์ผ์ด ๋ฉ”์„œ๋“œ ๊ฐฏ์ˆ˜๋งŒํผ ์ˆœํšŒํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋งŒํผ ์„ฑ๋Šฅ ๊ฐ์†Œ๋Ÿ‰์ด ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹ฌํžˆ ์šฐ๋ คํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

 

 

 

ํฌ์ธํŠธ์ปท(Pointcut)

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

 

๋˜ํ•œ ํฌ์ธํŠธ์ปท์€ ๊ฐ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ์•ˆํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ํ•œ ๋ฒˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋’ค ์ด๋ฅผ ์บ์‹ฑํ•œ ๋’ค ๋‚˜์ค‘์— ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ด์Šˆ๋„ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋Œ€์ƒ ๋‚ด์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ์— ์–ด๋“œ๋ฐ”์ด์Šค ์ ์šฉ์„ ์ œ์–ดํ•  ๋•Œ์—๋Š” ๋ฌด์กฐ๊ฑด ํฌ์ธํŠธ์ปท(Pointcut)์„ ์“ฐ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ๊ฐ€์š”?

 

๊ฐ€๊ธ‰์ ์ด๋ฉด ๊ทธ๋ž˜์•ผ๊ฒ ์ง€๋งŒ ๋ฌด์กฐ๊ฑด์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ ์ด์ „ ๊ธ€์—์„œ ๋‹ค๋ค˜๋˜ KeyGenerator์ฒ˜๋Ÿผ ์–ด๋“œ๋ฐ”์ด์Šค์™€ ๋Œ€์ƒ ํด๋ž˜์Šค๊ฐ€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ๊ฐ•๊ฒฐํ•ฉํ•œ ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ํ•˜๋“œ ์ฝ”๋”ฉ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฒ”์šฉ์ ์œผ๋กœ ์จ์•ผํ•˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์ธ ๊ฒฝ์šฐ๋Š” ๊ทธ ๋Œ€์ƒ์ด ๋ชจํ˜ธํ•˜์—ฌ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๊ธฐ์—๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ๋งŽ์ด ์ƒ๊ธฐ๊ฒ ์ง€๋งŒ ๊ทธ ๋Œ€์ƒ์ด ๋ช…ํ™•ํ•œ ๊ฒƒ์€ ๋ฐ˜๋Œ€๋กœ ํ•˜๋“œ ์ฝ”๋”ฉ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์–ด๋“œ๋ฐ”์ด์Šค์™€ ๋Œ€์ƒ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋Œ€์ƒ ์นœ๋ฐ€๋„(Target affinity)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋“œ๋ฐ”์ด์Šค์— ๋Œ€ํ•œ ์นœ๋ฐ€๋„๊ฐ€ ๊ฑฐ์˜ ์—†๊ฑฐ๋‚˜ ์ „ํ˜€ ์—†๋‹ค๋ฉด ํฌ์ธํŠธ์ปท์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ํฌ์ธํŠธ์ปท ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Spring์—์„œ ํฌ์ธํŠธ์ปท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ Pointcut ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

Spring AOP ํŒจํ‚ค์ง€์— ์žˆ๋Š” Pointcut ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋ฉด ClassFilter์™€ MethodMacher์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ๊ฐ ๋ณ€ํ™˜ํ•˜๋Š” getter ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

 

Pointcut ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” getClassFilter ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” Pointcut์„ ํŠน์ • ๋ฉ”์„œ๋“œ์— ์ ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ๋กœ Spring์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Pointcut ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฉ”์„œ๋“œ์˜ ํด๋ž˜์Šค์— ์ ์šฉ๋˜๋Š”์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

ClassFilter ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” matches ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๊ฒ€์‚ฌํ•  ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Class ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ, matches๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํฌ์ธํŠธ์ปท์ด ํ•ด๋‹น ํด๋ž˜์Šค์— ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

ClassFilter ๋ฐ‘์œผ๋กœ MethodMatcher๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Spring์—์„œ๋Š” 2๊ฐ€์ง€ MethodMatcher๋ฅผ ์ง€์›ํ•˜๋ฉฐ isRuntime ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ์ •์  MethodMatcher๋ฅผ ์“ธ์ง€ ๋™์  MethodMatcher๋ฅผ ์“ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 

  • isRuntime() ๋ฉ”์„œ๋“œ๋กœ runtime์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ
  • ์œ„ ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’์— ๋”ฐ๋ผ MethodMatcher์˜ ์ข…๋ฅ˜๋ฅผ ๊ฒฐ์ •

 

์ •์  ํฌ์ธํŠธ์ปท์ผ ๋•Œ ์Šคํ”„๋ง์€ ๋Œ€์ƒ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ MethodMatcher์˜ matches ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐ˜ํ™˜๊ฐ’์„ ์บ์‹ฑํ•˜์—ฌ ๋‚˜์ค‘์— ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (๊ฐ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ํ•œ ๋ฒˆ๋งŒ ์ด ๋กœ์ง์„ ์ ์šฉํ•˜๋ฉฐ ๋‚˜์ค‘์—๋Š” ์บ์‹œ๋œ ๊ฐ’์„ ์ด์šฉ)

 

๋™์  ํฌ์ธํŠธ์ปท์ผ ๋•Œ ์Šคํ”„๋ง์€ ๋ฉ”์„œ๋“œ์˜ ์ „๋ฐ˜์ ์ธ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ์ฒ˜์Œ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ matches ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ์— ์ •์  ๊ฒ€์‚ฌ๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์Šคํ”„๋ง์€ matches ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€๋กœ ์ •์  ๊ฒ€์‚ฌ๋ฅผ ๋” ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

  • ๋ฉ”์„œ๋“œ ์ฒซ ํ˜ธ์ถœ์‹œ matches๋กœ ์ •์  ๊ฒ€์‚ฌ ์ˆ˜ํ–‰
  • ๋งŒ์•ฝ ์ •์  ๊ฒ€์‚ฌ์‹œ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋งˆ๋‹ค ์ •์  ๊ฒ€์‚ฌ ์ˆ˜ํ–‰
  • ์ •์  ๊ฒ€์‚ฌ๊ฐ€ false๋กœ ๋‚˜ํƒ€๋‚œ ๊ฒฝ์šฐ ์ด ๋ฉ”์„œ๋“œ๋Š” ํฌ์ธํŠธ์ปท์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฒ€์‚ฌ ์ค‘๋‹จ

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

 

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์ˆ˜๊ฐ€ 100๋ณด๋‹ค ํฐ Integer์ผ ๋•Œ๋งŒ ํฌ์ธํŠธ์ปท์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ์˜ ๋ชจ์–‘, ํ˜•ํƒœ๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ์˜ ํŠน์ • ํ–‰๋™์œผ๋กœ ๋ณด๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋™์  MethodMatcher๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋™์  MethodMatcher๋Š” ๊ทธ๋งŒํผ ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ •์  MethodMatcher๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์  ํฌ์ธํŠธ์ปท์€ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ ์ƒ๋‹นํ•œ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ ์ด ๋ถ€๋ถ„์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋ก  ์ •์  MethodMatcher๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. 

 

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

 

 

 

Spring์˜ Pointcut ๊ตฌํ˜„์ฒด

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

 

Spring 4.x ๋ฒ„์ „์—์„œ๋Š” 8๊ฐœ์˜ ํฌ์ธํŠธ์ปท ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 2๊ฐœ์˜ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ •์  ๋˜๋Š” ๋™์  ํฌ์ธํŠธ์ปท์„ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์˜ ํด๋ž˜์Šค(convenience class)์ด๊ณ , ๋‚˜๋จธ์ง€ 6๊ฐœ์˜ ํด๋ž˜์Šค๋Š” ๊ฐ๊ธฐ ๊ฐœ๋ณ„์ ์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ƒ ํด๋ž˜์Šค(concrete class)์ž…๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ 2๊ฐœ์˜ ํŽธ์˜ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ํŒจํ‚ค์ง€๋ช…์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

  • StaticMethodMatcherPointcut
    (org.springframework.aop.support)

  • DynamicMethodMatcherPointcut
    (org.springframework.aop.support)

์ •์  ํฌ์ธํŠธ์ปท์„ ์ƒ์„ฑํ•˜๋Š” StaticMethodMatcherPointcut๊ณผ ๋™์  ํฌ์ธํŠธ์ปท์„ ์ƒ์„ฑํ•˜๋Š” DynamicMethodMatcherPointcut์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • AnnotationMatchingPointcut
    (org.springframework.aop.support.annotation)

    ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์—์„œ ํŠน์ • Java annotation์„ ์ฐพ๋Š” ํฌ์ธํŠธ์ปท ๊ตฌํ˜„์ฒด

  • AspectJExpressionPointcut
    (org.springframework.aop.aspectj)

    AspectJ ์œ„๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด AspectJ ๊ตฌ๋ฌธ์œผ๋กœ ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•˜๋Š” ํฌ์ธํŠธ์ปท ๊ตฌํ˜„์ฒด

  • ComposablePointcut
    (org.springframework.aop.support)

    ๋‘˜ ์ด์ƒ์˜ ํฌ์ธํŠธ์ปท์„ union()๊ณผ intersaction() ๊ฐ™์€ ์ž‘์—…์„ ํ†ตํ•ด ํ•˜๋‚˜๋กœ ๊ตฌ์„ฑ

  • ControlFlowPointcut
    (org.springframework.aop.support)

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

  • JdkRegexpMethodPointcut
    (org.springframework.aop.support)

    JDK 1.4 ์ •๊ทœ์‹์œผ๋กœ ํฌ์ธํŠธ์ปท์„ ์ •์˜ํ•˜๋Š” ํฌ์ธํŠธ์ปท

  • NameMatchMethodPointcut
    (org.springframework.aop.support)

    ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ชฉ๋ก์— ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜๋Š”์ง€ ๊ฐ„๋‹จํžˆ ํ™•์ธํ•˜๋Š” ํฌ์ธํŠธ์ปท

 

 

DefaultPointcutAdvisor

Pointcut ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Advisor ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋‚˜ ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ PointcutAdvisor ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๊ธ€์—์„œ ๋‹ค๋ค˜๋‹ค์‹œํ”ผ Advisor๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์™€ ํฌ์ธํŠธ์ปท์˜ ๊ฒฐํ•ฉ์— ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋  ๋ฉ”์„œ๋“œ์™€ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•  ๋ฐฉ์‹์„ ์ง€์ •ํ•˜๋Š” ์Šคํ”„๋ง์˜ aspect์ž…๋‹ˆ๋‹ค. 

 

Spring AOP์—์„œ aspect๋Š” Advisor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ Advisor๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

  • PointcutAdvisor
  • IntroductionAdvisor

 

ํฌ์ธํŠธ์ปท์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ธํฌ์ธํŠธ์— ์ ์šฉํ•  ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ชจ๋“  Advisor ๊ตฌํ˜„์ฒด๋Š” Pointcut Advisor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„ Spring์€ Introduction์„ ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ ์–ด๋“œ๋ฐ”์ด์Šค๋กœ ์ทจ๊ธ‰ํ•˜๋ฏ€๋กœ IntroductionAdvisor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด Introduction์ด ์ ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š” ์—ฌ๋Ÿฌ PointcutAdvisor ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์ด ๊ธ€์—์„œ๋Š” DefaultPointcutAdvisor๋งŒ์„ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. DefaultPointcutAdvisor๋Š” ํ•˜๋‚˜์˜ ํฌ์ธํŠธ์ปท์„ ํ•˜๋‚˜์˜ ์–ด๋“œ๋ฐ”์ด์Šค์™€ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฐ„๋‹จํ•œ PointcutAdvisor์ž…๋‹ˆ๋‹ค.

 

 

 

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

์–ด๋“œ๋ฐ”์ด์Šค์— ์ด์–ด ํฌ์ธํŠธ์ปท์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. Spring AOP๊ฐ€ ๊ฐ€์ง„ ๊ฐœ๋…์ด ์—„์ฒญ ๊นŠ๊ณ  ๋ณต์žกํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋Š๊ผˆ์„ํ…๋ฐ์š”.

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

 

 

 

์ฐธ๊ณ : Spring AOP APIs
(https://docs.spring.io/spring-framework/docs/2.0.x/reference/aop-api.html)

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments