๋ฐฐํค์ AOP์ Spring AOP ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
AOP (Aspect-Oriented Programming)
โ ํก๋จ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๋ชจ๋์ฑ์ ์ฆ๊ฐ์ํค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์
๋๋ค.
์ฌ๋ฌ ๋ชจ๋์์ ๊ณตํต์ ์ผ๋ก ํ์ํ์ง๋ง ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๊ธฐ๋ฅ๋ค
์์:
| ์ฉ์ด | ์ค๋ช |
|---|---|
| Aspect | ๋ถ๊ฐ ๊ธฐ๋ฅ(Advice) + ์ ์ฉ ์์น(Pointcut)์ ์กฐํฉ |
| Advice | ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ์ํ ์ฝ๋ (ex: ๋ก๊น ) |
| Pointcut | ์ด๋ค JoinPoint์ Advice๋ฅผ ์ ์ฉํ ์ง ์ ์ |
| JoinPoint | Advice๊ฐ ์ ์ฉ ๊ฐ๋ฅํ ์ง์ (ex: ๋ฉ์๋ ํธ์ถ) |
| Weaving | Advice๋ฅผ ํต์ฌ ๋ก์ง์ ์ ์ฉํ๋ ๊ณผ์ |
| ํ๋ ์์ํฌ | ์ค๋ช |
|---|---|
| AspectJ | ์๋ฐ์ AOP ์ ์ฉ, ์ปดํ์ผ ์์ /ํด๋์ค ๋ก๋ฉ ์์ /๋ฐํ์ ์ง์ |
| Spring AOP | ์คํ๋ง์์ ์ ๊ณตํ๋ AOP ๊ตฌํ (๋ฐํ์ ๊ธฐ๋ฐ, ํ๋ก์ ์ฌ์ฉ) |
@Slf4j
public class HelloService {
public void printA() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
System.out.println("hello A");
}
long endTime = System.currentTimeMillis();
log.info("์ด ๊ฑธ๋ฆฐ ์๊ฐ: {}ms", endTime - startTime);
}
public void printB() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println("hello B");
}
long endTime = System.currentTimeMillis();
log.info("์ด ๊ฑธ๋ฆฐ ์๊ฐ: {}ms", endTime - startTime);
}
}
@Slf4j
@Aspect
public class LoggingAspect {
@Around("execution(* hello.proxy.aop..print*(..))")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
joinPoint.proceed(); // ํต์ฌ ๋ก์ง ์คํ
long endTime = System.currentTimeMillis();
log.info("์ด ๊ฑธ๋ฆฐ ์๊ฐ: {}ms", endTime - startTime);
return result;
}
}



AOP๋?
ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ชจ๋์ฑ์ ๋์ด๊ณ ์ค๋ณต์ ์ค์ด๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
Spring AOP๋?
Spring์์ AOP๋ฅผ ์ ์ฉํ๊ธฐ ์ํ ํ๋ ์์ํฌ. ๋ฐํ์์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐ
์ฌ์ฉ ๋ชฉ์
๊ด์ฌ์ฌ ๋ถ๋ฆฌ, ์ฝ๋ ๊ด๋ฆฌ ์ฉ์ด์ฑ, ์ ์ง๋ณด์์ฑ ํฅ์