(0)
사용할 예제 코드
package spring.pack;
public interface TargetInterface {
void hello();
void hello(String a);
int minus(int a, int b);
int plus(int a, int b);
}
package spring.pack;
public class Target implements TargetInterface {
@Override
public void hello() {}
@Override
public void hello(String a) {}
@Override
public int minus(int a, int b) { return 0; }
@Override
public int plus(int a, int b) { return 0; }
public void method() {}
}
package spring.pack;
public class Bean {
public void method() throws RuntimeException {}
}
(1)
만약 Target 클래스의 hello(String a) 메서드를 지정하고 싶다면 다음과같이 표현식을 작성하면 된다.
괄호 안의 내용을 딱 보면 뭔지 알것같을 것이다. 메소드 시그니처.
execution(public void spring.pack.Target.hello(String a))
(2)
접근제한자는 생략할 수 있다. 생략이 가능하다는 건 이 항목에 대해서는 조건을 부여하지 않는다는 의미다.
execution(void spring.pack.Target.hello(String a))
(3)
리턴타입은 생략할 수 없다. 모든 리턴타입에 대해 상관 없게 하고싶으면 에스터리스크(*)을 사용하면 된다.
execution(public * spring.pack.Target.hello(String a))
execution(* spring.pack.Target.hello(String a))
(4)
spring.pack.Target. 이 부분은 생략 가능하다. 생략하면 모든 패키지의 모든 클래스에 대해 허용하겠다는 뜻이다.
execution(* hello(String a))
(5)
메서드 이름은 생략할 수 없다. Target 클래스의 모든 메서드를 포인트컷으로 지정하고 싶으면 다음과 같이 쓰면 된다.
execution(* spring.pack.Target.*(String a))
다음과 같이 메서드 이름 일부를 가지고도 지정 가능하다.
execution(* spring.pack.Target.*llo(String a))
(6)
메서드의 파라미터가 갯수도, 타입도 상관 없다면 다음과 같이 쩜쩜(..) 을 쓰면 된다.
execution(* spring.pack.Target.m*(..))
파라미터 갯수는 상관 있는데 타입은 상관 없다면 다음과 같이 쓴다.
(타입이 상관 없는 파라미터에 * 표시)
execution(* spring.pack.Target.minus(*,*))
(7)
클래스 부분을 좀 더 자세히 살펴보자 (spring.pack.Target 이부분)
spring.pack 패키지에 있는 모든 클래스에 있는 minus 메서드에 대해 지정하고싶으면 다음과 같이 쓴다.
execution(* spring.pack.*.minus(*,*))
spring 패키지 하위 어딘가에 있는 Target 클래스의 minus 메서드에 대해 지정하고싶으면 다음과 같이 쓴다.
".."은 모든 하위 패키지를 의미한다.
execution(* spring..Target.minus(*,*))
그런데 맨 처음 패키지와 맨 마지막의 클래스이름(타입이름)은 ".." 을 이용해서 축약할 수 없다.
그러므로 맨 처음 패키지를 모든 패키지로 하고싶거나, 클래스를 모든 클래스로 하고싶으면 그 자리에 에스터리스크(*)을 쓰면 된다.
아래 두 표현은 같은 의미이다.
execution(* *..*.minus(*,*))
execution(* minus(*,*))
(8)
다음과 같이 작성하면, TargetInterface 에 정의되어있는 메소드만 포인트컷으로 적용된다. 따라서 TargetInterface 에는 없는 메서드인 public void spring.package.Target.method() 는 제외된다.
execution(* *..TargetInterface.*(..))
(9)
execution() 은 메소드의 시그니처를 비교하는 방식이다. 이 외에도 몇 가지 표현식 스타일들이 있다.
예를들면 스프링에서 사용될 때 Bean 의 이름으로 비교하는 bean() 이 있다. bean(*Service)라고 쓰면 이름이 Service로 끝나는 모든 빈을 선택한다.
'2021 Spring Study' 카테고리의 다른 글
Spring 14. DB 연동 (2) - JDBC 프로그래밍과 JdbcTemplate (0) | 2021.01.21 |
---|---|
Spring 13. DB 연동 (1) - JDBC 프로그래밍부터 알고 가자 (0) | 2021.01.20 |
Spring 11. AOP 프로그래밍 (2) - 스프링 AOP 구현 (0) | 2021.01.13 |
Spring 10. AOP 프로그래밍 (1) - 프록시와 AOP (0) | 2021.01.13 |
Spring 9. Bean 라이프사이클 미션 (0) | 2021.01.08 |