SpringBoot 를 배워보자

AspectJ Pointcut Expression Language

_Blue_Sky_ 2024. 11. 17. 12:38
728x90

AspectJ Pointcut Expression Language는 AspectJ에서 사용되는 강력한 도구로, 특정 시점이나 조건을 기준으로 프로그램의 실행 흐름에 끼어들기 위한 규칙을 정의하는 데 사용됩니다. 이 표현식 언어는 AOP(Aspect-Oriented Programming)의 핵심 요소 중 하나로, 개발자가 코드의 특정 부분(예: 메서드 호출, 객체 초기화 등)을 선택적으로 가로채고 로직을 삽입할 수 있도록 합니다.

주요 개념

  1. Join Point (조인 포인트)
    • 프로그램 실행 중의 특정 지점, 예를 들어 메서드 호출, 객체 생성, 예외 처리 등.
    • AspectJ는 다양한 종류의 조인 포인트를 지원합니다.
  2. Pointcut (포인트컷)
    • 조인 포인트를 선택하는 규칙을 정의하는 표현식.
    • 포인트컷은 프로그램의 어떤 부분에서 Advice(추가 동작)를 적용할지 결정합니다.
  3. Advice (어드바이스)
    • 포인트컷에 의해 선택된 조인 포인트에서 실행될 동작(코드).
728x90

주요 표현식

AspectJ의 포인트컷 표현식은 직관적이면서도 정교하게 실행 흐름을 선택할 수 있도록 설계되어 있습니다.

  1. Execution
    • 특정 메서드 실행 지점을 선택.
      execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
    • 예제*:
      execution(public * com.example..*(..))
    • com.example 패키지의 모든 클래스에서 public 메서드를 선택.
  2. Call
    • 메서드 호출 지점을 선택.
      call(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
    • 예제*:
      call(* com.example.Service.*(..))
    • com.example.Service 클래스의 모든 메서드 호출을 선택.
  3. Within
    • 특정 클래스 또는 패키지 내의 모든 조인 포인트를 선택.
      within(type-pattern)
    • 예제*:
      within(com.example..*)
    • com.example 패키지 및 하위 패키지에 속한 모든 클래스에서 동작.
  4. This / Target
    • this: 특정 객체 인스턴스에서 실행되는 조인 포인트.
    • target: 실행되는 조인 포인트의 대상 객체.
      this(type-pattern)
      target(type-pattern)
    • 예제*:
      this(com.example.MyService)
      target(com.example.MyService)
  5. Args
    • 조인 포인트의 메서드에 전달된 인수의 타입을 기반으로 선택.
      args(argument-pattern)
    • 예제*:
      args(String, ..)
    • 첫 번째 인자가 String이고 나머지 인자의 타입은 상관없는 모든 메서드.
  6. Annotation
    • 특정 어노테이션이 적용된 메서드, 클래스 등을 선택.
      @annotation(annotation-type)
    • 예제*:
      @annotation(javax.transaction.Transactional)
    • @Transactional 어노테이션이 붙은 메서드를 선택.
728x90

결합 표현식

다양한 Pointcut을 조합하여 복잡한 조건을 정의할 수 있습니다.

  • AND (&&): 모든 조건을 만족.
  • OR (||): 하나라도 만족.
  • NOT (!): 부정.

예제:

execution(* com.example..*(..)) && @annotation(org.springframework.transaction.annotation.Transactional)
  • com.example 패키지 내의 메서드 중 @Transactional 어노테이션이 있는 메서드.

사용 예

@Aspect
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Method called: " + joinPoint.getSignature());
    }
}
  • com.example.service 패키지의 모든 메서드가 실행되기 전에 로그를 출력.

장점

  • 코드 중복 감소: 핵심 로직과 부가 기능(로깅, 트랜잭션 등)을 분리 가능.
  • 가독성 향상: 프로그램의 구조가 더 명확해짐.
  • 유연성: 다양한 조건 조합으로 실행 흐름을 정교하게 제어.

요약

AspectJ Pointcut Expression Language는 프로그램의 특정 동작을 정밀하게 제어할 수 있는 강력한 도구로, 유지보수성과 재사용성을 극대화할 수 있습니다. AOP를 활용한 모듈화된 코드 작성에 핵심적인 역할을 합니다.

728x90