레퍼런스 Spring AOP - Pointcut

황제낙엽 2007.10.02 06:50 조회 수 : 129 추천:123

sitelink1 https://blog.naver.com/archy712/38646519 
sitelink2  
sitelink3  
extra_vars6  

 

Pointcut (교차점)

- AOP에서 Advice(충고)가 적용될 대상 객체의 적용 지점(포인트)을 정의

- 재사용이 가능하여 동일한 pointcut을 사용하여 다른 advice(총고)를 설정할 수 있다.

- 다음의 Pointcut interface를 구현해서 advice를 적용할 수 있다.

- 클래스와 매치되는 부분과 메소드의 matcher를 이용하여 union(병합) 수행을 허용
 

public interface Pointcut {

    ClassFilter getClassFilter();

    MethodMatcher getMethodMatcher();

}



ClassFilter 인터페이스

- 주어진 target 클래스들의 셋트에 pointcut(교차점)을 제한하기 위함

- matches() 메소드가 항상 true를 반환한다면 모든 target 클래스들을 매치
 

public interface ClassFilter {

    boolean matches(Class clazz);
}



MethodMatcher 인터페이스

- pointcut(교차점)이 target 클래스상에서 주어진 메소드를 매치하여 포함할 것인지 검사

- 모든 메소드 호출에 대하여 검사의 요구를 피하기 위해서 AOP 프록시를 생성할 때 이 검사를 수행

- 대부분의 Methodmatcher 들은 정적(static), isRuntime() 메소드는 false를 반환함을 의미
  => 이 경우에 3개의 인자를 가진 matches 메소드를 결코 호출하지 않는다

- 가능하다면, AOP 프록시가 생성되었을 때 AOP 프레임워크가 pointcut 평가의 결과를 캐시하도록 하기 위해
  => pointcut을 정적(static)으로 만드는게 좋다
 

public interface MethodMatcher {

    boolean matches(Method m, Class targetClass);

    boolean isRuntime();

    boolean matches(Method m, Class targetClass, Object[] args);
}


Pointcut에서의 기능

- 조합(Union)

=> pointcut이 일치하는 어떠한 일치되는 메소드가 하나라도 있는지를 의미한다.(either)

- 교차(Intersection)

=> 두 개의 pointcut이 서로 일치하는 메소드를 의미.(both)

- org.springframework.aop.support.PointCuts 클래스내 정적 메소드나 같은 패키지내 ComposablePointcut 클래스를 사용하여 이루어 질 수 있다.

- AspjectJ pointcut 표현을 사용하는 것이 좀 더 단순한 방법이다.




AspectJ 표현 pointcuts

- 2.0 이후에 Spring에 의해 사용되는 pointcut의 가장 중요한 타입은 AspectJExpressionPointcut

- AspectJ pointcut 표현 문자열을 파싱하기 위한 AspectJ 제공 라이브러리를 사용하는 pointcut



편리한 pointcut 인터페이스 구현체들

1) 정적(Static) Pointcuts

1-1) Regular expression pointcuts(정규 표현식 pointcuts)

- Perl5RegexpMethodPointcut

=> Perl5 정규표현식 문법을 사용하는 일반적인 정규표현식 pointcut
=> 정규표현식을 일치시키기 위한 Jakarta ORO에 의존

예제)
 

                               class="org.springframework.aop.support.Perl5RegexpMethodPointcut">
   
       
            .*set.*
            .*absquatulate
       

   



- JdkRegexpMethodPointcut

=> JDK 1.4 이상에서 지원되는 정규 표현식을 사용

- RegexpMethodPointcutAdvisor 클래스

=> 특정 advice(인터셉터, before advice, throws advice)의 참조로 하여 사용할 수 있는 advisor
=> 내부적으로 메소드의 패턴을 명시하여 pointcut 기능을 구현

예제)
 

    class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
   
       
   

   
       
            .*set.*
            .*absquatulate
       

   


1-2) Attribute-driven(속성지향) pointcut

=> 메타데이터-지향 pointcut
=> 소스-레벨의 메타데이터인 메타데이터 속성의 값을 사용


2) 동적(Dynamic) pointcuts

=> 정적인(static) pointcut보다 평가하는데 좀 더 가치가 있다.
=> 정적인(sttaic) 정보만큼 메소드 인자를 고려. (모든 메소드 호출시 평가되어야만 한다)
=> 결과는 인자가 다양한 만큼 캐시될 수 없다.

2-1) 제어 흐름(Control flow) pointcuts

- 다소 덜 강력하지만 개념적으로 AspectJ cflow pointcuts와 유사
- 다른 동적인 pointcut보다 런타임시 평가하는 것이 명백히 비용이 비싸다.(Java 1.4에서 다른 동적인 pointcut의 약 5배)



Pointcut 슈퍼 클래스

- 자체적인 pointcut을 구현하기 위해 제공
- 정적인 pointcut이 가장 유용하기 때문에 대부분 StaticMethodMatcherPointcut의 하위 클래스를 이용
- 하나의 추상 메소드를 구현하는 것을 요구
 

class TestStaticPointcut extends StaticMethodMatcherPointcut {

    public boolean matches(Method m, Class targetClass) {
        // return true if custom criteria match
    }
}

 

번호 제목 글쓴이 날짜 조회 수
공지 (확인전) [2021.03.12] Eclipse에서 Spring Boot로 JSP사용하기(Gradle) 황제낙엽 2023.12.23 0
공지 [작성중/인프런] 스프링부트 시큐리티 & JWT 강의 황제낙엽 2023.12.20 6
63 [Spring3.1.1][4] RestTemplate 한글 문제 황제낙엽 2018.08.08 89
62 [Spring3.1.1][3] RestTemplate 한글 문제 황제낙엽 2018.08.08 237
61 [Spring3.1.1][2] RestTemplate 한글 문제 황제낙엽 2018.08.08 113
60 [Spring3.1.1][1] RestTemplate 한글 문제 황제낙엽 2018.08.08 683
59 [Spring3.1.1] Eclipse 에 Spring Framework 환경 구축하기 file 황제낙엽 2018.08.08 90
58 웹 개발의 변화와 스프링 황제낙엽 2008.03.19 132
57 Spring MVC 가 아닌 환경에서 Spring Pojo Bean 사용하기 (Pure Java App 또는 Servlet App) 황제낙엽 2009.10.22 233
56 NamedParameterJdbcDaoSupport 몇가지 장점 황제낙엽 2007.11.27 101
55 프로젝트의 기본이 되는 Logging, Exception 처리 전략 황제낙엽 2007.01.30 85
» Spring AOP - Pointcut 황제낙엽 2007.10.02 129
53 <spring:checkbox> tip! 황제낙엽 2007.10.01 378
52 SimpleFormController 정리 황제낙엽 2007.09.19 206
51 Spring의 Exception 황제낙엽 2007.09.17 194
50 스프링 2와 JPA 시작하기 (한글) 황제낙엽 2007.08.27 142
49 스프링 개발팁 황제낙엽 2007.08.17 223
48 유효성체크 (org.springframework.validation.Validator) 황제낙엽 2007.08.17 129
47 Spring 2.0의 XML확장기능 (3) 황제낙엽 2007.08.15 32
46 Spring 2.0의 XML확장기능 (2) 황제낙엽 2007.08.15 73
45 Spring 2.0의 XML확장기능 (1) 황제낙엽 2007.08.15 33
44 CSS와 XHTML을 사용한 효율적인 View 개발 전략 황제낙엽 2007.01.30 104