AOP์ ๋ํด ์์๋ณด์
Spring์ ๊ณต๋ถํ๋ค ๋ณด๋ฉด @Transactional์ด๋ ๊ณตํต ๋ก๊ทธ ์ฒ๋ฆฌ์ฒ๋ผ, ๋น์ทํ ๊ธฐ๋ฅ์ด ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฑ์ฅํ๋ ๊ฑธ ๋ณด๊ฒ ๋๋ค.
์ฒ์์๋ ๊ทธ๋ฅ ํ์ํ ๊ณณ๋ง๋ค ๋ฃ์ผ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ?๋ผ๊ณ ์๊ฐํ๋๋ฐ, ์ ๋ฆฌํด๋ณด๋ ์ด๋ฐ ๊ณตํต ๊ธฐ๋ฅ์ ํต์ฌ ๋ก์ง๊ณผ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด ๋ฐ๋ก AOP์๋ค.
์๋ฅผ ๋ค์ด API ์คํ ์๊ฐ์ ์ธก์ ํ๋ค๊ณ ํ๋ฉด, ์ปจํธ๋กค๋ฌ๋ ์๋น์ค ๋ฉ์๋๋ง๋ค ์์ ์๊ฐ๊ณผ ์ข ๋ฃ ์๊ฐ์ ์ง์ ๋ฃ์ ์๋ ์๋ค. ํ์ง๋ง ์ด๋ฐ ์ฝ๋๊ฐ ์ฌ๊ธฐ์ ๊ธฐ ๋ฐ๋ณต๋๊ธฐ ์์ํ๋ฉด ํต์ฌ ๋ก์ง๋ณด๋ค ๋ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ๋ ๋์ ๋๊ฒ ๋๋ค.
์ด๋ด ๋ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ํ์ํ ์ง์ ์ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด AOP๋ค.
AOP๋ Aspect Oriented Programming์ ์ค์๋ง๋ก, ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๊ณตํต ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ฌ๊ธฐ์ ํต์ฌ ๊ธฐ๋ฅ์ ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ด๊ณ , ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ก๊น , ์คํ ์๊ฐ ์ธก์ , ํธ๋์ญ์ , ์์ธ ์ฒ๋ฆฌ์ฒ๋ผ ์ฌ๋ฌ ๊ณณ์์ ๊ณตํต์ผ๋ก ํ์ํ ๊ธฐ๋ฅ์ด๋ค.
์ฆ, AOP๋ฅผ ์ ์ฉํ๋ฉด ๋ฉ์๋๋ง๋ค ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๋ณตํด์ ์์ฑํ์ง ์๊ณ , ๊ณตํต ๊ธฐ๋ฅ์ ํ ๊ณณ์ ๋ชจ์๋๊ณ ํ์ํ ์ง์ ์ ๋ผ์ ๋ฃ์ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ์์ฑ, ํ์ ์กฐํ, ์ํ ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๊ฐ ๋ค๋ฅธ ํต์ฌ ๋ก์ง์ด์ง๋ง, ์คํ ์๊ฐ ์ธก์ ์ด๋ ๊ณตํต ๋ก๊ทธ ๊ธฐ๋ก์ ์ฌ๋ฌ ๊ณณ์์ ๋น์ทํ๊ฒ ํ์ํ ์ ์๋ค.
์ด๋ฐ ๋ถ๋ถ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด AOP์ ํต์ฌ์ด๋ค.
AOP๋ฅผ ์ฒ์ ๋ณด๋ฉด Aspect, Advice, Pointcut ๊ฐ์ ์ฉ์ด๊ฐ ํ๊บผ๋ฒ์ ๋์์ ํท๊ฐ๋ฆด ์ ์๋ค. ๋๋ ์ฒ์์๋ ์ด๋ฆ์ด ๋น์ทํด์ ์ด๋ ต๊ฒ ๋๊ปด์ก๋๋ฐ, ์ญํ ๋ก ๋๋ ์ ๋ณด๋ฉด ์๊ฐ๋ณด๋ค ๋จ์ํ๋ค.
Aspect = ๊ณตํต ๊ธฐ๋ฅ ๋ฌถ์
Advice = ์ธ์ ์คํํ ์ง
Pointcut = ์ด๋์ ์ ์ฉํ ์ง
@Aspect๋ ํด๋น ํด๋์ค๊ฐ AOP ์ค์ ํด๋์ค๋ผ๋ ๊ฑธ ๋ํ๋ด๋ ์ด๋
ธํ
์ด์
์ด๋ค.
์ฆ, ์ด ํด๋์ค ์์์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ธ์ , ์ด๋์ ์ ์ฉํ ์ง ์ ์ํ๊ฒ ๋ค๊ณ ์คํ๋ง์๊ฒ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
AOP๋ฅผ ์ ์ฉํ๋ ค๋ฉด ๋ณดํต ์ด ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค ์์ Advice์ Pointcut์ ์์ฑํ๊ฒ ๋๋ค.
Advice๋ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ธ์ ์คํํ ์ง ์ ํ๋ ๊ฒ์ด๋ค.
@Before
ํต์ฌ ๊ธฐ๋ฅ์ด ์คํ๋๊ธฐ ์ ์ ๋์ํ๋ค.
์์ฒญ๊ฐ ๊ฒ์ฆ์ด๋ ์คํ ์ ๋ก๊ทธ ๊ธฐ๋ก์ฒ๋ผ, ๋ฉ์๋๊ฐ ์์๋๊ธฐ ์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์์
์ ์ฌ์ฉํ๋ค.
@After
ํต์ฌ ๊ธฐ๋ฅ์ ์ฑ๊ณต ์ฌ๋ถ์ ์๊ด์์ด ํญ์ ์คํ๋๋ค.
์๋ฐ์ finally์ฒ๋ผ ๋์ํ๋ค๊ณ ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ฌ์ ๋ค.
@AfterReturning
๋ฉ์๋๊ฐ ์ ์์ ์ผ๋ก ๋๋ฌ์ ๋๋ง ์คํ๋๋ค.
๋ฐํ๊ฐ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฑ๊ณตํ ๊ฒฐ๊ณผ๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธธ ๋ ํ์ฉํ ์ ์๋ค.
@AfterThrowing
๋ฉ์๋ ์คํ ์ค ์์ธ๊ฐ ๋ฐ์ํ์ ๋๋ง ๋์ํ๋ค.
๊ณตํต ์์ธ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฑฐ๋ ์๋ฆผ์ ๋ณด๋ผ ๋ ์ฌ์ฉํ ์ ์๋ค.
@Around
ํต์ฌ ๊ธฐ๋ฅ ์คํ ์ ๊ณผ ํ๋ฅผ ๋ชจ๋ ๊ฐ์ ์ ์๋ Advice๋ค.
์ง์ ์ค์ ๋ฉ์๋ ์คํ ์์ ์ ์ ์ดํ ์ ์์ด์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค๊ณ ๋๊ผ๋ค.
์คํ ์๊ฐ ์ธก์ ๊ฐ์ ๊ธฐ๋ฅ๋ ๋ณดํต @Around๋ก ๊ตฌํํ๋ค.
Pointcut์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ด๋์ ์ ์ฉํ ์ง ์ ํ๋ ์กฐ๊ฑด์ด๋ค.
Advice๊ฐ โ์ธ์ โ๋ผ๋ฉด Pointcut์ โ์ด๋์โ์ ํด๋นํ๋ค.
Spring AOP์์๋ ์ฃผ๋ก execution() ํํ์์ ์ฌ์ฉํด์ ๋ฉ์๋ ์คํ ์ง์ ์ ๊ธฐ์ค์ผ๋ก ๋์์ ์ง์ ํ๋ค.
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
๊ตฌ์ฑ์์
public, private, *void, String, *com.sparta.myselectshop.controller.*com.sparta.myselectshop.controller..*addFolders() - addFolders ๋ฉ์๋๋ง ์ ์ฉadd*(..) - add๋ก ์์ํ๋ ๋ชจ๋ ๋ฉ์๋ ์ ์ฉ์ฒ์์๋ ๋ฌธ๋ฒ์ด ๊ธธ์ด์ ์ด๋ ต๊ฒ ๋๊ปด์ก๋๋ฐ,
๊ฒฐ๊ตญ์ โ์ด๋ ํจํค์ง์ ์ด๋ค ๋ฉ์๋์ ์ ์ฉํ ๊ฑด์งโ๋ฅผ ์กฐ๊ฑด์ผ๋ก ์ ๋ ๊ฑฐ๋ผ๊ณ ์ดํดํ๋ ํจ์ฌ ๋จ์ํด์ก๋ค.
๋ @Pointcut์ ์ฌ์ฉํ๋ฉด ์ด ํํ์์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ฌ๋ฌ Advice์์ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ์ค๋ณต์ ์ค์ด๊ณ ๊ฐ๋
์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋๋ค.
Spring AOP๋ ํ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
ํ๋ก์๋ ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ ํด์ ์์์ ๋์ํ๋ ๋๋ฆฌ ๊ฐ์ฒด๋ค.
์คํ๋ง์ AOP ์ ์ฉ ๋์ Bean์ ๊ทธ๋๋ก ์ฃผ์ ํ๋ ๊ฒ์ด ์๋๋ผ, ์ค์ ๊ฐ์ฒด ์์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํ๋ ๋๊ณ ๊ทธ ํ๋ก์๋ฅผ ์ฃผ์ ํ๋ค.
๊ทธ๋์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๋จผ์ ํ๋ก์๊ฐ ํธ์ถ์ ๊ฐ๋ก์ฑ๊ณ , Advice๋ฅผ ์คํํ ๋ค ์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
ํ๋ฆ์ผ๋ก ๋ณด๋ฉด ์ด๋ ๊ฒ ์ดํดํ ์ ์๋ค.
์ ์ฉ ์
DispatcherServlet โ Controller
์ ์ฉ ํ
DispatcherServlet โ AOP Proxy โ Advice โ Controller
ํต์ฌ ๋ก์ง์ ๊ทธ๋๋ก ๋๊ณ , ํ๋ก์๊ฐ ์์์ ๊ณตํต ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ตฌ์กฐ๋ค.
AOP๋ฅผ ๊ณต๋ถํ๋ฉด์ ๊ฐ์ฅ ํฌ๊ฒ ๋๋ ์ ์, ๊ณตํต ๊ธฐ๋ฅ์ ์ฌ๋ฌ ํด๋์ค์ ์ง์ ๋ฃ๊ธฐ ์์ํ๋ฉด ์ฝ๋๊ฐ ๊ธ๋ฐฉ ์ง์ ๋ถํด์ง๋ค๋ ๊ฒ์ด์๋ค.
์๋ฅผ ๋ค์ด ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ๋ฉ์๋ ์ด๋ฆ์ด๋ ํ๋ผ๋ฏธํฐ, ์คํ ์ฌ๋ถ ๊ฐ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ์ปจํธ๋กค๋ฌ๋ ์๋น์ค๋ง๋ค ์ง์ log.info()๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
์ค์ ๋ก๋ ์ด ๋ฐฉ์๋ง์ผ๋ก๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๋ค.
ํ์ง๋ง ์ด๊ฑธ ์ฌ๋ฌ ํด๋์ค์ ๋ฉ์๋์ ๋ฐ๋ณตํด์ ๋ฃ๊ธฐ ์์ํ๋ฉด ํต์ฌ ๋ก์ง์ด ์ ๋ณด์ด์ง ์๊ณ , ์ค๋ณต ์ฝ๋๊ฐ ๋ง์์ง๊ณ , ๋์ค์ ๋ก๊ทธ ํ์์ด๋ ์ถ๋ ฅ ์์น๋ฅผ ๋ฐ๊ฟ์ผ ํ ๋ ์์ ๋ฒ์๋ ์ปค์ง๊ฒ ๋๋ค.
๋ฐ๋ฉด AOP๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ๊ธฐ๋ฅ ๊ฐ์ ๊ณตํต ์์ ์ ํ ๊ณณ์ ๋ชจ์์ ๊ด๋ฆฌํ ์ ์๋ค.
ํต์ฌ ๊ธฐ๋ฅ์ ํต์ฌ ๊ธฐ๋ฅ๋๋ก ๋๊ณ , ๋ถ๊ฐ ๊ธฐ๋ฅ์ ํ์ํ ์ง์ ์๋ง ๊ณตํต ์ ์ฉํ ์ ์๋ค.
๊ทธ๋์ AOP๋ ๋จ์ํ ๋ฌธ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฐ๋ ์ด ์๋๋ผ, ์ค๋ณต์ ์ค์ด๊ณ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ผ๋ ์ ์ด ๋ ์ค์ํ๊ฒ ๋๊ปด์ก๋ค.
์ฒ์์๋ AOP๋ฅผ ์ด๋
ธํ
์ด์
๋ช ๊ฐ ๋ถ์ด๋ ๊ธฐ๋ฅ ์ ๋๋ก ์๊ฐํ๋๋ฐ,
์ ๋ฆฌํด๋ณด๋ ํต์ฌ์ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ํต์ฌ ๋ก์ง์์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด์๋ค.
ํนํ ํ๋ก์๊ฐ ๋ฉ์๋ ํธ์ถ์ ๊ฐ๋ก์ฑ์ Advice๋ฅผ ์คํํ ๋ค ์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค๋ ํ๋ฆ์ ์ดํดํ๊ณ ๋๋, ์ @Transactional ๊ฐ์ ๊ธฐ๋ฅ๋ AOP๋ก ๋์ํ๋์ง ์กฐ๊ธ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์๋ค์ผ ์ ์์๋ค.
+ @Transactional๋ AOP ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
์คํ๋ง์ ํธ๋์ญ์
์ด ํ์ํ ๋ฉ์๋์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ,
๋ฉ์๋ ํธ์ถ์ ๊ฐ๋ก์ฑ์ ์คํ ์ ์๋ ํธ๋์ญ์
์ ์์ํ๊ณ ,
์ ์ ์ข
๋ฃ ์ commit, ์์ธ ๋ฐ์ ์ rollback์ ์ํํ๋ค.
์ค๋ ์ ๋ฆฌํ๋ฉด์ ๋๋ ๊ฑด, AOP๋ ๋จ์ํ ๊ฐ๋ ๋ง ์ธ์ฐ๋ ๊ฒ๋ณด๋ค โ์ด๋ค ๊ณตํต ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ ค๊ณ ๋ฑ์ฅํ๋๊ฐโ๋ฅผ ๊ฐ์ด ์ดํดํด์ผ ํจ์ฌ ์ ๋ค์ด์จ๋ค๋ ์ ์ด์๋ค.
๋ค์์๋ ์ง์ API ์คํ ์๊ฐ ์ธก์ ์ด๋ ๋ก๊น ์ AOP๋ก ๊ตฌํํด๋ณด๋ฉด์ ๋ ์ต์ํด์ ธ๋ด์ผ๊ฒ ๋ค.