Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[스프링AOP 포인트컷] execution - 1 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

[스프링AOP 포인트컷] execution - 1

Seung__ 2022. 1. 6. 21:38

1. execution 문법


execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?namepattern(param-pattern)
			throws-pattern?)

execution(접근제어자? 반환타입 선언타입?메서드이름(파라미터) 예외?)
  • 메소드 실행 조인 포인트를 매칭한다.
  • ?는 생략할 수 있다.
  • * 같은 패턴을 지정할 수 있다.

 

 

2. 가장 정확한 포인트컷


먼저 MemberServiceImpl.hello(String) 메서드와 가장 정확하게 모든 내용이 매칭되는 표현식이다.

@Slf4j
public class ExecutionTest {

    AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
    Method helloMethod;

    @BeforeEach
    public void init() throws NoSuchMethodException {
        helloMethod = MemberServiceImpl.class.getMethod("hello", String.class);
    }

    @Test
    void printMethod(){
        log.info("helloMethod={}", helloMethod);
    }

    @Test
    void exactMatch(){
        pointcut.setExpression("execution(public String hello.aop.member.MemberServiceImpl.hello(String))");
        Assertions.assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
    }
}
  • AspectJExpressionPointcut 에 pointcut.setExpression 을 통해서 포인트컷 표현식을 적용할 수 있다.
  • pointcut.matches(메서드, 대상 클래스) 를 실행하면 지정한 포인트컷 표현식의 매칭 여부를 true ,false 로 반환한다.
  • 매칭 조건
    • execution(접근제어자? 반환타입 선언타입?메서드이름(파라미터) 예외?)
    • 접근제어자?: public
    • 반환타입: String
    • 선언타입?: hello.aop.member.MemberServiceImpl
    • 메서드이름: hello
    • 파라미터: (String)
    • 예외?: 생략
  • MemberServiceImpl.hello(String) 메서드와 포인트컷 표현식의 모든 내용이 정확하게 일치한다.
    따라서 true 를 반환한다.

 

 

 

3. 가장 많이 생략한 포인트컷


@Test
void allMatch(){
    pointcut.setExpression("execution(* *(..))");
    assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
  • 매칭 조건
    • 접근제어자?: 생략
    • 반환타입: *
    • 선언타입?: 생략
    • 메서드이름: *
    • 파라미터: (..)
    • 예외?: 없음
  • * 은 아무 값이 들어와도 된다는 뜻이다.
  • 파라미터에서 .. 은 파라미터의 타입과 파라미터 수가 상관없다는 뜻이다. ( 0..* )

 

 

 

4. 메서드 이름 매칭


    @Test
    void nameMatch(){
        pointcut.setExpression("execution(* hello(..))");
        assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
    }

    @Test
    void nameMatchStar1(){
        pointcut.setExpression("execution(* hel*(..))");
        assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
    }

    @Test
    void nameMatchStar2(){
        pointcut.setExpression("execution(* *el*(..))");
        assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
    }

    @Test
    void nameMatchFalse(){
        pointcut.setExpression("execution(* nono(..))");
        assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isFalse();
    }

메서드 이름 앞 뒤에 * 을 사용해서 매칭할 수 있다.

 

 

 

 

5. 패키지매칭


void packageExactMatch1(){
    pointcut.setExpression("execution(* hello.aop.member.MemberServiceImpl.hello(..))");
    assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}

@Test
void packageExactMatch2(){
    pointcut.setExpression("execution(* hello.aop.member.*.*(..))");
    assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}

@Test //aop패키지에 MemberServiceImpl이 없어서 false
void packageMatchFalse1(){
    pointcut.setExpression("execution(* hello.aop.*.*.*(..))");
    assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isFalse();
}

@Test //member 포함 하위 패키지
void packageMatchSubPackage1(){
    pointcut.setExpression("execution(* hello.aop.member..*.*(..))");
    assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}

@Test //aop포함 하위 패키지
void packageMatchSubPackage2(){
    pointcut.setExpression("execution(* hello.aop..*.*(..))");
    assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
  • hello.aop.member.*(1).*(2)
    • (1): 타입
    • (2): 메서드 이름
  • 패키지에서 . , .. 의 차이를 이해해야 한다.
    • : 정확하게 해당 위치의 패키지
    • .. : 해당 위치의 패키지와 그 하위 패키지도 포함

 

6.GitHub: 220106 execution1


 

GitHub - bsh6463/SpringAOP

Contribute to bsh6463/SpringAOP development by creating an account on GitHub.

github.com

 

Comments