2022.10.11 - [프로그래밍 노트/SPRING] - [Spring] 빈 후처리기 (feat. proxy, advisor)
Advisor
를 bean으로 등록하면, AnnotationAwaareAspectJAutoProxyCreator
빈 후처리기가 Advisor 에 지정된 pointcut 기반으로 proxy를 만들어 줬다. Advisor 를 bean 으로 등록하기 위해 어드바이저를 직접 만들었는데, 스프링은 @Aspect
애노테이션으로 매우 편리하게 어드바이저(포인트 컷 + 어드바이스)생성 기능을 지원한다.
Advisor 를 직접 생성하여 bean 으로 등록
@Bean
public Advisor advisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(* hello.proxy.app..*(..))";
TimeAdvice advice = new TimeAdvice();
return new DefaultPointcutAdvisor(pointcut, advice);
}
이 전에 등록한 Advisor 를 아래와 같이 변경하여 자동으로 프록시를 생성하게 할 수 있다.
@Aspect 를 이용하여 Advisor 생성
@Slf4j
@Aspect
@Component
public class TimeAspect {
@Around("execution(* hello.proxy.app..*(..))") // Pointcut
public Object execute(ProceedingJointPoint joinPoint) throws Throwable {
// TimeAdvice 구현 내용을 이곳에 추가한다.
log.info("TimeProxy 실행");
long startTime = System.currentTimeMillis();
// 실제 함수 호출
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("TimeProxy 종료 resultTime={}", resultTime);
return result;
}
}
- @Aspect : 애노테이션 기반 프록시를 적용할 때 사용한다.
- @Around가 달린 메서드는 Advice가 된다.
- @Around의 값에 포인트컷 표현식을 넣는다. (@Around(”execution(* hello.proxy.app..*(..))”)
이것이 어떻게 가능한가하면, AnnotationAwaareAspectJAutoProxyCreator
후처리기가 @Aspect
를 찾아 Advisor
로 들어주기 때문이다. 정말 훌륭한 녀석이다. 어떻게 동작하는지 좀 더 자세히 살펴보자.
@Aspect 클래스를 Advisor로 변환 저장하는 과정
- 스프링이 로딩 시점에
자동 프록시 생성기(빈 후처리기)
를 호출한다. - 자동 프록시 생성기는 스프링 컨테이너에서
@Aspect
애노테이션이 붙은 빈을 모두 조회한다. @Aspect
어드바이저 빌더를 통해@Aspect
정보를 기반으로 어드바이저를 생성한다.- 생성한 어드바이저를
@Aspect
어드바이저 빌더 내부에 저장한다.
@Aspect 어드바이저 빌더
- @Aspect
기반으로 생성된 어드바이저를 캐싱하고 있는 클래스라고 보면 된다. (BeanFactoryAspectJAdvisorsBuilder)
생성된 Advisor 기반으로 프록시를 생성하는 과정
- @Bean, 컴포넌트 스캔을 통하여 빈 대상이 되는
객체를 생성
한다. - 생성된 객체를 빈 저장소에 등록하기 전
빈 후처리기
에전달
한다. Advisor 빈
을 모두 조회한다. (스프링 컨테이너에 등록된 Advisor 빈 + @Aspect 어드바이저 빌더 내부에 저장된 Advisr)- Advisor에 포함된 포인트컷을 사용해서 프록시 적용
대상 여부인지 확인
한다. - 프록시 대상이면 프록시를 생성하고 스프링 빈으로 등록한다. 대상이 아니라면 원본 빈을 등록한다.
개발을 하다보면 애플리케이션 전반적인 기능들 사이에 걸쳐 있는 공통적인 기능들이 있다. 예를 들면 로깅, 트랜잭션, 시큐리티와 같은 기능들인데, 우리는 이런 것들을 여러 기능들 사이에 걸쳐있는 관심사
즉, 횡단 관심사(cross-cutting concerns)
라고 부른다. AOP는 횡단 관심사 문제를 해결하기 위한 방법 중 하나이며, AOP 를 이용하면 비즈니스코드와 횡단 관심사를 분리함으로써 개발자가 비즈니스 코드에만 집중할 수 있게 도와준다. 그러니.. 스프링 AOP에 대해 파보자.
내용) 스프링 핵심 원리 - 고급편 (김영한님)
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] Spring AOP (1) | 2022.10.28 |
---|---|
[Spring] 빈 후처리기 (feat. proxy, advisor) (0) | 2022.10.11 |
[Spring] 프록시팩토리_2 (feat. Advisor) (0) | 2022.09.30 |
[Spring] 프록시팩토리_1 (feat. Advice) (0) | 2022.09.28 |
[Spring] 동적 프록시 기술(feat. 리플렉션) (0) | 2022.09.27 |