AspectProxy
@Aspect AOP
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋ก์๋ฅผ ์ ์ฉํ๋ ค๋ฉด ํฌ์ธํธ์ปท๊ณผ ์ด๋๋ฐ์ด์ค๋ก ๊ตฌ์ฑ๋์ด ์๋ ์ด๋๋ฐ์ด์ (Advisor)๋ฅผ ๋ง๋ค์ด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ์๋ ํ๋ก์ ์์ฑ๊ธฐ๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ ์ด๋๋ฐ์ด์ ๋ค์ ์ฐพ๊ณ ์คํ๋ง ๋น๋ค์ ์๋์ผ๋ก ํ๋ก์๋ฅผ ์ ์ฉํด์ฃผ๋ ์์ ๋ค์ ์ฒ๋ฆฌํด์ค๋ค.
์คํ๋ง์ @Aspect ์ด๋
ธํ
์ด์
์ผ๋ก ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ํฌ์ธํธ์ปท๊ณผ ์ด๋๋ฐ์ด์ค๋ก ๊ตฌ์ฑ๋์ด ์๋ ์ด๋๋ฐ์ด์ ์์ฑ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
์ฐธ๊ณ :
@Aspect๋ ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(AOP)์ ๊ฐ๋ฅํ๊ฒ ํ๋ AspectJ ํ๋ก์ ํธ์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค. ์คํ๋ง์ธ ์ด๊ฒ์ ์ฐจ์ฉํด์ ํ๋ก์๋ฅผ ํตํ AOP๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
@Aspect
@RequiredArgsConstructor
public class LogTraceAspect {
private final LogTrace logTrace;
@Around("execution(* hello.proxy.app..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
TraceStatus status = null;
try {
String message = joinPoint.getSignature().toShortString();
status = logTrace.begin(message);
Object result = joinPoint.proceed();
logTrace.end(status);
return result;
} catch (Exception e) {
logTrace.exception(status, e);
throw e;
}
}
}@Aspect: ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ ํ๋ก์๋ฅผ ์ ์ฉํ ๋ ํ์ํ๋ค.@Around: ํฌ์ธํธ์ปท ํํ์์ ๋ฃ๋๋ค. ํํ์์ AspectJ ํํ์์ ์ฌ์ฉํ๋ค.@Around์ ๋ฉ์๋๊ฐ ์ด๋๋ฐ์ด์ค๊ฐ ๋๋ค.ProceedingJointPoint joinPoint: ์ด๋๋ฐ์ด์ค์MethodInvocation invocation๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ด๋ค. ๋ด๋ถ์ ์ค์ ํธ์ถ ๋์, ์ ๋ฌ ์ธ์, ์ด๋ค ๊ฐ์ฒด์ ์ด๋ค ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋ค.joinPoint.proceed(): ์ค์ ํธ์ถ ๋์(target)์ ํธ์ถํ๋ค.
@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class AopConfig {
@Bean
public LogTraceAspect logTraceAspect(LogTrace logTrace) {
return new LogTraceAspect(logTrace);
}
}
@Import(AopConfig.class)
@SpringBootApplication(scanBasePackages = "hello.proxy.app.v3")
public class ProxyApplication {
public static void main(String[] args) {
SpringApplication.run(ProxyApplication.class, args);
}
@Bean
public LogTrace logTrace() {
return new ThreadLocalLogTrace();
}
}@Aspect๊ฐ ์์ด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด ์ฃผ์ด์ผ ํ๋ค.@Component๋ก ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํด๋ ๋๋ค.
@Aspect ํ๋ก์ - ์ค๋ช
์๋ ํ๋ก์ ์์ฑ๊ธฐ(AnnotationAwareAspectHAutoProxyCreator)๋ Advisor๋ฅผ ์๋์ผ๋ก ์ฐพ์์์ ํ์ํ ๊ณณ์ ํ๋ก์๋ฅผ ์์ฑํ๊ณ ์ ์ฉํด์ค๋ค. ์๋ ํ๋ก์ ์์ฑ๊ธฐ๋ ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก ํ๋์ ์ญํ ์ ๋ํ๋๋ฐ ๋ฐ๋ก @Aspect๋ฅผ ์ฐฝ์์ ์ด๊ฒ์ Advisor๋ก ๋ง๋ค์ด์ค๋ค. ๊ทธ๋์ ์ด๋ฆ ์์ AnnotationAware(์ด๋
ธํ
์ด์
์ ์ธ์ํ๋) ๊ฐ ๋ถ์ด ์๋ ๊ฒ์ด๋ค.

์๋ ํ๋ก์ ์์ฑ๊ธฐ๋ 2๊ฐ์ง ์ผ์ ํ๋ค.
@Aspect๋ฅผ ๋ณด๊ณ ์ด๋๋ฐ์ด์ ๋ก ๋ณํํด์ ์ ์ฅํ๋ค.์ด๋๋ฐ์ด์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์๋ฅผ ์์ฑํ๋ค.

์คํ : ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์๋ ํ๋ก์ ์์ฑ๊ธฐ๋ฅผ ํธ์ถํ๋ค.
๋ชจ๋ @Aspect ๋น ์กฐํ : ์๋ ํ๋ก์ ์์ฑ๊ธฐ๋ ์คํ๋ง ์ปจํ ์ด๋์์
@Aspect์ด๋ ธํ ์ด์ ์ด ๋ถ์ ์คํ๋ง ๋น์ ๋ชจ๋ ์กฐํํ๋ค.์ด๋๋ฐ์ด์ ์์ฑ :
@Aspec์ด๋๋ฐ์ด์ ๋น๋๋ฅผ ํตํด@Aspect์ด๋ ธํ ์ด์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋๋ฐ์ด์ ๋ฅผ ์์ฑํ๋ค.@Aspect๊ธฐ๋ฐ ์ด๋๋ฐ์ด์ ์ ์ฅ : ์์ฑํ ์ด๋๋ฐ์ด์ ๋ฅผ
@Aspect์ด๋๋ฐ์ด์ ๋น๋ ๋ด๋ถ์ ์ ์ฅํ๋ค.
@Aspect ์ด๋๋ฐ์ด์ ๋น๋ @Aspect ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฌ์ธํธ์ปท, ์ด๋๋ฐ์ด์ค, ์ด๋๋ฐ์ด์ ๋ฅผ ์์ฑํ๊ณ ๋ณด๊ดํ๋ ๊ฒ์ ๋ด๋นํ๋ค.
@Aspect ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋๋ฐ์ด์ ๋ฅผ ๋ง๋ค๊ณ @Aspect ์ด๋๋ฐ์ด์ ๋น๋ ๋ด๋ถ ์ ์ฅ์์ ์บ์ํ๋ค. ์บ์์ ์ด๋๋ฐ์ด์ ๊ฐ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ ๊ฒฝ์ฐ ์บ์์ ์ ์ฅ๋ ์ด๋๋ฐ์ด์ ๋ฅผ ๋ฐํํ๋ค.

์์ฑ : ์คํ๋ง ๋น ๋์์ด ๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.(
@Bean, ์ปดํฌ๋ํธ ์ค์บ ๋ชจ๋ ํฌํจ)์ ๋ฌ : ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋น ์ ์ฅ์์ ๋ฑ๋กํ๊ธฐ ์ง์ ์ ๋น ํ์ฒ๋ฆฌ๊ธฐ์ ์ ๋ฌํ๋ค.
1. Advisor ๋น ์กฐํ : ์คํ๋ง ์ปจํ ์ด๋์์
Advisor๋น์ ๋ชจ๋ ์กฐํํ๋ค.2. @Aspect Advisor ์กฐํ :
@Aspect์ด๋๋ฐ์ด์ ๋น๋ ๋ด๋ถ์ ์ ์ฅ๋Advisor๋ฅผ ๋ชจ๋ ์กฐํํ๋ค.
ํ๋ก์ ์ ์ฉ ๋์ ์ฒดํฌ :
3-1,3-2์์ ์กฐํํAdvisor์ ํฌํจ๋์ด ์๋ ํฌ์ธํธ์ปท์ ์ฌ์ฉํด์ ํด๋น ๊ฐ์ฒด๊ฐ ํ๋ก์๋ฅผ ์ ์ฉํ ๋์์ธ์ง ํ๋จํ๋ค. ์ด๋ ๊ฐ์ฒด์ ํด๋์ค ์ ๋ณด๋ฅผ ํฌํจ ํด๋น ๊ฐ์ฒด์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ํฌ์ธํธ์ปท์ ๋น๊ตํด์ ์กฐ๊ฑด์ด ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด ํ๋ก์ ์ ์ฉ ๋์์ด ๋๋ค.ํ๋ก์ ์์ฑ : ํ๋ก์ ์ ์ฉ ๋์์ด๋ฉด ํ๋ก์๋ฅผ ์์ฑํ๊ณ ํ๋ก์๋ฅผ ๋ฐํํ๋ค. ํ๋ก์ ์ ์ฉ ๋์์ด ์๋๋ผ๋ฉด ์๋ณธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๋น ๋ฑ๋ก : ๋ฐํ๋ ๊ฐ์ฒด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ๊ธฐ๋ฅ์ ํน์ ๊ธฐ๋ฅ ํ๋์ ๊ด์ฌ์ด ์๋ ๊ธฐ๋ฅ์ด ์๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค ์ฌ์ด์ ๊ฑธ์ณ์ ๋ค์ด๊ฐ๋ ๊ด์ฌ์ฌ์ด๋ค.
์ด๊ฒ์ ํก๋จ ๊ด์ฌ์ฌ(cross-cutting concerns)๋ผ๊ณ ํ๋ค.

์คํ๋ง AOP๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
Last updated