인라인(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);
두 코드 모두 동일한 작업을 수행하지만, 메서드 참조를 사용한 두 번째 코드는 더 간결하고 직관적입니다.
'Study Memo' 카테고리의 다른 글
2024.09.04(수) { 네임스페이스, 자바빈의 기본속성 } (0) | 2024.09.04 |
---|---|
2024.09.03(화) { 원자성, 바인딩, 모듈, perthis, 자바 에이전트 } (3) | 2024.09.03 |
2024.08.30(금) { PCD-this와target차이, proceed() } (0) | 2024.08.30 |
2024.08.29(목) { 위임 한다는것, AspectJ의 아규먼트&파라미터, PCD, 디지그네이터 } (0) | 2024.08.29 |
2024.08.28(수) { Aspect 적용 시점, 메서드 매처(Method Matcher)와 클래스 필터 } (0) | 2024.08.28 |