"com.xyz.trading..*" vs "com.xyz.trading.*.*"

2025. 6. 11. 16:45Spring Framework/Aspect Oriented Programming with Spring

@Pointcut("within(com.xyz.trading..*)")

 

이 포인트컷 표현식은에서 "com.xyz.trading..*"패키지 이름을 의미합니다. 구체적으로 설명드리면:

🔹 "within(com.xyz.trading..*)" 의미 분석

  • within(...):
    • 해당 타입이 속한 클래스의 전체 이름(qualified name)이 지정한 패턴에 속하는 경우에만 적용됩니다.
    • 즉, 클래스가 특정 패키지에 존재할 때 포인트컷이 매칭됩니다.
  • "com.xyz.trading..*":
    • com.xyz.trading은 패키지 이름입니다.
    • ..하위 패키지까지 모두 포함한다는 의미입니다.
    • *모든 클래스를 의미합니다.

따라서, 이 포인트컷은 다음에 해당하는 모든 클래스에 정의된 메서드 실행 시점을 매칭합니다:

com.xyz.trading
com.xyz.trading.order
com.xyz.trading.order.impl,
등 trading 패키지와 그 하위 패키지에 있는 모든 클래스의 메서드들

 

🔸 예시

다음 클래스들은 모두 매칭됩니다:

package com.xyz.trading;
public class TradeService { ... }

package com.xyz.trading.order;
public class OrderService { ... }

package com.xyz.trading.order.impl;
public class OrderServiceImpl { ... }

 

🧠 참고

  • within()클래스 자체가 특정 패키지에 속해 있어야 적용됩니다.
  • 만약 메서드 호출(call) 기준으로 포인트컷을 정의하고 싶다면, execution()을 사용해야 합니다.

 

@Pointcut("execution(* com.xyz.trading..*.*(..))")

이 포인트컷은 해당 패키지에 존재하는 클래스의 메서드 호출을 대상으로 합니다.

 

"com.xyz.trading.*.*"

  • *는 패키지나 클래스 이름에서 단일 요소를 의미합니다. (한 단계만 가능)
  • "com.xyz.trading.*.*"는 다음과 같은 구조를 정확히 요구합니다:
com.xyz.trading.[1단계 하위 패키지].[그 하위에 존재하는 클래스]

 

예를 들어 다음은 포함됩니다:

com.xyz.trading.order.OrderService    // 가능 (order → OrderService)
com.xyz.trading.user.UserService      // 가능 (user → UserService)

 

다음은 포함되지 않습니다:

com.xyz.trading.OrderService          // ❌ 한 단계 부족
com.xyz.trading.order.impl.Service    // ❌ 세 단계 이상

"com.xyz.trading.*.*"는 정확히 2단계의 하위 구성 요소가 있는 패키지 구조만을 포함합니다.

 

📊 요약 비교

표현식 의미 포함되는 범위
com.xyz.trading..* trading 및 모든 하위 패키지의 모든 클래스 깊이에 상관없이 전부 포함
com.xyz.trading.*.* 정확히 두 단계 하위 패키지 및 그 안의 클래스 trading.X.Y 구조만 포함

 

🧪 예시 비교

클래스 경로 com.xyz.trading..* com.xyz.trading.*.*
com.xyz.trading.Foo
com.xyz.trading.one.Foo
com.xyz.trading.one.two.Foo
com.xyz.other.Foo