[Spring] Spring AOP(Aspect Oriented Programming)Web_Backend/Spring2023. 5. 28. 14:15
Table of Contents
Spring AOP(Aspect Oriented Programming)
Spring AOP๋?
๐ Aspect Oriented Programming, ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ด๋ค ๋ก์ง์ ๊ธฐ์ค์ผ๋ก ํต์ฌ์ ์ธ ๊ด์ , ๋ถ๊ฐ์ ์ธ ๊ด์ (๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ, ๋ก๊น , ํ์ผ ์ ์ถ๋ ฅ)์ผ๋ก ๋๋์ด์ ๋ณด๊ณ ๊ทธ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฐ ๋ชจ๋ํ ํ๊ฒ ๋ค๋ ๊ฒ
AOP ์ฃผ์ ๊ฐ๋
- Aspect : ์์์ ์ค๋ช ํ ํฉ์ด์ง ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํ ํ ๊ฒ. ์ฃผ๋ก ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ชจ๋ํํจ.
- Target : Aspect๋ฅผ ์ ์ฉํ๋ ๊ณณ (ํด๋์ค, ๋ฉ์๋ .. )
- Advice : ์ค์ง์ ์ผ๋ก ์ด๋ค ์ผ์ ํด์ผํ ์ง์ ๋ํ ๊ฒ, ์ค์ง์ ์ธ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ด์ ๊ตฌํ์ฒด
- JointPoint : Advice๊ฐ ์ ์ฉ๋ ์์น, ๋ผ์ด๋ค ์ ์๋ ์ง์ . ๋ฉ์๋ ์ง์ ์ง์ , ์์ฑ์ ํธ์ถ ์์ , ํ๋์์ ๊ฐ์ ๊บผ๋ด์ฌ ๋ ๋ฑ ๋ค์ํ ์์ ์ ์ ์ฉ๊ฐ๋ฅ
- PointCut : JointPoint์ ์์ธํ ์คํ์ ์ ์ํ ๊ฒ. 'A๋ ๋ฉ์๋์ ์ง์ ์์ ์ ํธ์ถํ ๊ฒ'๊ณผ ๊ฐ์ด ๋์ฑ ๊ตฌ์ฒด์ ์ผ๋ก Advice๊ฐ ์คํ๋ ์ง์ ์ ์ ํ ์ ์์
์คํ๋ง AOP ํน์ง
- ํ๋ก์ ํจํด ๊ธฐ๋ฐ์ AOP ๊ตฌํ์ฒด, ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฐ๋ ์ด์ ๋ ์ ๊ทผ ์ ์ด ๋ฐ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด์์
- ์คํ๋ง ๋น์๋ง AOP๋ฅผ ์ ์ฉ ๊ฐ๋ฅ
- ๋ชจ๋ AOP ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ์๋ ์คํ๋ง IoC์ ์ฐ๋ํ์ฌ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ํํ ๋ฌธ์ (์ค๋ณต์ฝ๋, ํ๋ก์ ํด๋์ค ์์ฑ์ ๋ฒ๊ฑฐ๋ก์, ๊ฐ์ฒด๋ค ๊ฐ ๊ด๊ณ ๋ณต์ก๋ ์ฆ๊ฐ ...)์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ง์ํ๋ ๊ฒ์ด ๋ชฉ์
Spring AOP์ ๊ตฌํ
- ์ปดํ์ผ ์์ (not Spring AOP, but AspectJ) : J.java → j.class ์ปดํ์ผ ์์ ์ aop๋ฅผ ๋ผ์๋์
- ํด๋์ค ๋ก๋์(not Spring AOP, but AspectJ) : j.class๋ฅผ ์ปดํ์ผ๋ก๋๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆด ๋ ๋ผ์ ๋ฃ์
- ํ๋ก์ ํจํด : ํ๊ฒ ํด๋์ค๋ฅผ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ก์๋ก ๊ฐ์ธ๋ ๋ฐฉ์
- ์ฆ, ์ผ๋ฐ์ ์ผ๋ก Spring AOP๋ runtime์์ proxy๊ฐ์ฒด๋ฅผ ์์ฑํด ๊ณตํต๊ธฐ๋ฅ์ ์ฝ์ ํ๋ ํ๋ก์ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ๋์
- ์คํ๋ง AOP๋ AspectJ๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ๋ฌธ๋ฒ์ ์ฐจ์ฉํ๊ณ ํ๋ก์๋ฐฉ๋ฒ์ AOP๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
- ํ์ผํด๋์ค์ className์ ์ฐ์ด๋ณด๋ฉด ํ๊ฒํด๋์ค๋ช $$EnhancerBySpringCGLIB$$์ฝ๋๋ก ์ฐํ๋ฉฐ, ๋๋ฒ๊น ํด๋ณด๋ฉด target์ ์๋์ ํ๊ฒ ํด๋์ค๊ฐ ๋ค์ด๊ฐ ์์์ ์ ์ ์์
- Spring์ AOP๊ฐ ๋ฑ๋ก๋์ด ์๋ ๊ฒฝ์ฐ runtime ์์ ์์ Bean์ด ์์ฑ๋๋ ์์ ์, Beanํ์ฒ๋ฆฌ๊ธฐ์ ์์ฑ๋ Bean์ด proxy๋์์ธ์ง ํ์ธ → ๋์์ผ ๊ฒฝ์ฐ bean ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑ → ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์๋ณธ ๊ฐ์ฒด DI ๋์ด์ผ ํ๋ ๊ณณ์ด DI์ํด
-
- JDK Dynamic proxy : ๋์ ๊ฐ์ฒด๊ฐ ์ ์ด๋ ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ ์ฌ์ฉ.
- CGLIB : ๋์ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉ. ๋ฐํ์์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํด ๋์ ์ผ๋ก ํ๋ก์ํด๋์ค๋ฅผ ์์ฑํด ์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, proxy ๊ฐ์ฒด๋ ์์์ ํ์ฉํด์ ๊ตฌํ๋ ํ๋ก์ ๋ฐฉ๋ฒ
Spring AOP์ ์ฌ์ฉ
- dependency์ spring-boot-starter-aop์ถ๊ฐ
- ์๋ ์คํ์์ ์ ๋ํ๋ด๋ ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ ํด๋น ํด๋์ค๊ฐ Aspect๋ฅผ ๋ํ๋ด๋ ํด๋์ค๋ผ๋ ๊ฒ์ ๋ช
์ํ๊ณ @Component๋ฅผ ๋ถ์ฌ Spring Bean์ผ๋ก ๋ฑ๋ก
- @Around ์ด๋ ธํ ์ด์ : ํ๋ฉง ๋ฉ์๋๋ฅผ ๊ฐ์ธ์ ํน์ Advice๋ฅผ ์คํํ๋ค๋ ์๋ฏธ
- @Before (์ด์ ) : ์ด๋๋ฐ์ด์ค ํ๊ฒ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํ
- @After (์ดํ) : ํ๊ฒ ๋ฉ์๋์ ๊ฒฐ๊ณผ์ ๊ด๊ณ์์ด(์ฆ ์ฑ๊ณต, ์์ธ ๊ด๊ณ์์ด) ํ๊ฒ ๋ฉ์๋๊ฐ ์๋ฃ ๋๋ฉด ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํ
- @AfterReturning (์ ์์ ๋ฐํ ์ดํ)ํ๊ฒ ๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํ ํ์ ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํ
- @AfterThrowing (์์ธ ๋ฐ์ ์ดํ) : ํ๊ฒ ๋ฉ์๋๊ฐ ์ํ ์ค ์์ธ๋ฅผ ๋์ง๊ฒ ๋๋ฉด ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํ
- @Around (๋ฉ์๋ ์คํ ์ ํ) : ์ด๋๋ฐ์ด์ค๊ฐ ํ๊ฒ ๋ฉ์๋๋ฅผ ๊ฐ์ธ์ ํ๊ฒ ๋ฉ์๋ ํธ์ถ์ ๊ณผ ํ์ ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํ
์ฐธ๊ณ ์๋ฃ
https://docs.spring.io/spring-framework/reference/core/aop.html
'Web_Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring boot Gradle ํ๋ก์ ํธ๋ Build์์ Test๋ฅผ ์คํํ ๊น?(Feat.. jacoco CI ์ ์ฉ์ผ์ง) (0) | 2023.12.26 |
---|---|
[Servlet] Dispatcher Servlet (0) | 2023.05.28 |
[Spring, JPA] JPA Persistence Context (0) | 2023.05.28 |
[JSTL] JSTL(JSP Standard Tag Library)๋? (0) | 2022.03.23 |
spring Mysql connector ์ฐ๊ฒฐํ๊ธฐ (0) | 2022.03.08 |
@Yanako :: Yana's coding story
์ผ๋์ ์ฝ๋ฉ ์ผ๊ธฐ์ฅ :) #์ฝ๋ฉ๋ธ๋ก๊ทธ #๊ธฐ์ ๋ธ๋ก๊ทธ #์ฝ๋ฉ #์กฐ๊ธ์ฉ,๊พธ์คํ
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!