๊ฐ๋
AOP(Aspect Oriented Programming) ์ ์ฝ์๋ก ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ๊ด์ ์งํฅ์ ์ฝ๊ฒ ๋งํด ์ด๋ค ๋ก์ง์ ๊ธฐ์ค์ผ๋ก ํต์ฌ์ ์ธ ๊ด์ , ๋ถ๊ฐ์ ์ธ ๊ด์ ์ผ๋ก ๋๋์ด์ ๋ณด๊ณ ๊ทธ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฐ ๋ชจ๋ํํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ๋ชจ๋ํ๋ ์ด๋ค ๊ณตํต๋ ๋ก์ง์ด๋ ๊ธฐ๋ฅ์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ฒ์ ๋งํ๋ค.
๋ชจ๋ํ๋ฅผ ํตํด ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ค. ๋ถ๋ฆฌํ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ์คํํธ(Aspect)๋ผ๋ ๋ ํนํ ๋ชจ๋ ํํ๋ก ๋ง๋ค์ด์ ์ค๊ณํ๊ณ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ
ํต์ฌ๊ธฐ๋ฅ์์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํด์ Aspectํํ๋ก ๋ชจ๋ํํ๋ ๊ฒ
- ํต์ฌ๊ธฐ๋ฅ : ์ ๋ฌด ๋ก์ง์ ํฌํจํ๋ ๊ธฐ๋ฅ์ ํต์ฌ๊ธฐ๋ฅ(Core Concerns)
- ๋ถ๊ฐ๊ธฐ๋ฅ : ํต์ฌ๊ธฐ๋ฅ์ ๋์์ฃผ๋ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ(๋ก๊น , ๋ณด์ ๋ฑ)์ ๋ถ๊ฐ๊ธฐ๋ฅ(Cross-cutting Concerns)
- OOP๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋์จ ๊ฐ๋
.
- ๊ฐ์ฒด์งํฅ์ ๊ธฐ๋ณธ ์์น์ ์ ์ฉํด๋ ํต์ฌ๊ธฐ๋ฅ์์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํด์ ๋ชจ๋ํํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ
- ์ด๋ฅผ AOP๊ฐ ํด๊ฒฐ
- AOP๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ์คํฉํธ(Aspect)๋ก ์ ์ํ์ฌ, ํต์ฌ๊ธฐ๋ฅ์์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ํต์ฌ๊ธฐ๋ฅ์ ์ค๊ณํ๊ณ ๊ตฌํํ ๋ ๊ฐ์ฒด์งํฅ์ ์ธ ๊ฐ์น๋ฅผ ์งํฌ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ๋ ์ด๋ค. (์ค๋ณต ์ ๊ฑฐ)
- AOP๊ฐ๋ ์ ์ ์ฉํ๋ฉด ํต์ฌ๊ธฐ๋ฅ ์ฝ๋ ์ฌ์ด์ ์นจํฌ๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ ๋ฆฝ์ ์ธ ์ ์คํํธ๋ก ๊ตฌ๋ถํด ๋ผ ์ ์๋ค.
ํ์ฉ
- ๋ก๊น
- ํธ๋์ญ์
- ์์ธ ์ฒ๋ฆฌ
- ์ํคํ ์ฒ ๊ฒ์ฆ ๋ฑ
๋น์ฆ๋์ค๋จ์ ๋ฉ์๋์์ ์กฐ๊ธ ๋ ์ธ๋ฐํ๊ฒ ์กฐ์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
AOP์ Filter/Interceptor์ ์ฐจ์ด์
- Interceptor๋ Filter์๋ ๋ฌ๋ฆฌ ๋ฉ์๋ ์ ํ์ ์ง์ ์ ์์ ๋กญ๊ฒ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
- Interceptor์ Filter๋ ์ฃผ์๋ก ๋์์ ๊ตฌ๋ถํด์ ๊ฑธ๋ฌ๋ด์ผํ๋ ๋ฐ๋ฉด,
- AOP๋ ์ฃผ์, ํ๋ผ๋ฏธํฐ, ์ ๋ ธํ ์ด์ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋์์ ์ง์ ํ ์ ์๋ค.
- AOP์ Advice์ HandlerInterceptor์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ํ๋ผ๋ฏธํฐ์ ์ฐจ์ด๋ค.
- Advice์ ๊ฒฝ์ฐ JoinPoint๋ ProceedingJoinPoint ๋ฑ์ ํ์ฉํด์ ํธ์ถํ๋ค.
- ๋ฐ๋ฉด HandlerInterceptor๋ Filter์ ์ ์ฌํ๊ฒ HttpServletRequest, HttpServletResponse๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํ๋ค.
AOP ์ฉ์ด
- Aspect : AOP์ ๊ธฐ๋ณธ ๋ชจ๋
- ์์์ ์ค๋ช ํ ํฉ์ด์ง ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํ ํ ๊ฒ. ์ฃผ๋ก ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ชจ๋ํํจ.
- Advice + PointCut = Aspect
- ๋ถ๊ฐ๊ธฐ๋ฅ ์ ์ ์ฝ๋(Advice)์ ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ๋ ์์น(PointCut)์ ํฉ์น ๊ฐ๋
- ์ฑ๊ธํค ํํ์ ๊ฐ์ฒด๋ก ์กด์ฌ
- Target : ํต์ฌ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋๋ก, ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ์ฌํ ๋์
- Aspect๋ฅผ ์ ์ฉํ๋ ๊ณณ (ํด๋์ค, ๋ฉ์๋ .. )
- Advice : ํ๊ฒ(Target)์ ์ ๊ณตํ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋
- ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ์ํ ์ฝ๋. ์ค์ง์ ์ธ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ด์ ๊ตฌํ์ฒด
- Join Point : Advice๊ฐ ์ ์ฉ๋ ์ ์๋ ์์น
- ํ๊ฒ ๊ฐ์ฒด๊ฐ ๊ตฌํํ ์ธํฐํ์ด์ค์ ๋ชจ๋ ๋ฉ์๋๋ ์กฐ์ธ ํฌ์ธํธ๊ฐ ๋๋ค.
- Advice๊ฐ ์ ์ฉ๋ ์์น, ๋ผ์ด๋ค ์ ์๋ ์ง์ . ๋ฉ์๋ ์ง์ ์ง์ , ์์ฑ์ ํธ์ถ ์์ , ํ๋์์ ๊ฐ์ ๊บผ๋ด์ฌ ๋ ๋ฑ ๋ค์ํ ์์ ์ ์ ์ฉ๊ฐ๋ฅ
- PointCut : Advice๋ฅผ ์ ์ฉํ Target์ ๋ฉ์๋๋ฅผ ์ ๋ณํ๋ ์ ๊ทํํ์
- JointPoint์ ์์ธํ ์คํ์ ์ ์ํ ๊ฒ.
- ํฌ์ธํธ์ปท ํํ์์ execution์ผ๋ก ์์ํ๊ณ , ๋ฉ์๋์ Signature๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ด์ฉํ๋ค.
- Advice๋ฅผ ์ด๋์ ์ ์ฉํ ์ง ๊ฒฐ์ ํ๋ ๊ฐ๋
- 'A๋ ๋ฉ์๋์ ์ง์ ์์ ์ ํธ์ถํ ๊ฒ'๊ณผ ๊ฐ์ด ๋์ฑ ๊ตฌ์ฒด์ ์ผ๋ก Advice๊ฐ ์คํ๋ ์ง์ ์ ์ ํ ์ ์์
- Advisor : Spring AOP์์๋ง ์ฌ์ฉ๋๋ ํน๋ณํ ์ฉ์ด
- Aspect์ ๋์ผํ ๊ฐ๋
- Advice + PointCut = Advisor
- Weaving : ํฌ์ธํธ์ปท(PointCut)์ ์ํด์ ๊ฒฐ์ ๋ ํ๊ฒ(Target)์ ์กฐ์ธ ํฌ์ธํธ(Join Point)์ ๋ถ๊ฐ๊ธฐ๋ฅ(Advice)์ ์ฝ์
ํ๋ ๊ณผ์
- ์๋น์ AOP๊ฐ ํต์ฌ๊ธฐ๋ฅ(ํ๊ฒ)์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ํ์ํ ๋ถ๊ฐ๊ธฐ๋ฅ(Advice)์ ์ถ๊ฐํ ์ ์๋๋ก ํด์ฃผ๋ ํต์ฌ์ ์ธ ์ฒ๋ฆฌ ๊ณผ์
Spring AOP ํน์ง
- Spring์ ํ๋ก์(Proxy) ๊ธฐ๋ฐ AOP๋ฅผ ์ง์ํ๋ค.
- Spring์ ํ๊ฒ(target)๊ฐ์ฒด์ ๋ํ ํ๋ก์๋ฅผ ๋ง๋ค์ด ์ ๊ณตํ๋ค.
- ํ๊ฒ์ ๊ฐ์ธ๋ ํ๋ก์๋ ์คํ์๊ฐ(Runtime)์ ์์ฑ๋๋ค.
- ํ๋ก์๋ ์ด๋๋ฐ์ด์ค๋ฅผ ํ๊ฒ ๊ฐ์ฒด์ ์ ์ฉํ๋ฉด์ ์์ฑ๋๋ ๊ฐ์ฒด์ด๋ค.
- ํ๋ก์๊ฐ ํธ์ถ์ ๊ฐ๋ก์ฑ๋ค(Intercept)
- ํ๋ก์๋ ํ๊ฒ ๊ฐ์ฒด์ ๋ํ ํธ์ถ์ ๊ฐ๋ก์ฑ ๋ค์ ์ด๋๋ฐ์ด์ค์ ๋ถ๊ฐ๊ธฐ๋ฅ ๋ก์ง์ ์ํํ๊ณ ๋ ํ์ ํ๊ฒ์ ํต์ฌ๊ธฐ๋ฅ ๋ก์ง์ ํธ์ถํ๋ค. (์ ์ฒ๋ฆฌ ์ด๋๋ฐ์ด์ค)
- ๋๋ ํ๊ฒ์ ํต์ฌ ๊ธฐ๋ฅ ๋ก์ง ๋ฉ์๋๋ฅผ ํธ์ถํ ํ์ ๋ถ๊ฐ๊ธฐ๋ฅ(์ด๋๋ฐ์ด์ค)์ ์ํํ๋ ๊ฒฝ์ฐ๋ ์๋ค. (ํ์ฒ๋ฆฌ ์ด๋๋ฐ์ด์ค)
- Spring AOP๋ ๋ฉ์๋ ์กฐ์ธ ํฌ์ธํธ๋ง ์ง์ํ๋ค.
- Spring์ ๋์ ํ๋ก์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก AOP๋ฅผ ๊ตฌํํ๋ฏ๋ก ๋ฉ์๋ ์กฐ์ธ ํฌ์ธํธ๋ง ์ง์ํ๋ค. ์ฆ, ํต์ฌ๊ธฐ๋ฅ(ํ๊ฒ)์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๋ฐํ์ ์์ ์๋ง ๋ถ๊ฐ๊ธฐ๋ฅ(์ด๋๋ฐ์ด์ค)์ ์ ์ฉํ ์ ์๋ค.
- ๋ฐํ์์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฏ๋ก final ํด๋์ค์๋ ์ฌ์ ์ํ ์ ์๋ ํ๊ณ๊ฐ ์กด์ฌ
- ์ด ํ๊ณ๋ static๊ณผ final ๋ฉ์๋์๋ ๋์ผํ๋ค.
- ๋ฐ๋ผ์ Spring AOP๋ ๋ฉ์๋ ์คํ์๋ง JoinPoint๋ฅผ ์ง์ํ๋ค.
- ๋ฐ๋ฉด AspectJ ๊ฐ์ ๊ณ ๊ธ AOP ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ์์ฑ, ํ๋๊ฐ์ ์กฐํ์ ์กฐ์, static ๋ฉ์๋ ํธ์ถ ๋ฐ ์ด๊ธฐํ ๋ฑ์ ๋ค์ํ ์์
์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์๋ค.
- AspectJ๋ ๋ฐํ์ ์ด์ ์ ์ค์ ์ฝ๋์ Cross-Cutting Concerns์ Weavingํ๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ JoinPoint๋ฅผ ์ง์ํ๋ค.
- Spring์ ๋์ ํ๋ก์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก AOP๋ฅผ ๊ตฌํํ๋ฏ๋ก ๋ฉ์๋ ์กฐ์ธ ํฌ์ธํธ๋ง ์ง์ํ๋ค. ์ฆ, ํต์ฌ๊ธฐ๋ฅ(ํ๊ฒ)์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๋ฐํ์ ์์ ์๋ง ๋ถ๊ฐ๊ธฐ๋ฅ(์ด๋๋ฐ์ด์ค)์ ์ ์ฉํ ์ ์๋ค.
AOP์ PointCut
- @Before: ๋์ ๋ฉ์๋์ ์ํ ์
- @After: ๋์ ๋ฉ์๋์ ์ํ ํ
- @After-returning: ๋์ ๋ฉ์๋์ ์ ์์ ์ธ ์ํ ํ
- @After-throwing: ์์ธ๋ฐ์ ํ
- @Around: ๋์ ๋ฉ์๋์ ์ํ ์ /ํ
ํํ์ ๋ฌธ๋ฒ
ํฌ์ธํธ์ปท ํํ์์ ํฌ์ธํธ์ปท ์ง์์๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ๋ค. ๋ํ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ง์์๋ excution()์ด๋ค. ๋ฌธ๋ฒ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
excution( [์ ๊ทผ์ ํ์ ํจํด] ํ์ ํจํด [ํ์ ํจํด.] ์ด๋ฆํจํด (ํ์ ํจํด | "..", ...) [throws ์์ธํจํด] )
- [์ ๊ทผ์ ํ์ ํจํด] : public, private๊ณผ ๊ฐ์ ์ ๊ทผ์ ํ์, ์๋ต ๊ฐ๋ฅ
- ํ์ ํจํด : ๋ฆฌํด๊ฐ์ ํ์ ํจํด
- [ํ์ ํจํด.] : ํจํค์ง์ ํด๋์ค ์ด๋ฆ์ ๋ํ ํจํด, ์๋ต๊ฐ๋ฅ ์ฌ์ฉํ ๋ '.'์ ์ฌ์ฉํด ์ฐ๊ฒฐํจ
- ์ด๋ฆํจํด : ๋ฉ์๋ ์ด๋ฆ ํ์ ํจํด
- (ํ์ ํจํด | "..", ...) : ํ๋ผ๋ฏธํฐ์ ํ์ ํจํด์ ์์๋๋ก ๋ฃ์ ์ ์๋ค. ์์ผ๋์นด๋๋ฅผ ์ด์ฉํด ํ๋ผ๋ฏธํฐ ๊ฐ์์ ์๊ด์๋ ํจํด์ ๋ง๋ค ์ ์๋ค.
- [throws ์์ธํจํด] : ์์ธ์ด๋ฆํจํด
JoinPoint ์ธํฐํ์ด์ค
JoinPoint๋ Spring AOP ํน์ AspectJ์์ AOP๊ฐ ์ ์ฉ๋๋ ์ง์ ์ ๋ปํ๋ค.
ํด๋น ์ง์ ์ AspectJ์์ JoinPoint๋ผ๋ ์ธํฐํ์ด์ค๋ก ๋ํ๋ธ๋ค.
- getArgs() : ๋ฉ์๋ ์๊ท๋จผํธ๋ฅผ ๋ฐํํ๋ค.
- getThis() : ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- getTarget() : ๋์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- getSignature() : ์ด๋๋ฐ์ด์ฆ๋๋ ๋ฉ์๋์ ์ค๋ช (description)์ ๋ฐํํ๋ค.
- toString() : ์ด๋๋ฐ์ด์ฆ๋๋ ๋ฉ์๋์ ์ค๋ช ์ ์ถ๋ ฅํ๋ค.
๋ฑ ์ ์ฉํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
๋ชจ๋ ์ด๋๋ฐ์ด์ค๋ org.aspectj.lang.JoinPoint ํ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ด๋๋ฐ์ด์ค ๋ฉ์๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ์ธํ ์ ์๋ค.
Around ์ด๋๋ฐ์ด์ค๋ JoinPoint์ ํ์ ํด๋์ค์ธ ProceedingJoinPoint ํ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์์ ์ผ๋ก ์ ์ธํด์ผ ํ๋ค.
- ProceedingJoinPoint ๋ JoinPoint ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค์ด๋ค.
- proceed() ๋ฉ์๋ ์ ๊ณต.
- ํ๊ฒ ๊ฐ์ฒด์ ์ ๋ค๋ก ์ด๋๋ฐ์ด์ค๋ฅผ ์คํํ๋๋ก ๊ตฌํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ๊ฒ ๊ฐ์ฒด๋ฅผ ์งํํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- ProceedingJoinPoint ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๋๋ ์ด๋๋ฐ์ด์ค ํด๋์ค ๋ด์์ proceed() ๋ฉ์๋๋ฅผ ๋ฐ๋์ ํธ์ถํด์ผ ํ๋ค.
- ์ธ์๊ฐ ์๋ ํํ, ์๋ ํํ ๋๊ฐ์ง๋ก ์ ๊ณต๋๋ค.
- proceed() ๋ฉ์๋ ์ ๊ณต.
์ฐธ๊ณ
'๐ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ์ฆ์ ๋ก๋ฉ, ์ง์ฐ ๋ก๋ฉ | FetchType.EAGER, FetchType.LAZY (0) | 2021.08.31 |
---|---|
[Spring] DI(Dependency Injection) (0) | 2021.05.02 |
[Spring] PSA (Portable Service Abstraction) (0) | 2021.05.02 |
[Spring] Pageable ๋ค์ค Sorting | PageableDefault | Pagination (1) | 2020.01.09 |
๋๊ธ