Spring AOP(old) Pointcut Implementation
이전에 살펴 봤듯이 포인트컷에는 두 가지 종류가 있습니다.
정적 포인트컷
- 직접 만들고 싶다면 StaticMethodMatcherPointcut 클래스를 상속하여 isMatch 메소드를 구현.
- NameMatchMethodPointcut :: NameMatchMethodPointcutAdvisor가 이에 상응하는 Advisor입니다. 클래스 이름에서 알 수 있듯이 메소드 이름으로 해당 포인트컷을 지정합니다.
위 두개의 setter를 사용하여 값을 configuration metadata 상에서 injection하면 됩니다. 위에껀 매칭되는 메소드 이름 설정이 하나일때 사용하고 아래는 여러개 일때 사용합니다.
매칭되는 메소드 이름 설정은 메소드 이름 앞이나 뒤에 *을 사용할 수 있습니다. 예) order* 은 oder로 시작하는 모든 메소드.
Sta*Meth* 이런식으로 *을 메소드 이름 중간에 넣으면 못 찾나? - 이건 나중에 코딩해보면서 확인해봐야겠습니다.
- Perl5RegexpMethodPointcut :: RegexpMethodPointcutAdvisor가 정규식을 사용한 포인트 컷을 받아 줄 수 있으며 JDK1.4 이상 부터는 기본으로 JdkRegexpMethodPointcut을 사용하는데 명시적으로 Perl5RegexpMethodPointcut을 사용할 수 도 있습니다.
NameMatchMethodPointcut과 다른 점은 무엇인가? - 정규 표현식을 사용한다는 것이고 메소드 이름으로만 포인트컷을 나타내는 것이 아니라 전체 패키지 경로와 클래스 이름까지 포함하여 나타내야 합니다.
Perl5RegexpMethodPointcut 과 JdkRegexpMethodPointcut 의 차이는 뭔가? - 둘 다 AbstractRegexpMethodPointcut 클래스를 상속한 자식 클래스들이며 정규 표현식으로 매칭되는 포인트컷을 정의할 때 사용합니다. Perl5RegexpMethodPointcut는 Perl5의 정규 표현식을 사용하며 Jakarta ORO
regular expression library가 필요합니다. 측 추가적인 jar파일이 필요한거죠. 하지만 JdkRegexpMethodPointcut 는 JDK 1.4 정규표현식을 사용하며 추가적인 jar파일은 필요 없고 jdk버전이 1.4이상일 때 사용가능 합니다.
정규 표현식은 어떻게 쓰는거지? - SIA에 잘 나와있군요. 쩜(.), 별(*), 더하기(+), 역슬래쉬(\) 네가지를 사용합니다.
쩜(.)은 어떤 문자든 딱 한 글자를 나타냅니다.
별(*)은 * 전에 있는 문자가 0 ~ 여러개 있을 수 있슴을 나타냅니다.
더하기(+)는 + 전에 있는 문자가 1 ~ 여러개 있을 수 있슴을 나타냅니다.
역슬래쉬(\)는 \ 다음에 오는 문자가 있어야 한다는 것을 나타냅니다.
.*set.* :: set이라는 글자가 들어있는 모든 메소드
.*get.+By.+ :: get뭐시기By모시기 라는 형태의 글자가 들어있는 모든 메소드
거의 암호 수준이군요. 쩜별(.*) 은 쩜이 0~여러개 있을 수 있다는 거니까 그말은 다시 어떤 문자든지 여러개 있을 수 있다는 거니까 저렇게 되는거죠.
동적 포인트컷
- MethodMatcher를 구현하고 isRuntime() 메소드가 true를 리턴하게 합니다. 실행 중에 포인트컷에 해당하는 모든 메소드를 만날때 마다 matches(Method, Class, Object[]) 가 호출되기 때문에 상당한 성능 저하[footnote]API를 보니 "Note that evaluating such pointcuts is 10-15 times slower than evaluating
normal pointcuts, but they are useful in some cases." 이렇게 나와있네요.[/footnote]가 발생합니다.
- ControlFlowPointcut :: 이 포인트컷을 위한 Advisor가 따로 존재하진 않고 이전에 찾아냈던 DefaultPointcutAdivisor로 Pointcut 빈과 Advice 빈을 묶어줍니다. AspectJ의 cflow 포인트 컷에 해당하는 일을 합니다. 현재 동작중인 쓰레드 스택에서 특정한 클래스나 메소드가 찾아 졌을 경우에만 true를 리턴하도록 설정이 가능합니다.
이 생성자들을 사용하여 constuctor injection으로 쓰레드의 스택에서 어떤 타입의 어떤 메소드 이름의 메소드가 호출될 지점을 포인트컷으로 지정할 수 있습니다.