728x90
반응형
2022.09.28 - [프로그래밍 노트/SPRING] - [Spring] 프록시팩토리_1 (feat. Advice)
2018.07.01 - [프로그래밍 노트/SPRING] - [Spring] Spring AOP(Aspect Oriented Programming)1
AOP 하면 빠질 수 없는 용어들이 있다. 블로그를 찾아보니 2018년도에 AOP 관련 용어를 정리한 글이 존재하는데… 프록시 팩토리에서 찍먹으로 사용되니 몇 개만 속성으로 알아보자
포인트 컷(Pointcut)
- 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것
- 어디에 부가기능(Advice)을 적용할지 판단하는 필터링 로직
어드바이스(Advice)
- 실제로 기능을 구현한 객체
- 프록시가 호출하는 부가 기능
어드바이저(Advisor)
- Pointcut 1 + Advice 1
부가 기능 로직(Advice)를 어디에 적용할지(Pointcut) 선택한다. 그리고 어디에(Pointcut) 어떤 로직(Advice)를 적용할지 Advisor는 모두 알고 있다.
- Method 호출시, Pointcut으로 Advice 적용여부를 판단하여 실행시킨다.
어드바이저 활용
@Test
void simpleAdvisorTest() {
Animal target = new Cat();
ProxyFactory proxyFactory = new ProxyFactory(target);
// 가징 기본적인 Advisor 생성 - 하나의 Pointcut 과 하나의 Advice 로 구성
// Pointcut.TRUE => 항상 ture를 반환하는 Pointcut
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice());
// 프록시 팩토리에 적용할 어드바이저를 지정
proxyFactory.addAdvisor(advisor);
Animal proxy = (Animal) proxyFactory.getProxy();
proxy.bark();
}
스프링이 제공하는 Pointcut
메서드 이름을 기반으로 매칭하는 Pointcut을 사용해보자(NameMatchMethodPointcut)
@Test
@DisplayName("스프링이 제공하는 포인트컷")
void advisorTest3() {
Animal target = new Cat();
ProxyFactory proxyFactory = new ProxyFactory(target);
// 이름으로 메서드를 매칭시킨다.
NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
pointcut.setMappedNames("bark");
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, new TimeAdvice());
proxyFactory.addAdvisor(advisor);
Animal proxy = (Animal) proxyFactory.getProxy();
proxy.bark();
// 만약, Animal 에 다른 메서드(run)가 있었다면 부가기능(TimeAdvice)는 실행되지 않는다.
// proxy.run();
}
스프링은 수 많은 포인트컷을 제공한다.
- JdkRegexpMethodPointcut : 정규 표현식 기반으로 포인트컷을 매칭한다.
- AnnotationMatchingPointcut : 애노테이션으로 매칭한다.
- AspectJExpressionPointcut : aspectJ 표현식으로 매칭한다.
- 중요 중요 AOP 다룰때 다시 보자.. 이녀석
여러 어드바이저를 함께 적용
여러 어드바이저를 target에 적용하려면?
- 어드바이저 수 만큼 프록시를 만들어야 한다… 는 말도 안되는 소리겠지요오~
- 스프링은 하나의 프록시에 여러 어드바이저가 적용가능하다.
@Test
@DisplayName("스프링이 제공하는 포인트컷")
void advisorTest3() {
Animal target = new Cat();
ProxyFactory proxyFactory = new ProxyFactory(target);
// 등록된 advisor 순서대로 실행된다. advisor1 -> advisor2
DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(pointcut, new Advice1());
DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(pointcut, new Advice2());
proxyFactory.addAdvisor(advisor1);
proxyFactory.addAdvisor(advisor2);
Animal proxy = (Animal) proxyFactory.getProxy();
proxy.bark();
}
728x90
반응형
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] @Aspect AOP (0) | 2022.10.11 |
---|---|
[Spring] 빈 후처리기 (feat. proxy, advisor) (0) | 2022.10.11 |
[Spring] 프록시팩토리_1 (feat. Advice) (0) | 2022.09.28 |
[Spring] 동적 프록시 기술(feat. 리플렉션) (0) | 2022.09.27 |
[Spring] 프록시 활용 - 프록시 패턴, 데코레이터 패턴 (0) | 2022.09.26 |