Programing_Java
๐ง [Spring AOP ๊ฐ๋ +์ค๋ฌด์ ๋ฆฌ] ํต์ฌ๊ด์ฌ๊ณผ ํก๋จ๊ด์ฌ ์ ๋๋ก ๊ตฌ๋ถํ๊ณ Advice ์ ์ฉ๊น์ง ๋ณธ๋ฌธ
๐ง [Spring AOP ๊ฐ๋ +์ค๋ฌด์ ๋ฆฌ] ํต์ฌ๊ด์ฌ๊ณผ ํก๋จ๊ด์ฌ ์ ๋๋ก ๊ตฌ๋ถํ๊ณ Advice ์ ์ฉ๊น์ง
Joyfullyever 2025. 4. 22. 19:30๐ AOP๋? OOP์ ์ฐจ์ด์
• AOP (Aspect Oriented Programming)
→ ๋ง ๊ทธ๋๋ก '๊ด์ '์ ๊ธฐ์ค์ผ๋ก ํ๋ก๊ทธ๋จ์ ๋๋๋ ๋ฐฉ์
→ OOP(๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ)์๋ ๊ฐ๋
์ ์ผ๋ก ๋ฐ๋
• AOP๋ ๋ก์ง์ ์ญํ ๋ณ๋ก ์์ง ๋ถํ ํ๋ ๊ฒ์ด ์๋, ๊ณตํต๊ธฐ๋ฅ์ ์ํ ๋ถํ ํด์ ์ฒ๋ฆฌ
๐ AOP์ ์กด์ฌ ์ด์ – ์ ์ฐ๋๊ฐ
์๋น์ค ๋ก์ง์๋ 2๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ฌ ์์
๊ตฌ๋ถ | ์ค๋ช | ์ฉ์ด |
ํต์ฌ ๊ด์ฌ์ฌ | ์ง์ง ์ค์ํ ๋ก์ง | Core Concern |
ํก๋จ ๊ด์ฌ์ฌ | ๋ฐ๋ณต๋๋ ๊ณตํต ๋ถ๊ฐ ๋ก์ง | Crosscutting Concern |
• ์๋ฅผ ๋ค์ด ํ์๊ฐ์ ์๋น์ค๊ฐ ์๋ค๋ฉด?
ํ์๊ฐ์
์๋น์ค = ๋ก๊น
+ ์์ธ์ฒ๋ฆฌ + ๊ถํํ์ธ + ํธ๋์ญ์
+ ํ์ ์ ์ฅ ๋ก์ง
• Core Concern = ํ์ ์ ์ฅ
• Crosscutting Concern = ๋๋จธ์ง ์ ๋ถ
AOP๋ ๋ฐ๋ก ํก๋จ ๊ด์ฌ์ฌ(Crosscutting Concern)๋ฅผ ๋ถ๋ฆฌํด๋ด๋ ๋๊ตฌ
๐งฑ ํต์ฌ ๊ฐ๋ ์ ๋ฆฌ
• ์ฉ์ด์ค๋ช
Advice | ์ค์ ๋ก ์คํ๋๋ ๊ณตํต ๊ธฐ๋ฅ ๋ก์ง (ex. ๋ก๊ทธ, ์์ธ ์ฒ๋ฆฌ) |
JoinPoint | ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ ์ ์๋ ๋ชจ๋ ๋ฉ์๋ |
Pointcut | JoinPoint ์ค์ Advice๊ฐ ์คํ๋ ๋์์ ์ ํ ๊ฒ |
Aspect | Pointcut + Advice ์ ์กฐํฉ |
Weaving | Advice๋ฅผ ํต์ฌ๋ก์ง์ ์ค์ ๋ก ์ฐ๊ฒฐํ๋ ์์ (Spring์ ๋ฐํ์ ์๋น๋ง ์ง์) |
๐ ๏ธ AOP ์ค์ ํ๋ฆ ์ ๋ฆฌ
1. pom.xml์ aspectj ์ถ๊ฐ
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.23</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.23</version>
</dependency>
2. applicationContext.xml์ AOP ๋ค์์คํ์ด์ค ์ถ๊ฐ
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="... spring-aop.xsd ..."
3. Advice ํด๋์ค Bean ๋ฑ๋ก
<bean id="logAdvice" class="com.example.common.LogAdvice"/>
4. ํฌ์ธํธ์ปท ์ค์ ํ๊ณ ์ฐ๊ฒฐ
<aop:config>
<aop:aspect ref="logAdvice">
<aop:pointcut id="allService" expression="execution(* com.example..*ServiceImpl.*(..))"/>
<aop:before method="printLog" pointcut-ref="allService"/>
</aop:aspect>
</aop:config>
5. printLog() ๋ฉ์๋๋ ๋ฐ๋์ static์ด ์๋์ด์ผ ํจ
• ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ ธ์ผ ํธ์ถ ๊ฐ๋ฅ
• ์ฆ, new ๋ ์ ์๋๋ก <bean> ์ผ๋ก ๋ฑ๋ก ํ์
๐ง ์๊ฐํ ๊ฑฐ๋ฆฌ
• AOP๋ฅผ ์ ์ฐ๋ฉด ์๋น์ค ํด๋์ค๊ฐ ๋ง๋ํด์ง
• ๊ณตํต๊ธฐ๋ฅ ์ฝ๋๊ฐ Advice๋ก ๋น ์ ธ๋๊ฐ๋ฉด์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋จ์
• ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ํ์ง์ด ์ฌ๋ผ๊ฐ
→ ๋์ ์์ง๋ + ๋ฎ์ ๊ฒฐํฉ๋ ์ ์ง → ์ ์ง๋ณด์๊ฐ ์ฌ์ด ๊ตฌ์กฐ
โ ๋ง๋ฌด๋ฆฌ ์์ฝ
• ํต์ฌ ๊ด์ฌ(Core Concern): CRUD ๋ฑ ํต์ฌ ๋น์ฆ๋์ค
• ํก๋จ ๊ด์ฌ(Crosscutting Concern): ๋ก๊น , ํธ๋์ญ์ , ์์ธ, ๊ถํ ๋ฑ
• AOP๋ ํก๋จ ๊ด์ฌ์ Advice๋ก ๋ถ๋ฆฌํด์ ๊ด๋ฆฌ
• ์คํ๋ง์์๋ ๋ฐํ์ ์๋น๋ง ์ง์
• ์ค์ ์ pom.xml + applicationContext.xml + Advice ํด๋์ค + ํฌ์ธํธ์ปท ์กฐํฉ