# PointCut 표현식 문법
- AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용하여 작성한다.
- 포인트컷 지시자 중에서 가장 대표적으로 사용되는 것은 execution() 이다.
- execution() 지시자를 사용한 포인트컷 표현식의 문법구조는 다음과 같다.
execution([접근제한자 패턴] 타입패턴[타입패턴.] 이름패턴(타입패턴 | "..", ...) [throws 예외패턴])
1) [접근제한자 패턴] : public, private 와 같은 접근제한자, 생략가능
2) 타입패턴[타입패턴.] : 리턴값의 타입 패턴
3) 이름패턴(타입패턴 | "..", ...) : 메서드 이름 타입패턴, 파라미터의 타입 패턴을 순서대로 넣을 수 있다.
와일드카드를 이용해 파라미터 개수에 상관없는 패턴을 만들 수 있다.
4) throws 예외패턴 : 예외이름패턴
ex. PointCut 표현식 예시
execution(* aspect.trace.demo.*.*(..))
1) * : any return type
2) aspect.trace.demo : package
3) * : class
4) * : method
5) (..) : any type and number of arguments
ex1. execution(* hello(..))
=> hello 라는 이름을 가진 메서드를 선정하는 것이다. 파라미터는 모든 종류를 다 허용한다.
ex2. execution(* hello)
=> 파라미터 패턴이 ()로 되어있으니 hello 메서드 중에서 파라미터가 없는 것만 선택한다.
ex3. execution(* myspring.user.service.UserServiceImpl.*(..))
=> myspring.user.service.UserServiceImp 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를
선택한다.
ex4. execution(* myspring.user.service.*.*(..))
=> myspring.user.service 패키지의 모든 클래스에 적용된다.
하지만 서브패키지의 클래스는 포함되지 않는다.
ex5. execution(* myspring.user.service..*.*(..))
=> myspring.user.service 패키지의 모든 클래스에 적용된다.
그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함된다.
ex6. execution(* *..Target.*(..))
=> 패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용된다.
다른 패키지에 같이 이름의 클래스가 있어도 적용이 된다는 점에 유의해야함
출처: www.youtube.com/watch?v=eLJBXb9QO4o&list=PL9mhQYIlKEhfYqQ-UkO2pe2suSx9IoFT2&index=16