# 5.5.2 Pointcut 선언 by sh

### **5.5.2. Pointcut 선언**

&#x20;**`<aop:config>`요소 내에 명명 된 pointcut을 선언하여 포인트 컷 정의를 여러 aspect와 advisor에 공유 할 수 있습니다.**&#x20;

{% hint style="info" %}
* aspect : 공통 기능 (여러 클래스에 걸친 관심사의 모듈화)
* joinpoint : advice를 적용해야 하는 부분 (스프링 AOP에서 joinpoint는 항상 메서드 실행을 의미) -> 메서드가 실행되는 중의 어떤 지점
* advice : aspect 기능 자체 (특정 조인포인트에서 aspect가 취하는 행동 -> around, before, after, ... 등 여러 타입이 존재)
* **pointcut : joinpoint의 부분으로 실제로 advice가 적용된 부분**
  * **조인포인트를 매칭하는 것 - advice는 표현식과 연결되고 포인트 컷이 매치한 조인 포인트에서 실행 된다.**
  * **어떤 클래스의 어느 조인 포인트를 사용할 것 인지를 결정하는 기능.**
  * **스프링은 기본적으로 AspectJ 포인트 컷 표현식 언어를 사용. AspectJ에서는 와일드카드를 이용한 메서드 시그니처를 사용한다.**
* weaving : advice를 핵심 기능에 적용하는 행위
{% endhint %}

**서비스 계층에서 비즈니스 서비스의 실행을 나타내는 포인트 컷은 다음과 같이 정의 할 수 있습니다.**

```markup
<aop:config>

    <aop:pointcut id="businessService"
        expression="execution(* com.xyz.myapp.service.*.*(..))"/>

</aop:config>
```

**pointcut 표현식 자체는** [**@AspectJ support**](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop-ataspectj)**에 설명 된 것과 동일한 AspectJ pointcut 표현식 언어를 사용한다.** 스키마 기반 선언 스타일을 사용하는 경우 pointcut 표현식에서 유형 (@Aspects)에 정의 된 명명 된 pointcuts를 참조 할 수 있습니다. 위의 pointcut을 정의하는 또 다른 방법은 다음과 같습니다.&#x20;

```markup
<aop:config>

    <aop:pointcut id="businessService"
        expression="com.xyz.myapp.SystemArchitecture.businessService()"/>

</aop:config>
```

[Sharing Common Pointcut Definitions](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop-common-pointcuts)에 설명 된대로 `SystemArchitecture`aspect가 있다고 가정합니다.&#x20;

그런 다음 aspect 안에서 pointcut을 선언하는 것은 top-level pointcut을 선언하는 것과 매우 유사합니다.&#x20;

```markup
<aop:config>

    <aop:aspect id="myAspect" ref="aBean">

        <aop:pointcut id="businessService"
            expression="execution(* com.xyz.myapp.service.*.*(..))"/>

        ...

    </aop:aspect>

</aop:config>
```

**@AspectJ aspect와 같은 방식으로, 스키마 기반 정의 스타일을 사용하여 선언 된 pointcuts는 join point 컨텍스트를 수집 할 수있습니다.** 예를 들어 다음 pointcut은이 객체를 join point 컨텍스트로 수집하여 advice에 전달합니다.

```markup
<aop:config>

    <aop:aspect id="myAspect" ref="aBean">

        <aop:pointcut id="businessService"
            expression="execution(* com.xyz.myapp.service.*.*(..)) &amp;&amp; this(service)"/>

        <aop:before pointcut-ref="businessService" method="monitor"/>

        ...

    </aop:aspect>

</aop:config>
```

다음과 같이 일치하는 이름의 매개 변수를 포함하여 수집 된 조인 포인트 컨텍스트를 수신하도록 advice를 선언해야합니다.&#x20;

```java
public void monitor(Object service) {
    ...
}
```

{% hint style="info" %}
Ex. 아래 예제 설명!! (참조 사이트: [http://blog.naver.com/PostView.nhn?blogId=sim4858\&logNo=220938186901\&redirect=Dlog\&widgetTypeCall=true](http://blog.naver.com/PostView.nhn?blogId=sim4858\&logNo=220938186901\&redirect=Dlog\&widgetTypeCall=true))

"logger" 라는 id를 가진 빈이 정의되어 있고,

그 logger 빈을 "myAspect"라는 id를 지정하여 공통 기능(aspect)으로 정의한다.

"selectSound"라는 id로 포인트 컷을 정의하고 있는데, 공통 기능(aspect)을 kr.ac.hansung.spring.aop 패키지 아래에 있는 모든 클래스들의 sound() 메소드에서 사용한다고 정의한다.&#x20;

정의한 공통 기능(Logger 클래스의 aboutToSound 메소드)은 포인트 컷으로 설정된 sound() 메소드들이 실행되기 '전'에 동작하도록 advice를 정의하고 있다.
{% endhint %}

![](https://3140643518-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LWdhssr0w9IqAHmA-ke%2F-LaxnlH6gB5ff1jXiG-6%2F-Laxo-LpWGjCM0NVRN83%2Fimage.png?alt=media\&token=72f07659-77d1-4bb0-bf0c-b313653401b9)

**포인트 컷 하위 표현식을 결합 할 때 `&&`는 XML 문서 내에서 어색하기 때문에 `&&`, `||`및`!`대신에 `and`, `or`및 `not`키워드를 각각 사용할 수 있습니다.** 예를 들어, 이전의 pointcut은 다음과 같이 작성할 수 있습니다.&#x20;

```markup
<aop:config>

    <aop:aspect id="myAspect" ref="aBean">

        <aop:pointcut id="businessService"
            expression="execution(* com.xyz.myapp.service..(..)) and this(service)"/>

        <aop:before pointcut-ref="businessService" method="monitor"/>

        ...
    </aop:aspect>
</aop:config>
```

**이 방법으로 정의 된 pointcut는 XML `id`에 의해 참조되며, pointcuts라는 이름의 pointcut으로 사용되어 복합 pointcuts를 형성 할 수 없다. 따라서 스키마 기반 정의 스타일의 명명 된 pointcut 지원은 @AspectJ 스타일이 제공하는 것보다 더 제한적입니다.**
