> For the complete documentation index, see [llms.txt](https://wannaqueen.gitbook.io/spring5/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wannaqueen.gitbook.io/spring5/spring-5.0/6-spring-aop-api/6.1-spring-pointcut-api/6.1.1.md).

# 6.1.1 개념들 by ys

Spring의 포인트 컷 모델은 advice 유형과 상관없이 pointcut 재사용을 가능하게한다. **동일한 포인트 컷을 사용하여 다른 advice 을 타겟팅 할 수 있습니다.**

```java
public interface Pointcut {

    ClassFilter getClassFilter();

    MethodMatcher getMethodMatcher();

}
```

{% hint style="info" %}
&#x20;\- 위빙 (Weaving) : 보조업무가 프록시(Proxy)를 통해서 주 업무에 주입되는 것. 즉, 타깃 객체에 애스펙트를 적용해서 새로운 프록시 객체를 생성하는 절차.

\
&#x20;\- 조인포인트 (Joint Point) : 위빙하게 되는 함수. 그 지점.

&#x20;\- 포인트 컷 (PointCuts) : 객체의 특정 함수만 조인포인트 역할을 하도록 하는 것.
{% endhint %}

`org.springframework.aop.Pointcut`인터페이스는 특정 클래스 및 방법에 관한 advice를 타겟팅하는데 사용되는 핵 인터페이스이다. 전체 인터페이스는 다음과 같습니다.

`Pointcut`인터페이스를 두 부분으로 나누면 클래스 및 메소드  맞는 부분을 재사용 할 수 있고 세밀한 구성(composition)작업 (예 : 다른 메소드 매처(matcher)와 함께  "union"수행)을 허용합니다.

포인트컷을 주어진 대상 클래스의 세트로 제한할 때 `ClassFilter` 인터페이스를 사용한다. **`matches()` 메서드가 항상 true를 반환하면 모든 클래스에 매칭될 것이다.**

다음 목록은 `ClassFilter`인터페이스 정의를 보여줍니다 .

{% hint style="info" %}
`pointcut 인터페이스를 쉽게 재사용하고 구성하기 위해 두부분으로 나누었다는 말.`&#x20;
{% endhint %}

```java
public interface ClassFilter {

    boolean matches(Class clazz);
}
```

{% hint style="info" %}
true를 반환하는 메소드에만 매칭될 거라는 말. 그걸 걸러내는 역할.&#x20;
{% endhint %}

`MethodMatcher`가 보통은 더 중요하다. 전체 인터페이스가 아래 나와 있다.

```java
public interface MethodMatcher {

    boolean matches(Method m, Class targetClass);

    boolean isRuntime();

    boolean matches(Method m, Class targetClass, Object[] args);
}
```

**이 포잇트컷이 대상 클래스의 해당 메서드에 매칭될 것인지를 테스트할 때 `matches(Method, Class)`메서드를 사용한다.** 메서드 호출시마다 테스트가 필요한 경우를 피하려고 AOP 프락시를 생성할 때 이 평가를 수행할 수 있다. 2개의 인자를 가진 `matches` 메서드는 해당 메서드에 `true`를 반환하고 MethodMatcher&#xC758;**`isRuntime()`메서드가 true를 반환한다면 3개의 인자를 가진 matches 메서드는 메서드 호출시마다 호출될 것이다.** 대상 어드바이스가 실행되기 전에 메서드 호출에 전달된 인자를 바로 보고 포인트컷을 활성화한다.

대부분의 `MethodMatcher`는 정적이라서 MethodMatcher의 `isRuntime()` 메서드는 `false`를 반환한다. 이 경우 3개의 인자를 가진 `matches` 메서드는 절대 호출되지 않는다.

| TIP | 가능하다면 포인트컷을 정적으로 만들어서 AOP 프레임워크가 AOP 프락시를 생성할 때 포인트컷 평가 결과를 캐시하도록 해라. |
| --- | --------------------------------------------------------------------- |

{% hint style="info" %}
필요가 없어도 포함되는것을 정적이라고하고 필요가 없을 때는 포함이 되지 않고 필요할때 포함되는 것을 동적
{% endhint %}
