2021. 11. 15. 15:52ใSpring
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์ด๊ธฐ ๋๋ฌธ์ ๊ทธ์ ํด๋นํ๋ ๊ฐ์ ์ถ๋ ฅํ๋ค.