⬜섹션8 @Aspect AOP
◼️@Aspect 프록시
🟢 스프링 프록시 적용 방법
- Advisor(포인트컷 + 어드바이스) 를 스프링 빈으로 등록
- 자동 프록시 생성기가 스프링 빈으로 등록된 어드바이저를 찾음
- 스프링 빈에 프록시 적용
결국 우리가 할 일은 단순히 위 1번 과정이다. @Aspect 는 편리한 어드바이저 생성 기능을 지원한다.
자동 프록시 생성기( AnnotationAwareAspectJAutoProxyCreator )는 @Aspect를 찾아 이것을 Advisor로 만들어 준다.
🟢 자동 프록시 생성기가 하는 일
- @Aspect를 보고 Advisor로 변환해서 저장
- 어드바이저를 기반으로 프록시 생성
자동 프록시 생성기는 모든 @Aspect 빈 조회 후, @Aspect 어드바이저 빌더를 통해 어드바이저를 생성한다. :)
🟢 자동 프록시 생성기 작동 과정
- 객체는 빈 저장소 등록 전 빈 후처리기에 전달된다.
- 스프링 컨테이너에서 Advisor 빈을 모두 조회하고(3-1), @Aspect 어드바이저 빌더 내부에 저장된 Advisor를 모두 조회(3-2) 한다.
- 프록시 적용 대상을 체크 후 메서드 하나만 포인트컷 조건에 만족해도 프록시를 생성한다.
- 빈을 등록한다.
◼️@Aspect 프록시 - 코드 적용
@Slf4j
@Aspect // 애노테이션 기반 프록시를 적용할 때 필요
public class LogTraceAspect {
private final LogTrace logTrace;
public LogTraceAspect(LogTrace logTrace) {
this.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;
}
}
}
@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class AopConfig {
@Bean // @Aspect가 있어도 스프링 빈으로 등록 해줘야 함
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();
}
}
횡단 관심사(cross-cutting concerns)는 애플리케이션 여러 기능들 사이에 걸쳐서 들어가는 관심사를 말한다.
앞으로는 횡단 관심사를 전문적으로 해결하는 스프링 AOP에 대해 다룬다.
'Spring' 카테고리의 다른 글
[Spring] 스프링 핵심 원리 - 고급편 섹션11 스프링 AOP - 포인트컷 (0) | 2024.08.21 |
---|---|
[Spring] 스프링 핵심 원리 - 고급편 섹션9,10 스프링 AOP 개념,구현 (0) | 2024.08.16 |
[Spring] 스프링 핵심 원리 - 고급편 섹션7 빈 후처리기 (0) | 2024.08.14 |
[Spring] 스프링 핵심 원리 - 고급편 섹션6 스프링이 지원하는 프록시 (0) | 2024.08.04 |
[Spring] 스프링 핵심 원리 - 고급편 섹션5 동적 프록시 기술 (0) | 2024.08.04 |