ํก๋จ ๊ด์ฌ์ฌ (cross-cutting concerns)
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ํ ์๋งค ์ ํ๋ฆฌ์์ ์ ๊ฒฝ์ฐ ์ํ๋ฅผ ์๋งคํ๋ ๊ฒ์ด ํต์ฌ ๋ก์ง์ด๊ณ ,
์ด๋ฌํ ํต์ฌ ๊ธฐ๋ฅ์ ๋ณด์กฐํ๊ธฐ ์ํด ๋ก๊ทธ๋ฅผ ๋จ๊ธด๋ค๋์ง ํ๋ ๊ธฐ๋ฅ๋ค์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๊ฐ์ด ์ฌ์ฉ๋์ง๋ง, ํ๋์ ์ฝ๋ ์์์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ด ๋ชจ๋ ๋ค์ด๊ฐ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ํต์ฌ ๊ธฐ๋ฅ์ ์ง์คํ๊ธฐ ์ด๋ ค์ ์ง ๊ฒ์ ๋๋ค.
๋ํ ๋๋ถ๋ถ์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ํ๋์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ถ๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋ฌ๊ฐ์ ํต์ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋๋ ์ฝ๋๋ ๋ง์์ง๋๋ค.
์ด๋ ๊ฒ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ๋์ผํ๊ฒ ์ฌ์ฉ๋๋ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ํก๋จ ๊ด์ฌ์ฌ(cross-cutting concerns)๋ผ๊ณ ํฉ๋๋ค.
๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ฉํ ๋๋ ๋ง์ ๋ฌธ์ ์ ๋ค์ด ์๊ฒจ๋๋๋ฐ ๋ง์ ๋ฐ๋ณต๊ณผ ์ค๋ณต ์ฝ๋, ์ค๋ณต๋ ์ฝ๋๋งํผ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ ๋ ์์ ์ ํด์ผํ๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
AOP - Aspect Oriented Programming
์์์ ์ค๋ช ํ ๋ถ๊ฐ ๊ธฐ๋ฅ ์ ์ฉ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ถ๊ฐ ๊ธฐ๋ฅ์ ํ ๊ณณ์์๋ง ๊ด๋ฆฌํ๋๋ก ๋ง๋ค๊ณ , ํด๋น ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ด๋์ ์ ์ฉํ ์ง ์ ํํ๋ ๊ธฐ๋ฅ์ด ๋ง๋ค์ด์ก์ต๋๋ค.
์ด๋ ๊ฒ ๋ถ๊ฐ ๊ธฐ๋ฅ๊ณผ ํด๋น ๊ธฐ๋ฅ์ ์ด๋์ ์ ์ฉํ ์ง ์ ํํ๋ ๊ธฐ๋ฅ๋ค์ ํฉํด์ ํ๋์ ๋ชจ๋๋ก ๋ง๋ค์๋๋ฐ,
๊ทธ๊ฒ์ ์ ์คํฉํธ(Aspect)๋ผ ๋ถ๋ฆ ๋๋ค.
์คํ๋ง์์ ์ ๊ณตํ๋ ์ด๋๋ฐ์ด์ (Advisor)๋ ๋ถ๊ฐ ๊ธฐ๋ฅ(Advise)๊ณผ ์ ์ฉ ๋์(Pointcut)์ ๊ฐ์ง๊ณ ์๊ธฐ์ ํ๋์ Aspect์ ๋๋ค.
AspectJ ํ๋ ์์ํฌ
AOP์ ๋ํ์ ์ธ ๊ตฌํ์ผ๋ก AspectJํ๋ ์์ํฌ๊ฐ ์์ต๋๋ค.
์คํ๋ง์์๋ AOP๋ฅผ ์ง์ํ์ง๋ง ๋๋ถ๋ถ AspectJ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ , AspectJ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ผ๋ถ๋ง ์ ๊ณตํฉ๋๋ค.
AOP ์ ์ฉ ๋ฐฉ์
AOP๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ถ๊ฐ ๊ธฐ๋ฅ๊ณผ ํต์ฌ ๊ธฐ๋ฅ์ ์ฝ๋์์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ํจ์ ๋๋ค.
AOP๋ฅผ ์ฌ์ฉํ ๋ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ปดํ์ผ ์์ ์ ์ถ๊ฐ
- ํด๋์ค ๋ก๋ฉ ์์ ์ ์ถ๊ฐ
- ๋ฐํ์ ์์ ์ ์ถ๊ฐ(ํ๋ก์)
์ปดํ์ผ ์์ ์ ๋ก์ง์ ์ถ๊ฐ๋๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ AspectJ๊ฐ ์ ๊ณตํ๋ ํน๋ณํ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ์ ์งํํด์ผ ํฉ๋๋ค.
ํด๋์ค ๋ก๋ฉ ์์ ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ .class๋ก ์ปดํ์ผ ๋ ํ์ผ์ JVM ๋ด๋ถ์ ํด๋์ค ๋ก๋์ ๋ณด๊ดํ ๋ .classํ์ผ์ ์กฐ์ํ์ฌ JVM์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
(Java Instrumentation์ ๋ํด ๊ฒ์ํ๋ฉด ๊ด๋ จ ์๋ฃ๊ฐ ๋์ต๋๋ค.)
์ด ๋ฐฉ๋ฒ๋ ์๋ฐ๋ฅผ ์คํํ ๋ ํน๋ณํ ์ต์ (java -javaagent)์ ํตํด ํด๋์ค ๋ก๋ ์กฐ์๊ธฐ๋ฅผ ์ง์ ํด์ผ ํ๋๋ฐ, ์ด ๋ถ๋ถ์ด ๋ฒ๊ฑฐ๋กญ๊ณ ์ด์ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๋ฐํ์ ์์
๋ฐํ์ ์์ ์ ์ปดํ์ผ๋ ๋ค ๋๋๊ณ , ํด๋์ค ๋ก๋์ ํด๋์ค๋ ๋ค ์ฌ๋ผ๊ฐ ์ํ์ ๋๋ค.
์ฆ ์๋ฐ์ main ๋ฉ์๋๊ฐ ์ด๋ฏธ ์คํ๋ ๋ค์์ด๋ฉฐ, ๋ฐ๋ผ์ ์๋ฐ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ๋ฒ์ ์์์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ฉํด์ผ ํฉ๋๋ค.
์คํ๋ง๊ณผ ๊ฐ์ ์ปจํ ์ด๋์ ๋์์ ๋ฐ๊ณ , ํ๋ก์์ DI, ๋น ํฌ์คํธ ํ๋ก์ธ์(๋น ํ์ฒ๋ฆฌ๊ธฐ)๊ฐ์ ๊ฐ๋ ๋ค์ ์ด ๋์ํด์ ์ต์ข ์ ์ผ๋ก ํ๋ก์๋ฅผ ํตํด ์คํ๋ง ๋น์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์์ต๋๋ค.
ํ๋ก์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ AOP์ ์ผ๋ถ ์ ์ฝ์ด ์์ผ๋ ํน๋ณํ ์ปดํ์ผ๋ฌ๋, ์ฌ๋ฌ ์ค์ ์์ด๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
์ผ๋ถ ์ ์ฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์์ด ๋ถ๊ฐ๋ฅ ํ ํด๋์ค(final)์ ์ ์ฉ ๋ถ๊ฐ
- ์์ฑ์๋ฑ์ ์ ์ฉ ๋ถ๊ฐ
- ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ ์ฉ ๊ฐ๋ฅ
AOP ์ ์ฉ ์์น - ์กฐ์ธ ํฌ์ธํธ
AOP๋ ๋ฉ์๋ ์คํ ์์น ๋ฟ๋ง ์๋๋ผ ์์ฑ์, ํ๋ ๊ฐ ์ ๊ทผ, static๋ฉ์๋ ์ ๊ทผ, ๋ฉ์๋ ์คํ ๋ฑ ์ฌ๋ฌ ๊ณณ์ ์ ์ฉํ ์ ์์ผ๋ฉฐ,
์ด๋ ๊ฒ AOP๋ฅผ ์ ์ฉํ ์ ์๋ ์ง์ ์ ์กฐ์ธ ํฌ์ธํธ(Join point)๋ผ๊ณ ํฉ๋๋ค.
์ปดํ์ผ ์์ ๊ณผ ํด๋์ค ๋ก๋ฉ ์์ ์ ์ ์ฉ๋๋ AOP๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ค์ ๋ก ์กฐ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์น์ ๋ค ์ ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ๋ก์ ๋ฐฉ์์ ์ฌ์ฉํ๋ ์คํ๋ง AOP์์๋ ๋ฉ์๋ ์คํ ์ง์ ์๋ง AOP๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
- ํ๋ก์๋ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ๊ฐ๋ ์ผ๋ก ๋์ํ๋ฏ๋ก, ์์ฑ์๋ static ๋ฉ์๋, ํ๋ ๊ฐ ์ ๊ทผ์๋ ํ๋ก์ ๊ฐ๋ ์ด ์ ์ฉ๋ ์ ์์ต๋๋ค.
- ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ ์คํ๋ง AOP์ ์กฐ์ธ ํฌ์ธํธ๋ ๋ฉ์๋ ์คํ์ผ๋ก ์ ํ๋ฉ๋๋ค.
AOP ์ฉ์ด
์กฐ์ธ ํฌ์ธํธ (Join point)
- ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์ ์๋ ์์น์
๋๋ค.
- ๋ฉ์๋ ์คํ, ์์ฑ์ ํธ์ถ, ํ๋ ๊ฐ ์ ๊ทผ, static ๋ฉ์๋ ์ ๊ทผ ๊ฐ์ ํ๋ก๊ทธ๋จ ์คํ ์ค ์ง์ (์คํ๋ง AOP๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฉ์๋ ์คํ์ผ๋ก ์ ํ๋๋ค.)
- ์กฐ์ธ ํฌ์ธํธ๋ ์ถ์์ ์ธ ๊ฐ๋ ์ด๋ฏ๋ก AOP๋ฅผ ์ ์ฉํ ์ ์๋ ๋ชจ๋ ์ง์ ์ด๋ผ ์๊ฐํ ์ ์์ต๋๋ค.
- ์คํ๋ง AOP๋ ํ๋ก์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก ์กฐ์ธ ํฌ์ธํธ๋ ํญ์ ๋ฉ์๋ ์คํ ์ง์ ์ผ๋ก ์ ํ๋ฉ๋๋ค..
ํฌ์ธํธ์ปท(Pointcut)
- ์กฐ์ธ ํฌ์ธํธ ์ค์์ ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์์น๋ฅผ ์ ๋ณ(ํ๋จ)ํ๋ ํํฐ๋ง ๋ก์ง์ ๋๋ค.
- ์ฃผ๋ก AspectJ ํํ์์ ์ฌ์ฉํด์ ์ง์ ํ๋ค.
ํ๊ฒ(Target)
- ์ด๋๋ฐ์ด์ค(๋ถ๊ฐ ๊ธฐ๋ฅ)๋ฅผ ๋ฐ๋ ์ค์ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. ํฌ์ธํธ์ปท์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค.
์ด๋๋ฐ์ด์ค(Advice)
- ๋ถ๊ฐ ๊ธฐ๋ฅ
- ํน์ ์กฐ์ธ ํฌ์ธํธ์์ Aspect์ ์ํด ์ทจํด์ง๋ ์กฐ์น
- Around(์ฃผ๋ณ), Before(์ ), After(ํ)์ ๊ฐ์ ๋ค์ํ ์ข ๋ฅ์ ์ด๋๋ฐ์ด์ค๊ฐ ์์ต๋๋ค.
์ ์คํํธ(Aspect)
- ์ด๋๋ฐ์ด์ค + ํฌ์ธํธ์ปท์ ๋ชจ๋ํ ํ ๊ฒ์ ๋๋ค.
- ์ฌ๋ฌ ์ด๋๋ฐ์ด์ค์ ์ฌ๋ฌ ํฌ์ธํธ์ปท์ด ํจ๊ป ์กด์ฌํ ์๋ ์์ต๋๋ค.
- @Aspect๋ฅผ ํตํด Advisor๊ฐ ์์ฑ๋ฉ๋๋ค.
์ด๋๋ฐ์ด์ (Advisor)
- ํ๋์ ์ด๋๋ฐ์ด์ค + ํ๋์ ํฌ์ธํธ์ปท
- ์คํ๋ง AOP์์๋ง ์ฌ์ฉ๋๋ ํน๋ณํ ์ฉ์ด์ ๋๋ค.
์๋น(Weaving)
- ํฌ์ธํธ์ปท์ผ๋ก ๊ฒฐ์ ํ ํ๊ฒ์ ์กฐ์ธ ํฌ์ธํธ์ ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์๋น์ ํตํด์ ํต์ฌ ๊ธฐ๋ฅ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์์ต๋๋ค.
- AOP ์ ์ฉ์ ์ํด ์ ์คํํธ๋ฅผ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ ์ํ์ ๋๋ค.
AOP ํ๋ก์
- AOP ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ง๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์คํ๋ง์์ AOP ํ๋ก์๋ JDK ๋์ ํ๋ก์ ๋๋ CGLIB ํ๋ก์์ ๋๋ค.
์ฐธ๊ณ
์คํ๋ง์ AspectJ์ ๋ฌธ๋ฒ์ ์ฐจ์ฉํ๊ณ , ํ๋ก์ ๋ฐฉ์์ AOP๋ฅผ ์ ์ฉํฉ๋๋ค.
AspectJ๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋๋ค.
Reference
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop
'๐๏ธ Spring > AOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AOP] ์คํ๋ง AOP ๊ตฌํ๋ฐฉ๋ฒ (0) | 2022.08.02 |
---|---|
[AOP] @Aspect (0) | 2022.08.01 |
[AOP] ๋น ํ์ฒ๋ฆฌ๊ธฐ(BeanPostProccessor)์AnnotationAwareAspectJAutoProxyCreator (0) | 2022.08.01 |
[AOP] ํฌ์ธํธ์ปท, ์ด๋๋ฐ์ด์ค, ์ด๋๋ฐ์ด์ (0) | 2022.08.01 |
[AOP] ํ๋ก์ ํฉํ ๋ฆฌ (0) | 2022.08.01 |