Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그리디
- db
- Greedy
- JPQL
- 인프런
- jpa
- Exception
- pointcut
- Spring Boot
- http
- 알고리즘
- SpringBoot
- 스프링 핵심 기능
- Thymeleaf
- Android
- java
- QueryDSL
- transaction
- kotlin
- 자바
- springdatajpa
- 스프링
- AOP
- 백준
- Proxy
- 김영한
- JDBC
- Servlet
- spring
- 스프링 핵심 원리
Archives
- Today
- Total
개발자되기 프로젝트
[스프링AOP 포인트컷] execution - 1 본문
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
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
[스프링AOP 포인트컷] within (0) | 2022.01.06 |
---|---|
[스프링AOP 포인트컷] execution - 2 (0) | 2022.01.06 |
[스프링AOP 포인트컷] 예제코드 (0) | 2022.01.05 |
[스프링AOP 포인트컷] Pointcut 지시자 (0) | 2022.01.05 |
[스프링AOP] Advice 종류 (0) | 2022.01.05 |
Comments