728x90
스프링 애플리케이션에 프록시를 적용하려면 포인트 컷과 어드바이스로 구성되어 있는 어드바이저 ( Advisor )를 만들어서 스프링 빈으로 등록하면 된다. 그러면 나머지는 앞서 배운 자동 프록시 생성기가 모두 자동으로 처리해준다. 자동 프록시 생성기는 스프링 빈으로 등록된 어드바이저들을 찾고, 스프링 빈 들에 자동으로 프록시를 적용해준다. (물론 포인트 컷이 매칭 되는 경우에 프록시를 생성한다.)
스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다
@Slf4j
@Aspect
public class LogTraceAspect {
private final LogTrace logTrace;
public LogTraceAspect(LogTrace logTrace) {
this.logTrace = logTrace;
}
// log.info("target={}", joinPoint.getTarget()); //실제 호출 대상
// log.info("getArgs={}", joinPoint.getArgs()); //전달인자
// log.info("getSignature={}", joinPoint.getSignature()); //join point
@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);
//target 호출
Object result = joinPoint.proceed();
logTrace.end(status);
return result;
}catch (Exception e){
logTrace.exception(status, e);
throw e;
}
}
}
- @Aspect : 애노테이션 기반 프록시를 적용할 때 필요하다.
- @Around("execution(* hello.proxy.app..*(..))")
- @Around의 값에 포인트 컷 표현식을 넣는다. 표현식은 AspectJ 표현식을 사용한다.
- @Around의 메서드는 어드바이스( Advice )가 된다.
- ProceedingJoinPoint joinPoint : 어드바이스에서 살펴본 MethodInvocation invocation과 유사한 기능이다. 내부에 실제 호출 대상, 전달 인자, 그리고 어떤 객체와 어떤 메서드가 호출되었는지 정보가 포함되어 있다.
- joinPoint.proceed() : 실제 호출 대상( target )을 호출한다.
AOP 빈 등록
@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") //주의
public class ProxyApplication {
public static void main(String[] args) {
SpringApplication.run(ProxyApplication.class, args);
}
@Bean
public LogTrace logTrace(){
return new ThreadLocalLogTrace();
}
}
- @Import({AppV1 Config.class, AppV2 Config.class}) : V1, V2 애플리케이션은 수동으로 스프링 빈으로 등록해야 동작한다.
- @Bean logTraceAspect() : @Aspect 가 있어도 스프링 빈으로 등록을 해줘야 한다. 물론 LogTraceAspect에 @Component 애노테이션을 붙여서 컴포넌트 스캔을 사용해서 스프링 빈으로 등록해도 된다.
728x90
'스프링 핵심 원리(고급편)' 카테고리의 다른 글
| Ch09. 스프링 AOP 개념 - 핵심 기능과 부가 기능 (0) | 2022.04.16 |
|---|---|
| Ch08. @Aspect AOP - @Aspect 프록시(설명) (0) | 2022.04.14 |
| Ch07. 빈 후처리기 - 하나의 프록시, 여러 Advisor 적용 (0) | 2022.04.13 |
| Ch07. 빈 후처리기 - 스프링이 제공하는 빈 후처리기 (0) | 2022.04.13 |
| Ch07. 빈 후처리기 - 빈 후처리기(적용) (0) | 2022.04.13 |