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 포인트컷] within 본문

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

[스프링AOP 포인트컷] within

Seung__ 2022. 1. 6. 23:04

within 지시자는 특정 타입 내의 조인 포인트에 대한 매칭을 제한한다. 

쉽게 이야기해서 해당 타입이 매칭되면 그 안의 메서드(조인 포인트)들이 자동으로 매칭된다.
문법은 단순한데 execution 에서 타입 부분만 사용한다고 보면 된다.

 

 

1. Test


@Slf4j
public class WithinTest {

    AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
    Method helloMethod;

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

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

    @Test //aop및 하위 패키지의 모튼 타입.
    void withinSubPackage(){
        pointcut.setExpression("within(hello.aop..*)");
        assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
    }

}
  • 그런데 within 사용시 주의해야 할 점이 있다. 
  • 표현식에 부모 타입을 지정하면 안된다는 점이다.
  • 정확하게 타입이 맞아야 한다. 
  • 이 부분에서 execution 과 차이가 난다.

 

2. Test2


    @Test
    @DisplayName("타겟의 타입에만 직접 적용, 인터페이스를 선정하면 안된다.")
    void withinSuperTypeFalse(){
        pointcut.setExpression("within(hello.aop.member.MemberService)");
        assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isFalse();
    }

    @Test
    @DisplayName("execution은 타입기반 인터페이스 선정 가능.")
    void executionSuperTypeTrue(){
        pointcut.setExpression("execution(* hello.aop.member.MemberService.*(..))");
        assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
    }

부모 타입(여기서는 MemberService 인터페이스) 지정시 within 은 실패하고, execution 은 성공하는
것을 확인할 수 있다.

 

 

....타입을 딱 하나만 지정해야해서.. 잘 사용 안함..

 

3. GitHub: 220106 Within


 

GitHub - bsh6463/SpringAOP

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

github.com

 

Comments