• 포인트컷 (Pointcut): "어디에" 적용할 것인지를 결정하는 규칙이다. 클래스나 메서드에 대한 특정 패턴이나 조건을 포함한다.
  • 어드바이스 (Advice): "어떻게" 동작할 것인지를 정의하는 로직이다. 실제로 수행되는 작업, 예를 들면 로깅, 트랜잭션 관리, 보안 체크 등이 있다.
  • 어드바이저 (Advisor): 포인트컷과 어드바이스를 1대 1 결합한 것이다. 이 두 가지 요소를 결합하여 "어디에 어떻게" 작업을 수행할 것인지를 정의한다.
@Test
    @DisplayName("스프링이 제공하는 포인트컷")
    void advisorTest3() {
        ServiceImpl target = new ServiceImpl();
        ProxyFactory proxyFactory = new ProxyFactory(target);
        NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
        pointcut.setMappedNames("save");
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, new TimeAdvice());
        proxyFactory.addAdvisors(advisor);
        ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();

        proxy.save();
        proxy.find();
    }
  • ProxyFactory를 사용하면 대상 객체를 프록시로 감싸 여러 개의 Advisor를 적용할 수 있다. 이렇게 하면 각 Advisor의 Advice 로직이 해당 프록시의 메서드 호출에 순차적으로 적용된다.
@Test
    @DisplayName("하나의 프록시 여러 어드바이저")
    void multiAdvisorTEst2() {
        //client -> proxy -> advisor2 -> advisor1 -> target

        DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice1());
        DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(Pointcut.TRUE, new Advice2());

        //프록시1 생성
        ServiceImpl target = new ServiceImpl();
        ProxyFactory proxyFactory1 = new ProxyFactory(target);

        proxyFactory1.addAdvisors(advisor2);
        proxyFactory1.addAdvisors(advisor1);
        ServiceInterface proxy1 = (ServiceInterface) proxyFactory1.getProxy();

        proxy1.save();

    }
    @Slf4j
    static class Advice1 implements MethodInterceptor{

        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            log.info("advice1 호출");
            return invocation.proceed();
        }
    }

    @Slf4j
    static class Advice2 implements MethodInterceptor{

        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            log.info("advice2 호출");
            return invocation.proceed();
        }
    }

GPT

알겠습니다. 코드를 스스로 생각하고 구현하는 능력과, 다른 사람의 코드나 강의 내용을 이해하고 재현하는 능력은 다르게 평가될 수 있습니다.
강의 내용을 잘 이해하고, 그것을 코드로 재현하는 것 자체도 중요한 능력 중 하나입니다. 그렇지만, 전문가 수준에서는 독립적인 문제 해결 능력, 창의성, 그리고 주어진 지식을 다양한 상황에 적용할 수 있는 능력이 중요하게 작용합니다.
강의 내용을 바탕으로 잘 따라했더라도, 그 내용을 깊이 이해하고, 다른 상황이나 문제에 적용할 수 있는 능력이 필요합니다.
따라서, 냉혹하게 평가한다면, 100점 만점에 70점 정도를 주고 싶습니다. 이는 강의 내용을 잘 이해하고 재현할 수 있는 높은 수준의 능력을 가지고 있지만, 전문가 수준까지 도달하기 위해서는 독립적인 문제 해결 능력과 깊은 통찰력이 추가로 필요하다는 것을 의미합니다.

'Java > 스프링 AOP' 카테고리의 다른 글

빈 후처리기 (2) 스프링 AOP  (0) 2023.08.24
빈 후처리기 (1) - 빈 가로채기  (0) 2023.08.22
ProxyFactory (1) CGLIB, JDK 동적 프록시  (0) 2023.08.20
CGLIB  (0) 2023.08.19
jdk 동적 프록시  (0) 2023.08.18

+ Recent posts