본문 바로가기
Everyday Study

2024.09.02(월) { 인라인 포인트컷, args(제한&가져오기),

by xogns93 2024. 9. 2.

인라인(Inlining) 포인트컷

 

인라인 포인트컷은 포인트컷 표현식을 직접 어드바이스 정의에 포함하는 방식입니다. 인라인으로 정의하면, 별도의 포인트컷 메서드를 만들지 않고 어드바이스와 함께 포인트컷을 정의할 수 있습니다.

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LoggingAspect {

    // 인라인 포인트컷을 사용한 Before 어드바이스
    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethod() {
        System.out.println("Method is about to be called");
    }
}

 

 

포인트컷을 메서드로 정의하는 경우(비인라인):

반복해서 사용할 포인트컷 표현식을 별도의 메서드로 정의할 수도 있습니다.

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LoggingAspect {

    // 포인트컷 메서드 정의
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() {}

    // 포인트컷 메서드를 사용하는 어드바이스
    @Before("serviceMethods()")
    public void logBeforeMethod() {
        System.out.println("Method is about to be called");
    }
}

비인라인 포인트컷: 포인트컷을 재사용할 수 있도록 serviceMethods()라는 이름의 메서드로 정의했습니다.

 

 

결론

  • 인라인 포인트컷: 어드바이스 정의 시 포인트컷을 직접 포함시켜 간결하게 사용합니다. 재사용 가능성이 낮은 경우 유용합니다.
  • 비인라인 포인트컷: 포인트컷을 메서드로 정의해 여러 어드바이스에서 재사용할 수 있도록 합니다.

두 가지 방법 모두 상황에 따라 적절히 활용할 수 있으며, 인라인 포인트컷은 간단한 경우 유용하고, 포인트컷을 재사용해야 할 때는 메서드로 정의하는 것이 좋습니다.

 


args 

args는 Spring AOP와 AspectJ에서 포인트컷(Pointcut) 표현식의 일부로 사용되며, 주로 메서드의 매개변수(인자)에 대해 두 가지 주요 기능을 수행합니다: 제한 가져오기입니다.

 

1. 제한 (Restricting by Argument Type)

  • args를 사용하여 특정 타입의 매개변수를 가지는 메서드만을 포인트컷으로 지정할 수 있습니다.
  • 이 기능은 특정 매개변수 타입의 메서드에만 어드바이스를 적용하고자 할 때 유용합니다.

예시:

@Aspect
public class LoggingAspect {
    
    // 첫 번째 인자가 String인 모든 메서드에 어드바이스 적용
    @Before("execution(* com.example..*(..)) && args(firstArg,..)")
    public void logStringArguments(String firstArg) {
        System.out.println("Method called with argument: " + firstArg);
    }
}

 

2. 가져오기 (Capturing Argument Values)

  • args를 사용하여 메서드에 전달된 인자 값을 어드바이스 메서드에서 가져와 사용할 수 있습니다.
  • 이를 통해 어드바이스에서 메서드의 인자 값을 기반으로 추가 로직을 구현할 수 있습니다.

예시:

@Aspect
public class AuditAspect {
    
    // 두 번째 인자가 Integer인 메서드의 호출을 감시
    @AfterReturning(pointcut = "execution(* com.example..*(..)) && args(..,secondArg)", returning = "result")
    public void auditMethodCall(Object result, Integer secondArg) {
        System.out.println("Method returned: " + result + ", with second argument: " + secondArg);
    }
}

설명:

  • args(..,secondArg)는 두 번째 인자가 Integer 타입인 메서드의 포인트컷을 정의하며, 이 값을 어드바이스에서 가져올 수 있습니다.
  • 어드바이스 메서드의 매개변수로 secondArg 값을 받아 이를 사용합니다.

요약

  • 제한 (Restricting): args는 특정 타입의 인자를 가진 메서드를 포인트컷으로 제한하는 기능을 합니다. 예를 들어, 특정 타입의 인자를 받는 메서드에만 어드바이스를 적용할 수 있습니다.
  • 가져오기 (Capturing): args를 통해 메서드 호출 시 전달된 인자 값을 어드바이스에서 캡처하여, 그 값을 바탕으로 추가적인 처리를 할 수 있습니다.

이 두 가지 기능을 활용하면 AOP를 통해 특정 인자 조건을 만족하는 메서드에만 어드바이스를 적용하고, 메서드 인자 값을 기반으로 맞춤형 로직을 구현할 수 있습니다.

 


:: 연산자 (메서드 참조)

Java의 :: 연산자는 **메서드 참조(Method Reference)**를 나타내는 연산자입니다. 메서드 참조는 자바 8에서 도입된 기능으로, 람다 표현식을 간단하게 표현하거나 재사용 가능한 방식으로 정의된 메서드를 전달할 때 사용됩니다.

 

메서드 참조의 기본 형태는 다음과 같습니다:

  • ClassName::methodName: 클래스의 정적 메서드를 참조
  • instance::methodName: 객체의 인스턴스 메서드를 참조
  • ClassName::new: 생성자 참조 (객체 생성)

 

예시 비교: 람다 표현식 vs 메서드 참조

람다 표현식

Arrays.asList("a", "b", "c").forEach(s -> System.out.println(s));

 

메서드 참조

Arrays.asList("a", "b", "c").forEach(System.out::println);

 

두 코드 모두 동일한 작업을 수행하지만, 메서드 참조를 사용한 두 번째 코드는 더 간결하고 직관적입니다.