본문 바로가기
Spring Study

[ AOP 포인트컷 ] 클래스 필터(ClassFilter)와 메서드 매처(MethodMatcher)

by xogns93 2024. 8. 27.

클래스 필터(ClassFilter)메서드 매처(MethodMatcher)는 AOP(Aspect-Oriented Programming)에서 포인트컷(Pointcut)을 정의할 때 사용하는 중요한 개념입니다. 이들은 포인트컷이 어떤 클래스나 메서드에서 적용될지를 결정하는 데 사용됩니다.

 

클래스 필터 (ClassFilter)

ClassFilter는 AOP 포인트컷에서 특정 클래스 집합을 대상으로 필터링하는 역할을 합니다. 즉, 어떤 클래스가 포인트컷의 대상이 될지 여부를 결정합니다.

인터페이스 정의:

public interface ClassFilter {
    boolean matches(Class<?> clazz);
}
  • matches(Class<?> clazz): 이 메서드는 주어진 클래스가 포인트컷의 대상이 될지 여부를 결정합니다. 이 메서드가 true를 반환하면 해당 클래스가 포인트컷의 대상이 됩니다.

예제:

import org.springframework.aop.ClassFilter;

public class MyClassFilter implements ClassFilter {
    @Override
    public boolean matches(Class<?> clazz) {
        return clazz.getName().startsWith("com.example.service");
    }
}
  • 이 예제에서 MyClassFilter는 클래스 이름이 "com.example.service"로 시작하는 경우에만 포인트컷의 대상이 되도록 필터링합니다.

 

 

메서드 매처 (MethodMatcher)

 

MethodMatcher는 포인트컷이 특정 클래스 내의 어떤 메서드에 적용될지를 결정합니다. 즉, 특정 클래스가 필터링된 후 해당 클래스의 메서드 중 어느 메서드가 포인트컷의 대상이 될지를 결정합니다.

 

인터페이스 정의:

public interface MethodMatcher {
    boolean matches(Method method, Class<?> targetClass);

    boolean isRuntime();

    boolean matches(Method method, Class<?> targetClass, Object... args);
}
  • matches(Method method, Class<?> targetClass): 이 메서드는 주어진 메서드가 포인트컷의 대상이 될지 여부를 결정합니다. 이 메서드가 true를 반환하면 해당 메서드가 포인트컷의 대상이 됩니다.
  • isRuntime(): 이 메서드는 런타임 시 추가적인 매칭 로직이 필요한지 여부를 반환합니다. 이 메서드가 true를 반환하면, 다음에 나오는 세 번째 matches 메서드가 런타임에 호출됩니다.
  • matches(Method method, Class<?> targetClass, Object... args): 이 메서드는 런타임 시점에서 메서드의 인수 등을 고려하여 추가적인 매칭을 수행합니다. 이 메서드는 isRuntime()true를 반환할 때만 호출됩니다.

예제:

import org.springframework.aop.MethodMatcher;

import java.lang.reflect.Method;

public class MyMethodMatcher implements MethodMatcher {
    @Override
    public boolean matches(Method method, Class<?> targetClass) {
        return method.getName().startsWith("get");
    }

    @Override
    public boolean isRuntime() {
        return false;
    }

    @Override
    public boolean matches(Method method, Class<?> targetClass, Object... args) {
        // 이 메서드는 isRuntime()이 true일 때만 호출됩니다.
        return false;
    }
}
  • 이 예제에서 MyMethodMatcher는 메서드 이름이 "get"으로 시작하는 경우에만 포인트컷의 대상이 되도록 필터링합니다.

 

클래스 필터와 메서드 매처의 조합

 

포인트컷은 일반적으로 클래스 필터와 메서드 매처의 조합으로 동작합니다. 먼저 클래스 필터가 특정 클래스가 포인트컷의 대상이 되는지 결정한 후, 그 클래스 내의 특정 메서드가 포인트컷의 대상이 되는지를 메서드 매처가 결정합니다.

 

예제: 포인트컷 정의

import org.springframework.aop.support.StaticMethodMatcherPointcut;

import java.lang.reflect.Method;

public class MyPointcut extends StaticMethodMatcherPointcut {

    @Override
    public boolean matches(Method method, Class<?> targetClass) {
        return method.getName().startsWith("set");
    }

    @Override
    public ClassFilter getClassFilter() {
        return clazz -> clazz.getName().startsWith("com.example.service");
    }
}
  • 이 예제에서 MyPointcut"com.example.service"로 시작하는 클래스의 "set"으로 시작하는 메서드에만 어드바이스를 적용하도록 필터링합니다.

결론

  • 클래스 필터(ClassFilter)는 어떤 클래스가 포인트컷의 대상이 될지 결정합니다.
  • 메서드 매처(MethodMatcher)는 필터링된 클래스 내에서 어떤 메서드가 포인트컷의 대상이 될지를 결정합니다.
  • 이 둘을 조합하여 특정 조건을 만족하는 클래스와 메서드에만 어드바이스를 적용할 수 있습니다. 이는 AOP의 강력한 기능을 효과적으로 활용하는 데 핵심적인 역할을 합니다.