> 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.4-pointcut.md).

# 6.1.4 편리한 Pointcut 구현 by ys

스프링은 편리한 포인트컷 구현체를 여러 가지 제공한다. 일부는 독창적으로 사용할 수 있고 일부는 애플리케이션에 특화된 포인트컷의 하위클래스로 만들어졌다.

#### **정적 포인트 컷**

정적 포인트컷은 메서드와 대상 클래스에 기반을 두고 있어서 메서드의 인자를 고려할 수 없다. **정적 포인트컷은 대부분의 경우에 만족스럽다.(가장 좋은 방법이기도 하다.)** **스프링이 메서드를 처음 호출할 때 정적 포인트컷을 딱 한 번만 평가하고 이후에는 메서드 호출하더라도 포인트컷을 다시 평가하지 않도록 할 수 있다.**

이 절의 나머지 부분에서는 Spring에 포함 된 정적 pointcut 구현물 중 일부를 설명합니다.

#### **정규 표현식 Pointcuts**

정적 포인트컷을 지정하는 명확한 방법의 하나는 정규표현식을 사용하는 것이다. 스프링 외의 여러 AOP 프레임워크도 정규표현식을 지원한다. `org.springframework.aop.support.JdkRegexpMethodPointcut`은 JDK에서 지원하는 일반적인 정규표현식 포인트컷입니다.&#x20;

`JdkRegexpMethodPointcut` 클래스를 사용해서 패턴 문자열의 목록을 제공할 수 있다. 이 중에서 일치하는 패턴이 있다면 포인트컷은 true로 평가할 것이다.(그래서 결과는 이러한 포인트컷을 효과적으로 합친 결과이다.)

다음 예는 `JdkRegexpMethodPointcut`을 사용하는 방법을 보여줍니다.

```java
<bean id="settersAndAbsquatulatePointcut"
        class="org.springframework.aop.support.JdkRegexpMethodPointcut">
    <property name="patterns">
        <list>
            <value>.*set.*</value>
            <value>.*absquatulate</value>
        </list>
    </property>
</bean>
```

스프링은 Advice도 참조할 수 있도록(`Advice`는 interceptor, before advice, throws advice가 될 수 있다는 점을 기억해라) `RegexpMethodPointcutAdvisor`라는 편리한 클래스를 제공한다. 내부에서 스프링은 `JdkRegexpMethodPointcut`를 사용할 것이다. `RegexpMethodPointcutAdvisor`로 아래 나와 있는 대로 포인트컷과 어브다이스를 모두 하나의 빈으로 캡슐화해서 연결을 간소화한다.

```java
<bean id="settersAndAbsquatulateAdvisor"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
        <ref bean="beanNameOfAopAllianceInterceptor"/>
    </property>
    <property name="patterns">
        <list>
            <value>.*set.*</value>
            <value>.*absquatulate</value>
        </list>
    </property>
</bean>
```

`RegexpMethodPointcutAdvisor`모든 `Advice`유형 과 함께 사용할 수 있습니다 .

#### **Attribute 중심의 Pointcuts**

정적 포인트 컷의 중요한 유형은 메타 데이터 중심(metadata-driven)의 pointcut입니다. 이는 메타 데이터 속성(Attribute) 값 (보통은 소스 수준의 메타 데이터)을 사용합니다.

####

####

#### **동적 pointcuts**

동적 포인트컷은 정적 포인트컷보다 평가하는데 더 큰 비용이 들고 메서드의 인자를 정적인 정보처럼 고려할 수 있다. 그래서 메서드 호출시마다 평가해야 한다. 인자가 다양하므로 결과는 캐시할 수 없다.

대부분의 예제는 `control flow`포인트컷이다.

#### **흐름 제어(**`control flow)`**포인트 컷**

스프링 흐름 제어 포인트컷은 AspectJ의 `cflow` 포인트컷보다 덜 강력하지만, 개념적으로는 유사하다. (현재는 pointcut이 다른 pointcut과 일치하는 join point 아래에서 실행되도록 지정하는 방법이 없습니다.) 흐름 제어 포인트컷은 현재 콜스택(call stack)에서 매칭한다. 예를 들어 `com.mycompany.web` 패키지나 `SomeCaller`클래스에서 메서드가 조인포인트를 호출했다면 흐름 제어 포인트컷이 호출된다(트리거). 흐름 제어 포인트컷은 `org.springframework.aop.support.ControlFlowPointcut`클래스로 지정한다.

{% hint style="info" %}
트리거(Trigger)란 영어로 방아쇠라는 뜻인데, 방아쇠를 당기면 그로 인해 총기 내부에서 알아서 일련의 작업을 실행하고 총알이 날아갑니다. 이처럼 데이터베이스에서도 **트리거(Trigger)는 특정 테이블에 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때**, **데이터베이스에서 자동으로 동작하도록 작성된 프로그램입니다.** 즉! 사용자가 직접 호출하는 것이 아니라, 데이터베이스에서 자**동적으로 호출하는 것이 가장 큰 특징**입니다.&#x20;

트리거(Trigger)는 테이블과 뷰 데이터베이스 작업을 대상으로 정의할 수 있으며, **전체 트랜잭션 작업에 대해 발생되는 트리거(Trigger)와 각행에 대해 발생되는 트리거(Trigger)가 있습니다.**
{% endhint %}

|   | 흐름 제어 포인트컷은 다른 동적 포인트컷보다도 런타임 실행 비용이 상당히 더 크다. Java 1.4에서 다른 동적 포인트컷보다 5배 정도의 비용이 더 든다. |
| - | --------------------------------------------------------------------------------------- |
