AOP (Aspect Oriented Programming)
Spring Framework์ ํต์ฌ ๊ฐ๋ 3๊ฐ์ง์์ค ์ฝ๋์ ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ , ํจ์จ์ ๋์ด๊ณ , ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด Spring์์๋ ๋ค์์ 3๊ฐ์ง๋ฅผ ์ด์ฉํ๋ค.
AOP
AOP์ ์ ์
AOP๋ ์ธก๋ฉด ์งํฅ์ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ์๋ก, ์ฌ๋ฌ ๊ฐ์ฒด์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋ ์ ์๋ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค.
ํ ๋ฉ์๋ ๋ด๋ถ์๋ ๋ค์ํ ๊ด์ฌ์ฌ(Concern)๊ฐ ์กด์ฌํ๋๋ฐ, AOP๋ฅผ ์ด์ฉํ๋ฉด ์ด ๊ด์ฌ์ฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ์ธ๋ก๋ก ๋ถ๋ฆฌํ์ฌ ๋ค๋ฃจ๊ฒ ๋๋ค.
์ด ์ค ํต์ฌ ๊ด์ฌ์ฌ๊ฐ ์๋ ๋ถ๊ฐ์ ์ธ ๊ด์ฌ์ฌ๋ ์ฌ๋ฌ ๋ฉ์๋์์ ๊ณตํต์ ์ผ๋ก ์ด์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. (ํธ๋์ญ์ ์ฒ๋ฆฌ, ๋ณด์ ๋ฑ)
๋ฐ๋ผ์, ์ด๋ ๊ฒ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํด์ ๋ค๋ฃจ๋ฉด ์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค๋ ์ฅ์
์ด ์๋ค.
AOP ์ฉ์ด
Aspect
: Concern์ ๋ชจ๋ํํ ๊ฒ์ผ๋ก, ์ฃผ๋ก ๊ณตํต ๋ก์ง์ธ ๊ด์ฌ์ฌ 1๊ณผ 3์ด ์ด์ ํด๋นํ๋ค.Advice
: Aspect ๋ด ๋ฉ์๋๋ค์ ์ผ์ปซ๋ ์ฉ์ด๋ก, ์ค์ ๋ก์ง์ ํด๋นJoinPoint
: Advice๋ฅผ ์ ์ฉํ ์์นPointCut
: ํน์ ๋ฉ์๋์๋ง Advice๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋งํจTarget
: Aspect๋ฅผ ์ ์ฉํ ํด๋์ค, ๋ฉ์๋ ๋ฑ์ ๋งํ๋ค.
AOP in Spring
IoC ์ปจํ
์ด๋ ๋ด์์ Bean์ผ๋ก ๋์ํ๋ค. ํด๋น Bean์ ํ๋ก์ ๊ฐ์ฒด
๋ก, ๋ฐํ์ ์์ ์ ์์ฑ๋์ด ์ฌ์ฉ๋๋ค.
AOP๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ @Aspect๋ฅผ ๋ถ์ธ ํด๋์ค์ Advice๋ฅผ ์ ์ํ ๋ค Advice์ ์ง์ ์์ (์ , ํ, ์ /ํ)์ ์ ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
@Aspect, @Pointcut, @Around
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Aspect
@Component
public class ExpTimeAspect {
@Pointcut("execution(* ์ต์์ํจํค์ง๋ช
..*(..))")
private void publicTarget() {
}
@Around("publicTarget()")
public Object measure(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
try {
return joinPoint.proceed(); // ์ค์ ๋ก์ง ์คํ
} finally {
long finish = System.currentTimeMillis();
Signature signature = joinPoint.getSignature();
System.out.printf("%s.%s(%s) ์คํ ์๊ฐ: %d\n",
joinPoint.getTarget().getClass().getSimpleName(),
signature.getName(),
Arrays.toString(joinPoint.getArgs()),
(finish - start));
}
}
}
AOP๋ Bean์ผ๋ก ๋ฑ๋ก๋์ด์ผ ํ๋ฏ๋ก @Component ์ด๋ ธํ ์ด์ ์ด ์ฌ์ฉ๋์๋ค. @Pointcut์ ํตํด ํน์ Advice๊ฐ ์ฌ์ฉ๋ ํจํค์ง ๋ฒ์, ํ๋ผ๋ฏธํฐ ๋ฑ์ ์ค์ ํ๋ค.
์ง์ ๋ฒ์, ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ Pointcut์ผ๋ก ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ฌ๋ ๋จ ํ ๋ฒ๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ @Around ๋ด์ ๋ฒ์๋ฅผ ์ง์ ํด๋ ๋๋ค.
Pointcut๋ง ๋ฐ๋ก ๋ชจ์๋ common aspect๋ฅผ ์์ฑํ๋ ๊ฒ๋ ํจ์จ์ ์ด๋ค.
@Order
AOP๋ ์ฌ๋ฌ ๊ฐ๊ฐ ์ ์ฉ๋ ์ ์๋ค. ์ฆ, ๋ฉ์ธ ๋ก์ง์ ์คํ ์ ํ๋ก ์ฌ๋ฌ ํ๋ก์๋ฅผ ๊ฑฐ์น ์ ์๋ค.
์ด ํ๋ก์๋ค ๊ฐ์ ์์๊ฐ ๋ณด์ฅ๋์ด์ผ ํ๋ค๋ฉด @Order ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
@Aspect
@Order(1)
@Aspect
@Order(2)
Last updated