Spring AOP[3] @Aspect ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ AOP ๊ตฌํ˜„, Advice ์ •์˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์ข…๋ฅ˜, Aspect ํด๋ž˜์Šค ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ

2021. 11. 15. 15:52ใ†Spring

728x90

1. Spring AOP ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 

 

1๏ธโƒฃ XML ๊ธฐ๋ฐ˜์˜ POJO ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ AOP ๊ตฌํ˜„ 

: ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Advice ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ , XML ์„ค์ •ํŒŒ์ผ์— <aop:config> ์„ ์ด์šฉํ•ด์„œ Aspect๋ฅผ ์„ค์ •ํ•œ๋‹ค. (Advice์™€ Pointcut์„ ์„ค์ •ํ•จ.)

 

2๏ธโƒฃ @Aspect ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ AOP ๊ตฌํ˜„ โœ”

: @Aspect ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด์„œ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Aspect ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

Aspect ํด๋ž˜์Šค์—๋Š” Advice๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ Pointcut์„ ํฌํ•จํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  XML ์„ค์ •ํŒŒ์ผ์— <aop:aspectj-autoproxy/>์„ ์„ค์ •ํ•œ๋‹ค. 

 

 

2. Aspect ํด๋ž˜์Šค ์„ ์–ธ ๋ฐ ์„ค์ •ํ•˜๊ธฐ 

: Aspect ํด๋ž˜์Šค์—๋Š” 4๊ฐ€์ง€ ์œ ํ˜•(Before, AfterReturning, AfterThrowing, After)์˜ Advice์™€ PointCut ์„ ์„ค์ •ํ•˜์—ฌ ํƒ€๊ฒŸ ๊ฐ์ฒด์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ด๊ฐ’, ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. 

 

1๏ธโƒฃ @Aspect ์–ด๋…ธํ…Œ์ด์…˜ 

: Aspect ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ @Aspect ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. 

์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” XML ์„ค์ • ํŒŒ์ผ์— Advice ์™€ pointcut์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  XML์„ค์ •ํŒŒ์ผ์—๋Š” <aop:aspectj-autoproxy> ํƒœ๊ทธ๋ฅผ ์„ค์ •ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๋ฉด @Aspect ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ Bean์„ Aspect๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

2๏ธโƒฃ @Component ์–ด๋…ธํ…Œ์ด์…˜ 

Aspect ํด๋ž˜์Šค๋ฅผ Aspect๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Bean์œผ๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— @Component ์–ด๋…ธํ…Œ์ด์…˜๋„ ํ•จ๊ป˜ ์ •์˜ํ•ด์ค€๋‹ค!

 

 

3. Advice ์ •์˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ 

 

1๏ธโƒฃ @Before("pointcut")

: Target ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ์ „์— ํ˜ธ์ถœ๋˜๋Š” Advice 

joinpoint๋ฅผ ํ†ตํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

2๏ธโƒฃ @After("pointcut")

: Target ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ ์ข…๋ฃŒ๋์„ ๋•Œ์™€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ชจ๋‘ ํ˜ธ์ถœ๋˜๋Š” Advice 

ํ•˜์ง€๋งŒ ๋ฆฌํ„ด๊ฐ’์ด๋‚˜ ์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†๋‹ค!

 

3๏ธโƒฃ @Around("pointcut")

: Target ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ „์ฒด ๊ณผ์ • ๋ชจ๋‘ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Advice

 

4๏ธโƒฃ @AfterReturning(pointcut ="", returning ="") 

: Target ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰์„ ๋งˆ์นœ ํ›„์— ํ˜ธ์ถœ๋˜๋Š” Advice์ด๋‹ค.

๋ฆฌํ„ด๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ๋Š” returning ์†์„ฑ์— ๋ฆฌํ„ด๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค. 

 

5๏ธโƒฃ @AfterThrowing(pointcut ="", Throwing="")

: Target ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” Advice์ด๋‹ค. 

๋ฐœ์ƒ๋œ ์˜ˆ์™ธ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋Š” throwing ์†์„ฑ์— ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค.

 

 

4. Aspect ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ 

 

1๏ธโƒฃ @Before

-> @Before Advice๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰๋˜๋Š” Target๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 

-> myspring ํŒจํ‚ค์ง€๋‚˜ ํ•˜์œ„ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ๋ชจ๋“  public ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ด์ „์— ํ˜ธ์ถœ๋œ๋‹ค!

 

2๏ธโƒฃ @AfterReturning

-> @AfterReturning Advice๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰๋˜๋Š” Target๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 

-> myspring.user.service ํŒจํ‚ค์ง€ ํ•˜์œ„์— ์žˆ๋Š” ๋ชจ๋“  public ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ ์ข…๋ฃŒ๋œ ์ดํ›„์— ์ˆ˜ํ–‰๋œ๋‹ค.

-> ๋ฆฌํ„ด๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ๋Š” returning ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ๋ฆฌํ„ด๊ฐ’์„ ๋‹ด์„ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค. 

 

3๏ธโƒฃ @AfterThrowing 

-> @AfterThrowing Advice๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰๋˜๋Š” Target ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ช…๊ณผ ์˜ˆ์™ธ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” Advice์ด๋‹ค. 

-> ํด๋ž˜์Šค๋ช…์ด UserService ๋กœ ์‹œ์ž‘๋˜๋Š” ํด๋ž˜์Šค์— ์†ํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋œ๋‹ค. 

-> ๋ฐœ์ƒ๋œ ์˜ˆ์™ธ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋Š” throwing ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค. 

 

4๏ธโƒฃ @After 

-> @After Advice๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰๋˜๋Š” Target ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ช…์„ ์ถœ๋ ฅํ•˜๋Š” Advice์ด๋‹ค. 

-> ๋ฉ”์„œ๋“œ๋ช…์ด User๋กœ ๋๋‚˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์ด ์ •์ƒ ์ข…๋ฃŒ ๋˜์—ˆ์„ ๋•Œ์™€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ชจ๋‘ ํ˜ธ์ถœํ•œ๋‹ค.

-> ๋ฐ˜๋“œ์‹œ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ•ญ์ƒ ๋กœ๊ทธ๋กœ ๋‚จ๊ฒจ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฆฌํ„ด ๊ฐ’์ด๋‚˜ ์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†๋‹ค. 

 

 

5. Aspect ํด๋ž˜์Šค ํ…Œ์ŠคํŠธํ•˜๊ธฐ 

 

1๏ธโƒฃ 

-> ๊ฒฐ๊ณผ 

-> UserService์— getUser ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , UserDAO์— read ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— @Before์— ๋‘๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. 

-> ๊ทธ๋ฆฌ๊ณ  ์ •์ƒ ์ข…๋ฃŒ๋๊ธฐ ๋•Œ๋ฌธ์— AfterReturning ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋ฆฌํ„ด๊ฐ’์„ ๋‹ด์•˜๋˜ ret์ด ๋ฆฌํ„ด๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค. 

-> ์‹คํ–‰์‹œ๊ฐ„์€ ์ €๋ฒˆ์— AOP[2]์—์„œ XML๋กœ Aspect ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“  ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋œ ๊ฒƒ์ด๋‹ค.

 

2๏ธโƒฃ

์ด๋ฒˆ์—๋Š” ์ผ๋ถ€๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ AfterThrowing ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•ด๋ดค๋‹ค. 

AfterThrowing ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

3๏ธโƒฃ

์ด๋ฒˆ์—๋Š” ๋‘๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ ํ…Œ์ŠคํŠธ์ด๋‹ค. 

updateUser์™€ update ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„์— getUser ์™€ read ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค. 

updateUser์—๋Š” ๋ฆฌํ„ด๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— null์„ ์ถœ๋ ฅํ•˜์ง€๋งŒ 

getUser๋Š” ๋ฆฌํ„ด๊ฐ’์ด UserVo์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค. 

 

 

 

 

 

728x90