Programing_Java

๐Ÿ”ง [Spring AOP ๊ฐœ๋…+์‹ค๋ฌด์ •๋ฆฌ] ํ•ต์‹ฌ๊ด€์‹ฌ๊ณผ ํšก๋‹จ๊ด€์‹ฌ ์ œ๋Œ€๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  Advice ์ ์šฉ๊นŒ์ง€ ๋ณธ๋ฌธ

โœ… Spring

๐Ÿ”ง [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 ํด๋ž˜์Šค + ํฌ์ธํŠธ์ปท ์กฐํ•ฉ