JoinPoint는 AOP에서 실행되는 메소드의 정보를 담고 있는 객체로, 두 가지 주요 타입이 있습니다:
JoinPoint ProceedingJoinPoint 이들 각각의 특징과 사용 방법에 대해 예제와 함께 설명드리겠습니다.
JoinPointJoinPoint는 AOP에서 메소드 실행 정보를 제공하는 객체입니다. 특히 @Before, @After, @AfterReturning, @AfterThrowing 등의 어노테이션에서 사용됩니다. ProceedingJoinPoint와 달리 메소드 실행을 제어하지 않으며, 메소드 실행 전후의 정보를 확인하는 데 주로 사용됩니다.
@Before)import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logMethodInfo(JoinPoint joinPoint) {
// 클래스명 + 메소드명
String className = joinPoint.getSignature().getDeclaringTypeName(); // 클래스명
String methodName = joinPoint.getSignature().getName(); // 메소드명
// 매개변수들
Object[] args = joinPoint.getArgs(); // 매개변수들
StringBuilder params = new StringBuilder();
for (Object arg : args) {
params.append(arg).append(" ");
}
// 출력
System.out.println("패키지명 + 클래스명: " + className);
System.out.println("메소드명: " + methodName);
System.out.println("매개변수들: " + params.toString());
}
}
joinPoint.getSignature().getDeclaringTypeName(): 클래스의 전체 이름 (패키지명 포함)joinPoint.getSignature().getName(): 메소드명joinPoint.getArgs(): 메소드 매개변수들을 배열로 가져옵니다.패키지명 + 클래스명: com.example.service.UserService
메소드명: getUserById
매개변수들: 1234 JohnDoe
JoinPoint는 메소드 실행 전의 정보를 기록하는 데 유용합니다.
ProceedingJoinPointProceedingJoinPoint는 JoinPoint의 확장된 형태로, 메소드 실행을 제어할 수 있는 기능을 제공합니다. @Around 어노테이션에서만 사용할 수 있으며, 메소드 실행을 수행하거나 중단할 수 있습니다.
@Around)import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logMethodInfo(ProceedingJoinPoint joinPoint) throws Throwable {
// 클래스명 + 메소드명
String className = joinPoint.getSignature().getDeclaringTypeName(); // 클래스명
String methodName = joinPoint.getSignature().getName(); // 메소드명
// 매개변수들
Object[] args = joinPoint.getArgs(); // 매개변수들
StringBuilder params = new StringBuilder();
for (Object arg : args) {
params.append(arg).append(" ");
}
// 출력
System.out.println("패키지명 + 클래스명: " + className);
System.out.println("메소드명: " + methodName);
System.out.println("매개변수들: " + params.toString());
// 실제 메소드 실행
Object result = joinPoint.proceed(); // 메소드 실행
// 메소드 실행 후 결과
System.out.println("메소드 실행 후 결과: " + result);
return result;
}
}
ProceedingJoinPoint는 JoinPoint의 기능을 확장하여, joinPoint.proceed()로 메소드를 실행하거나 중단할 수 있습니다.proceed() 메서드는 실제 메소드를 실행하며, 그 결과를 반환합니다.패키지명 + 클래스명: com.example.service.UserService
메소드명: getUserById
매개변수들: 1234 JohnDoe
메소드 실행 후 결과: User{ id=1234, name='JohnDoe' }
ProceedingJoinPoint는 메소드의 실행을 제어할 수 있기 때문에, 메소드 실행 전후에 추가적인 처리를 하거나 메소드 실행을 취소할 수 있습니다.
JoinPoint와 ProceedingJoinPoint 비교| 특성 | JoinPoint | ProceedingJoinPoint |
|---|---|---|
| 사용 가능한 어노테이션 | @Before, @After, @AfterReturning, @AfterThrowing | @Around |
| 메소드 실행 제어 | 메소드 실행 전 정보만 제공 | 메소드 실행을 제어 (proceed() 메서드 사용) |
| 메소드 실행 결과 가져오기 | 불가능 | joinPoint.proceed()를 통해 결과를 가져올 수 있음 |
| 예시 | @Before에서 사용 | @Around에서 사용 |
JoinPoint는 주로 메소드 실행 전의 정보를 얻는 데 사용되며, 실행을 제어하지 않습니다.ProceedingJoinPoint는 메소드 실행을 제어하고, 결과를 반환받을 수 있는 객체로 @Around 어노테이션에서 사용됩니다.JoinPoint: 메소드 실행 정보를 가져오며, 실행을 제어할 수 없습니다. @Before, @After에서 주로 사용됩니다.ProceedingJoinPoint: JoinPoint의 확장판으로 메소드 실행을 제어하고, 메소드 실행 전후로 동작을 삽입할 수 있습니다. @Around에서만 사용 가능합니다.둘의 차이를 이해하고 필요한 어노테이션과 상황에 맞게 사용하시면 됩니다! 🚀