AOP
2. AOP ์ ์ฉ
1) ์ ์ฉ
- ๊ณตํต ๊ด์ฌ ์ฌํญ(cross-cutting concern)๊ณผ ํต์ฌ ๊ด์ฌ ์ฌํญ(core concern)์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
- ์๊ฐ ์ธก์ ๋ก์ง์ ๋ณ๋์ ๊ณตํต ๋ก์ง์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ํ๋ ๊ณณ์๋ง ์ ์ฉํ๋ค.
- ๋ง์ฝ, ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ค๋ฉด ์ด ๋ก์ง๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
package hello.hello.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component // string been ๋ฑ๋ก: ์ปดํฌ๋ํธ ์ฌ์ฉ ๋๋ SpringConfig ๋ฑ๋ก
@Aspect // aop
public class TimeTraceAop {
@Around("execution(* hello.hello.spring..*(..))") // ์ด๋์ ์ ์ฉํ ๊ฒ์ธ์ง(Targeting)
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");
}
}
}
2) ๊ฒฐ๊ณผ
- ๊ธฐ์กด์ ๊ฐ ๋ฉ์๋๋ง๋ค ์ถ๊ฐํ๋ ์๊ฐ ์ธก์ ๋ก์ง์ ์ญ์ ํด๋ ์๊ฐ ์ธก์ ์ด ๋๊ณ ์๋ค.
3) ๋์ ๋ฐฉ์
- AOP ์ ์ฉ ์ ์๋ Controller๊ฐ Service๋ฅผ ์์กดํ๊ณ ์์ผ๋ฏ๋ก Controller๊ฐ Service ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด Service ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๋จ์ํ ๋ฐฉ์์ด๋ค.
- ํ๋ก์ ๋ฐฉ์์ AOP
- AOP ์ ์ฉ ํ์๋ ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋ ์ค์ Service ์์ ํ๋ก์ Service๋ฅผ ๋ง๋ค์ด ์ธ์ด๋ค.
- ํ๋ก์ Service์ ๋์์ด ๋๋๋ฉด joinPoint.proceed()๊ฐ ํธ์ถ๋๊ณ ์ด๋ ์ค์ Service๊ฐ ๋์ํ๊ฒ ๋๋ค.
- ๊ทธ๋์ Controller๊ฐ ํธ์ถํ๋ Service๋ ์ค์ ๊ฐ ์๋ ํ๋ก์ Service์ด๋ค.
- ์ด๋ฌํ ๋ฐฉ์์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋๋ ๊ฒ์ด DI์ด๋ค.