
=Aspect-Oriented Programming
=๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ
๊ณตํต๊ด์ฌ์ฌ์ ํต์ฌ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ณ ๊ธฐ๋ฅ๋๋ก ๊ตฌ๋ถํ์ฌ ๋ถ๋ฆฌํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ชจ๋ ๋งค์๋์ ์์๊ณผ ๋์ ์๊ฐ์ ์ฐ์ด์ ์ผ๋ง๋ ๊ฑธ๋ฆฌ๋ ์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด ๋ชจ๋ ๋งค์๋ ๋ง๋ค ๊ฐ์ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์ด์ผํ๋ ๋ฐ ์ด๊ฒ์ ๋งค์๋์ ์ฃผ์ ๊ธฐ๋ฅ์ธ ์ฝ๋๋ฅผ ๋ช
ํํ์ง ์๊ฒ ํ๊ณ ์ฝ๋ ์ค๋ณต์ด ์ฌํด์ง๋ค.

๊ทธ๋์ ์คํ๋ง์์ ์ง์ํ๋ ๊ฒ์ด AOP ์ด๋ค.
ํด๋์ค์ ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ AOP๋ฅผ ๋ง๋ ๋ค.
AOP ์์ ์ธ์งํ๊ฒ ํด์ฃผ๊ธฐ ์ํด์ @Bean ์ ๋ฑ๋กํด์ ์จ์ฃผ๋ ๊ฒ์ด ์ข๋ค. (@Componant ๋ฅผ ์ด์ฉํด์ componantScan์ ํด์ฃผ์ด๋ ๋๋ค.)
@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString()+ " " + timeMs +
"ms");}
}
}
@Aspect ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ผ AOP๋ก ์ธ ์ ์๋ค.
@Around("execution( hello.hellospring..(..))")
์ด AOP๊ฐ ์ ์ฉ๋๋ ๋ฒ์๋ฅผ ์จ์ฃผ์ด์ผ ํ๋ค. execution ์์ ํจํค์ง ๋ช ์ ์จ์ฃผ๋ฉด ๊ทธ ํจํค์ง ํ์์ ์๋ ๋ชจ๋ ๋งค์๋์ ์ ์ฉ์ด ๋๋ค.

ProceedingJoinPoint๋
Advice(Advice: ์ธ์ ๊ณตํต ๊ด์ฌ ๊ธฐ๋ฅ์ ํต์ฌ ๋ก์ง์ ์ ์ฉํ ์ง๋ฅผ ์ ์) ์ฝ๋ ๋ด์์ ํ์ฌ ์คํ ์ค์ธ ๋ฉ์๋์ ์ ๊ทผํ๊ณ , ์ด๋ฅผ ์ ์ดํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
JoinPoint๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด
Around advice(@Around)์์๋ง ์ง์๋๋ JoinPoint
Target Object์ ๋ฉ์๋ ์ ๋ณด๋ฅผ ํฌํจ
์ด๋ถ๋ถ์
ProceedingJoinPoint.proceed()๋ Target์ ๋ฉ์๋ ์คํ์ ์ ์ดํ ์ ์๋ค